店舗名: テリヤキング
取り扱い商品: ポテト(S,M,L)
ハンバーガー
チーズバーガー
ダブルチーズバーガー
テリヤキバーガー
ナゲット(S,L)
ジュース
何番まで実施したか: 6
作成したプログラム:
#!/usr/koeki/bin/ruby
#coding : utf-8
pay = 0
income = 20
stock = []
tojo = Hash.new("取り扱っておりません。\n")
open("ruby2-2.txt","r:utf-8") do |menu|
while line = menu.gets
if /(\S+)\s+(\d+)\s+(\d+)/ =~ line
zaiko = $3.to_i
if zaiko <= 5
printf("%sの在庫が少ないため%d個入荷しました。\n",$1,income)
zaiko += income
tojo[$1] = [$2.to_i , zaiko]
next
end
tojo[$1] = [$2.to_i , $3.to_i]
end
end
end
while true
for name in tojo.keys
printf("%s\n", name)
end
print"\n"
print"購入したい商品名を入れて下さい。\n"
order = gets.chomp
if tojo.key?(order) == false
print"その商品は取り扱っておりません。"
redo
else
print"購入したい個数を入力して下さい。\n"
many = gets.chomp.to_i
stock = tojo[order]
if stock[1] < many
print"在庫がございません"
redo
else
nokori = stock[1] - many
stock[1] = nokori
pay += (stock[0]*many)
end
printf("現在のお支払い金額は%d円です。\n",pay)
print"購入をつづけますか?(yes;no)\n"
ans = gets.chomp
if ans == "no"
break
end
end
end
printf("お支払い金額は%d円になります。\n", pay)
open("ruby2-2.txt","w") do |a|
for read , data in tojo
result = sprintf("%s %d %d\n",read, data[0], data[1])
a.puts result
end
end
実行結果:
./ruby2-2.rb [~/Ruby]
ポテトS
ポテトM
ポテトL
ハンバーガー
チーズバーガー
ダブルチーズバーガー
ナゲットS
ナゲットL
テリヤキバーガー
ジュース
購入したい商品名を入れて下さい。
ジュース
購入したい個数を入力して下さい。
50
現在のお支払い金額は8000円です。
購入をつづけますか?(yes;no)
no
お支払い金額は8000円になります。
==二回目(ジュースの在庫を初期で50に設定していたため。)==
./ruby2-2.rb [~/Ruby]
ジュースの在庫が少ないため20個入荷しました。
ポテトS
ポテトM
ポテトL
ハンバーガー
チーズバーガー
ダブルチーズバーガー
ナゲットS
ナゲットL
テリヤキバーガー
ジュース
購入したい商品名を入れて下さい。
==以下省略==
プログラムの説明:
openメソッドを使用することで、商品名、価格、在庫を入力したtxtファイルを
読み込み、正規表現を利用して、商品名を"tojo"というハッシュkeyに、価格在庫を
そのvalueに一行づつ入力していく。そうすることで一つの商品名に対して、価格と在庫
をそれぞれ呼び出すことができるようになる。
また、起動時に、在庫部分にあたる数値が5以下になる場合、メッセージを表示
し、在庫に20つけ足すようにした。
その後for文を利用し、ハッシュtojoのkey部分に入っている商品名を書き出すよ
うに設定した。
商品名を入力されたのちに、入力された物をorder変数に代入し、if文の条件判
定にtojo.key?(order)==falseとすることで、ハッシュに入っていない入力を弾
き、redoで処理のやりなおしを行うように設定した。
正しい入力だった場合、購入個数を入力させ、many変数にto_iして代入する。
stockという空配列に"tojo[order]"(購入したい商品名のvalue部分)を代入し、
stock[1](在庫)が購入個数よりも少ない場合在庫が無いことを表示し、redoする。
在庫が足りている場合、stock[1]から購入個数分を減算し、上書きする。
そして、pay変数にstock[0](価格)と個数を乗算したものを足していく。
購入をつづけるかどうかを表示し、noだった場合breakで繰り返し処理から抜け、
最終的な購入金額を表示する。
最後にopenメソッドの書き込みモードで同じtxtファイルを開き、for文を使い
result変数にハッシュtojoの中身をsprintfを利用して代入し、a.putsでtxtファ
イル内に書き出す。これにより購入後の在庫状況を保存し、次回起動時に持ち越
すことが可能になる。
感想:ひさしぶりのプログラミングでopenメソッドの使い方や、ハッシュの使い
方にとまどう部分があったが、なんとか6番まで完成させることができた。
次回の内容をすこし取?り入れられたと思う。
予習復習をおこないよりよいプログラムを書けるように頑張っていきたい。
ruby2-2.txt
ポテトS 100 20
ポテトM 120 20
ポテトL 150 20
ハンバーガー 200 25
チーズバーガー 230 25
ダブルチーズバーガー 250 25
ナゲットS 150 20
ナゲットL 390 20
テリヤキバーガー 250 30
ジュース 160 0