店舗名: テリヤキング 取り扱い商品: ポテト(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