1.店舗名・取扱商品 店舗名:SS(stench shop) 取扱商品:臭豆腐・キビヤック・納豆・ホンオフェ・ドリアン・くさや・エピキュアーチーズ・にんにく・沢庵・シュールストレミング 2.何番まで作成したか 6番まで 3.作成したプログラム #!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- sum = 0 item = Hash.new(0) print "SS(stench shop)へようこそ!!\n" open("ruby3.txt","r:utf-8") do |n| while line = n.gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ line item[$1] = [$2, $3] end end while true print "何をご所望ですか?(終了はq)\n" for name, data in item printf("%s ",name) end print"\n" what = gets.chomp! if what == "q" break end stench = item[what] nedan = item[what][0].to_i if stench == 0 printf("こちらの商品はありません\nやり直してください\n") redo end print "これを何個をご所望ですか?\n" co = gets.chomp!.to_i if co > item[what][1].to_i printf("すみませんこちらの商品はその個数取り扱っていません\n") redo end kinngaku = item[what][0].to_i * co sum += kinngaku kosuu = item[what][1].to_i - co if kosuu <= 10 kosuu += 12 open("ruby3.txt","a:utf-8") do |w| printf("在庫が少なくなったので、%-12sを12個発注しました。\n ", what) w.printf("%-12s \t %-6d \t %-4d\n", what, nedan, kosuu) end else open("ruby3.txt","a:utf-8") do |w| w.printf("%-12s \t %-6d \t %-4d\n", what, nedan, kosuu) end end end end if sum > 0 printf("合計は%s円になります。\n", sum) end 4.プログラムの実行結果 joy{c122xxx}% ./ruby3.rb [~/program] SS(stench shop)へようこそ!! 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング あ こちらの商品はありません やり直してください 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング にんにく これを何個をご所望ですか? 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング q joy{c122xxx}% ./ruby3.rb [~/program] SS(stench shop)へようこそ!! 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング にんにく これを何個をご所望ですか? 50 在庫が少なくなったので、にんにく を12個発注しました。 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング 納豆 これを何個をご所望ですか? 30 すみませんこちらの商品はその個数取り扱っていません 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング シュールストレミング これを何個をご所望ですか? 10 在庫が少なくなったので、シュールストレミング を12個発注しました。 何をご所望ですか?(終了はq) 臭豆腐 キビヤック 納豆 ホンオフェ ドリアン くさや エピキュアーチーズ にんにく 沢庵 シュールストレミング q 合計は14500円になります。 5.プログラムの説明 1番は、ハッシュの中身を決めた商品名と値段に変更して、それを計10個記載した。getメソッドで購入したいものと値段を入れるためにそれぞれをcoやwhatの変数に分けて最後に、値段と購入個数をかけて表示させた。 2番は、個数を入力される前に実際に入力された商品名がハッシュの中にあるかifで判定して、ない場合は、ありませんと表記して、redoでその回の初めからやり直すようにした。 3番は、何回も繰り返せるようにwhile-endで繰り返しの表現をし、特定の条件(商品を選ぶときにqを入力されたとき)でbreakするようにした。 4番は、入力された商品の在庫数までしか購入できないようにするため、「item[what][1].to_i」のように入力された商品のハッシュの1番目のデータを数字に変換して、入力された個数より大きいかどうかifで判別した。また、.to_iをつけないと文字の在庫数としてつかわれるため、.to_iをつけている。 5番は、ハッシュを別のテキストファイルに記載しなおして、そのファイルからopenメソッドで読み込み、1回の繰り返しの中の最後にテキストファイルに在庫数から購入数を引いた値をopenメソッドで追加で書き込むようにした。ちなみに、なぜ追加するのかというとハッシュは同じkeyの場合最後のデータが参照されるため、新しく書き込むほうは今回使用しなかった。 6番は、商品の購入が確定したつまり繰り返しが一回終了するまえに、そのときの在庫数がある一定数以下になったときに、〇個追加するようにifで場合分けし、もし少ないときは在庫数に+=で加算して、5番で行った追加でファイルに書き込むプログラムを使用した。 6.感想 なかなか4番の在庫数以上購入できなくするプログラムをどうやってプログラムを書けばよいかわからず、かなり時間を使ってしまって、やり方がわかったとき、とても安心した。 6番のプログラムの次回起動時に納品されたと通知するようにしたかったが、うまくいくプログラムが作れずになってしまって、少し悔しい。