提出課題:03回目レポート
本文:
�� Ruby菓子舗、お菓子
�� 4番まで
��
1. #!/usr/koeki/bin/ruby
2. # -*- coding: utf-8 -*-
3.
4. total = 0
5.
6. kasi = Hash.new(0)
7.
8. open("kasi.csv","r:utf-8") do |data|
9. while line = data.gets
10. if /(\S+)\s+(\d+)\s+(\d+)/ =~ line
11. kasi[$1] = [$2.to_i,$3.to_i]
12. end
13. end
14. end
15.
16. while true
17. print "何を買いますか?(買わない場合はexit)\n"
18. for goods in kasi.keys
19. printf("%s ",goods)
20. end
21. print"\n"
22.
23. kau = gets.chomp!
24. money = kasi[kau]
25.
26. if kau == "exit"
27. break
28. end
29.
30. if money == 0
31. printf("「%s」のデータはありません\n", kau)
32. redo
33. else
34. printf("「%s」の値段は%d円です\n", kau, money[0])
35. end
36.
37. print "何個買いますか?\n"
38. kosuu = gets.chomp!.to_i
39.
40. if kosuu > money[1]
41. printf("ごめんなさい、「%s」の在庫は残り%d個しかないです。他の数量でお願いします。\n",kau,money[1])
42. redo
43. end
44.
45. money[1] -= kosuu
46.
47. goukei = money[0] * kosuu
48. printf("合計%d円です。\n",goukei)
49.
50. total += goukei
51.
52. end
53.
54.
55. printf("全体の合計の値段は%d円です。お買い上げありがとうございます。\n",total)
(CSVファイルの中身)
あめ 20 50
チョコ 100 20
わたあめ 250 10
ドーナツ 150 10
セラミド3兄弟 800 3
せんべい 50 20
ウエハース 120 20
おやつラーメン 30 10
ゼリー 20 20
グミ 130 5
�げ燭鯒磴い泙垢�?(買わない場合はexit)
あめ チョコ わたあめ ドーナツ セラミド3兄弟 せんべい ウエハース おやつラーメン ゼリー グミ
あめ
「あめ」の値段は20円です
何個買いますか?
5
合計100円です。
何を買いますか?(買わない場合はexit)
あめ チョコ わたあめ ドーナツ セラミド3兄弟 せんべい ウエハース おやつラーメン ゼリー グミ
あめ
「あめ」の値段は20円です
何個買いますか?
100
ごめんなさい、「あめ」の在庫は残り45個しかないです。他の数量でお願いします。
何を買いますか?(買わない場合はexit)
あめ チョコ わたあめ ドーナツ セラミド3兄弟 せんべい ウエハース おやつラーメン ゼリー グミ
あめ
「あめ」の値段は20円です
何個買いますか?
10
合計200円です。
何を買いますか?(買わない場合はexit)
あめ チョコ わたあめ ドーナツ セラミド3兄弟 せんべい ウエハース おやつラーメン ゼリー グミ
せんべい
「せんべい」の値段は50円です
何個買いますか?
5
合計250円です。
何を買いますか?(買わない場合はexit)
あめ チョコ わたあめ ドーナツ セラミド3兄弟 せんべい ウエハース おやつラーメン ゼリー グミ
あいす
「あいす」のデータはありません
何を買いますか?(買わない場合はexit)
あめ チョコ わたあめ ドーナツ セラミド3兄弟 せんべい ウエハース おやつラーメン ゼリー グミ
exit
全体の合計の値段は550円です。お買い上げありがとうございます。
�� 6行目、kasiが空のハッシュ変数であることを宣言。定義されていないkeyが指定された場合、valueとして()の中の値が返される。
8行目、openメソッドで「商品名、値段、在庫数」が書かれたcsvファイルを読み込み、dataに格納。
9行目、ファイルから順次読み込む。
10行目、正規表現。
11行目、正規表現にマッチさせ$1~で取り出し各ハッシュに代入。
18〜20行目、kasiというハッシュ変数のkeyの部分を順次goodsという変数に代入してゆき、表示する。このプログラムの場合keyは商品名の部分になる。
23行目、kauという変数に何を買うか、表示された商品名を入力してもらう。
24行目、moneyという変数にkasiのvalue(keyに結びつけられたデータ)を代入。
kasi[kau]のように、[]の中の文字と結びつけられる。例えばkauという変数にグミを入れていればkasi[グミ]となり、moneyにはグミに結びつけられたデータが入る。
26〜28行目、商品名を入力するときexitと入力した際、繰り返しから抜ける。
30〜35行目、moneyの値が0、つまり定義されていないkeyが指定された時に、「入力されたデータは存在しない」という事を表示。
それ以外の値で値段を表示。
40〜43行目、kosuuに入力された値がmoney[1](在庫数)より多かった場合、再入力を促す。money[1]というのは、valueのなかにはデータが2つ入っているため配列を用いることで、何個目のデータかを指定できる。
45行目、在庫は注文するたび減っていくためkosuuに入力された値ずつ引いていく。
47行目、その時に注文した合計金額を求める。money[0]はvalueの1番目のデータのことである。
50行目、最終的な合計金額を求める。
�� 5番以降が難しかった。ファイルの入出力をつかえば良いと考えたが、在庫数をピンポイントで変更するにはどうすればいいのかわからなかった。また挑戦してみたい。
添付:
ruby2-2-3.rb
kasi.csv