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番のプログラムの次回起動時に納品されたと通知するようにしたかったが、うまくいくプログラムが作れずになってしまって、少し悔しい。