Ruby

課題レポート:【アルゴリズム】本を管理するアプリをつくってみよう!

課題

def input_book_info
  book = {}
  puts "本の名前を入力してください:"
  book[:name] = gets.chomp
  puts "本の値段を入力してください:"
  book[:price] = gets.to_i
  puts "出版社を入力してください:"
  book[:company] = gets.chomp
  books << book
end

def show_book_info(books)
  unless books.empty?
    books.each do |book|
      put "番号:[#{index}], 本の名前: #{book[:name]}"
      index += 1
    end

    puts "詳細を見る本の番号を入力してください:"
    input = gets.to_i
    book = books[input]

    puts "本の名前: #{book[:name]}\t|値段: #{book[:price]} 円\t|出版社: #{book[:company]}"
  else
    puts "本が登録されていません。"
end

def end_program
  puts "ご利用ありがとうございました"
  exit
end


books = []

while true do
  puts "登録された本の数:#{books.length}"
  puts "[0]:本の情報を入力する"
  puts "[1]:本の名前を一覧表示する"
  puts "[2]:プログラムを終了する"
  input = gets

  if input == 0
    input_book_info(books)
  elsif input == 1
    show_book_info(books)
  else
    end_program
  end
end

まず、エラー表示によりend抜けを推測、unlessに対するend抜けは素早く発見できたが、その後エラー表示がなくなるので困った。プログラムは一応走るが、[0]:本の情報を入力する [1]:本の名前を一覧表示する がelse扱いになっているので、input以下に間違いがあると当初推測していたが、gets.to_iの単純な記述不足であった。その後リタイアしてしまったが…
以下 def show_book_infoのindex = 0の定義づけの抜け、1行目の引数の記述不足、他、じっくり眺めればわかる問題だった。要注意。

解答

def input_book_info(books)
  book = {}
  puts "本の名前を入力してください:"
  book[:name] = gets.chomp
  puts "本の値段を入力してください:"
  book[:price] = gets.to_i
  puts "出版社を入力してください:"
  book[:company] = gets.chomp
  books << book
end

def show_book_info(books)
  unless books.empty?
    index = 0
    books.each do |book|
      puts "番号:[#{index}], 本の名前: #{book[:name]}"
      index += 1
    end

    puts "詳細を見る本の番号を入力してください:"
    input = gets.to_i
    book = books[input]

    puts "本の名前: #{book[:name]}\t|値段: #{book[:price]} 円\t|出版社: #{book[:company]}"
  else
    puts "本が登録されていません。"
  end
end

def end_program
  puts "ご利用ありがとうございました"
  exit
end


books = []

while true do
  puts "登録された本の数:#{books.length}"
  puts "[0]:本の情報を入力する"
  puts "[1]:本の名前を一覧表示する"
  puts "[2]:プログラムを終了する"
  input = gets.to_i

  if input == 0
    input_book_info(books)
  elsif input == 1
    show_book_info(books)
  else
    end_program
  end
end