def bmi(datum) return datum[3].to_f / (datum[2].to_f/100) / (datum[2].to_f/100) end
def search puts 'name? (just enter: view all)' name = Regexp.new(gets.chomp) name = /.+/ if name == // @data.each do |id,datum| if datum[0] =~ name then datum.each_with_index{|e,i| puts "#{TABLE[i]}:#{e}"} puts "BMI:#{"%0.1f" % bmi(datum)}" end end end
def add new = [] TABLE.each_with_index do |label,i| puts "#{label}?" new[i] = gets.chomp end @data[@data.size + 1] = new end # 続く
# 続き def edit id = get_id_prompt old = @data[id] new = [] TABLE.each_with_index do |label,i| puts "new #{label}? (default: #{old[i]})" input = gets.chomp if input.empty? then new[i] = old[i] else new[i] = input end end @data[id] = new end
def save File.open(DBFILE,'w'){|f| @data.each do |id,datum| f.puts datum.join(',') end } end # 続く
# 続き @data = {} File.open(DBFILE).readlines.each_with_index do |line,i| a = line.chomp.split(',') @data[i] = [a[0],a[1],a[2],a[3],a[4]] end puts MENU while choise = gets.chomp do case choise.to_i when 0; save; exit when 1; search when 2; add when 3; edit when 9; exit else # do nothing end puts MENU end # ===== 終了 =====
>>972 > テキストはこんな感じでおねがいします。 ってのを最大限好意的に解釈して、以下独自仕様 ・氏名以外の値に全角文字使用不可。 ・データは氏名、血液型、年齢、身長、体重を空白区切り、一行で入力。 ・氏名は氏、名に分割されない。間に空白等あれば、それも氏名に含む。 ・血液型は A B O AB のみ入力値として認める。 ・年齢、身長、体重は数値のみ入力値として認める。 ・入力したデータは自動的には保存されない事に注意。 以上
class Database < Hash DATAFILE = 'kojin.txt' def initialize ; load ; end def insert(datastr) data = parse(datastr) self[data[0]] = data end def save open(DATAFILE,'w') do |f| self.each {|k,v| f.puts(v.join(' ')) } end end def load return unless File.exist?(DATAFILE) open(DATAFILE) do |f| f.each {|l| self.insert(l.chomp) } end end def parse(datastr) if datastr =~ /^(.*)\s+(A|B|O|AB)\s+(\d+)\s+(\d+)\s+(\d+)\s*$/ return [$1,$2,$3,$4,$5] else raise 'データエラー' end end end
db = Database.new mode = nil while true begin case mode when nil mode = input('1:検索 2:追加(訂正) 3:削除 S:保存 Q:終了') next when '1' then display(db[input('氏名を入力してください')]) when '2' then db.insert(input('追加(訂正)するデータを入力してください')) when '3' then db.delete(input('削除する氏名を入力してください')) when 'S','s' then db.save when 'Q','q' then exit when 'l' then puts db.keys end rescue puts $! end mode = nil end