講評: printf で結果を書きこむときに \t をはさむと良かったですね。 --- 10 月 10 日 第 2 回レポート 「Hash 配列」 学籍番号: c106XXXX 氏名: XXXXXXXX 語学クラス: XXXX語 系: XXXX系 1. 部活を hash 配列 seisyun としました。 seisyun の key と value はそれぞれ活動名と使用するものにとりました。 ○1○ key 「バスケット部」 に対して value は「バスケットボール」 ○2○ key 「写真部」に対して value は 「カメラ」 ○3○ key 「茶道部」に対して value は 「抹茶」 ○4○ key 「剣道部」に対して value は 「竹刀」 ○5○ key 「美術部」に対して value は 「絵筆」 2. ○0d 1022 = 0x4160 1 * 16の3乗 + 0 * 16の2乗 + 2 *16の1乗 + 2 * 16の0乗 = 4096 + 32 * 2 = 4160 ○0d 1022 = 0b500000 4160/2 2080.00000000000000000000 2080/2 1040.00000000000000000000 1040/2 520.00000000000000000000 520/2 260.00000000000000000000 260/2 130.00000000000000000000 130/2 65.00000000000000000000 65/2 32.50000000000000000000 32/2 16.00000000000000000000 16/2 8.00000000000000000000 8/2 4.00000000000000000000 4/2 2.00000000000000000000 2/2 1.00000000000000000000 1/2 .50000000000000000000 3.●1● a.考えた設定 料理で使う調味料を使ってプログラムを作成しました。 b.作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' shop = Hash.new("非取扱商品") # Hash 配列を shop と定義する shop["小麦粉"] = 250 shop["卵"] = 180 shop["片栗粉"] = 200 shop["バニラエッセンス"] = 210 shop["酢"] = 230 shop["砂糖"] = 170 shop["塩"] = 40 shop["味噌"] = 30 shop["お酒"] = 10 shop["胡椒"] = 40 shop["牛乳"] = 500 shop["生クリーム"] = 300 #p shop STDERR.print("購入する品物:\n") ryouri = gets.chomp STDERR.print("購入する重量:\n") weight = gets.chomp.to_f if shop.key?(ryouri) == false printf("%sは%sです\n",ryouri,shop[item]) else printf("%s\t(%5.0f グラム)\t%4.0f円\n",ryouri,weight,shop[ryouri] * weight / 100) end c.もとにしたプログラムからの変更点 変数を ryouri にした。 d.実行画面 irsv{c106052}% ./hash-for.rb [~/Ruby] 購入する品物: 小麦粉 購入する重量: 4300 小麦粉 ( 4300 グラム) 10750円 e.考察 irsv{c106052}% bc -l [~/Ruby] 250 /100 *4300 10750.00000000000000000000 よって計算ミスは無い。 f.参考文献 まどか先生のホームページ。 ●2● a.考えた設定 取引商品と金額を入力すると高額順に並んで出てくる。 b.作成したプログラム #!/usr/koeki/bin/ruby shop = Hash.new("非取扱い商品") printf("本日の取引商品を入力してください。\n") printf("終了は Ctrl-D です。\n") while true STDERR.print("取引商品名:\n") syouhin = gets if syouhin == nil # Ctrl-D が押された時点で終了 then break else syouhin = syouhin.chomp # 文字が入力されるとGetする end printf("本日の価格を入力してください。\n") STDERR.print("100グラムあたりの価格:") price = gets.chomp.to_i # 価格をGetする shop[syouhin] = price end STDERR.print("入力終了です。 \n") $KCODE = 'e' # 漢字コードは EUC で # p shop for syouhin,price in shop printf("%s\t%s円\n",syouhin,price) end # p shop.keys.sort.reverse # p shop.valuse.sort.reverse print("高額商品順に並べます。\n") shop.keys.sort{ |prim,sorted| shop[prim] <=> shop[sorted] }.reverse.each{ |syouhin| printf("%s\t%s円\n", syouhin,shop[syouhin]) } c.プログラムの変更点 変数を syouhin にした。 d.実行画面 irsv{c106052}% ./hash-register.rb [~/Ruby] 本日の取引商品を入力してください。 終了は Ctrl-D です。 取引商品名: 卵 本日の価格を入力してください。 100グラムあたりの価格:450 取引商品名: 小麦粉 本日の価格を入力してください。 100グラムあたりの価格:1000 取引商品名: 塩 本日の価格を入力してください。 100グラムあたりの価格:300 取引商品名: 入力終了です。 小麦粉 1000円 塩 300円 卵 450円 高額商品順に並べます。 小麦粉 1000円 卵 450円 塩 300円 e.考察 きちんと高額順に並んでいる。 f.参考文献 まどか先生のホームページ。 4. a.考えた設定 単語を入力すると、データのファイルに勝手に保存してくれるプログラムを考 えた。 b.作成したプログラム #!/usr/koeki/bin/ruby word = Hash.new printf("単語を登録します。\n") printf("終了はCtrl-Dです。\n") printf("単語を入力してください。\n") while true STDERR.print("単語:") unknown_tango = gets if unknown_tango == nil then break end unknown_tango.chomp! printf("意味を入力してください。\n") STDERR.print("意味:") imi = gets.chomp! word[unknown_tango] = imi end STDERR.print("入力終了\n") $KCODE = 'e' p word open ("words.dat","a+") do |output| output.printf("%s\t\n",word) end c.もとにしたプログラムからの変更点 Hash を word とした。単語を入力する場面での変数は tango 、意味の入力 では imi とした。 d.実行結果 irsv{c106052}% ./wordbook.rb [~/Ruby] 単語を登録します。 終了はCtrl-Dです。 単語を入力してください。 単語:昼食 意味を入力してください。 意味:昼ご飯 単語:入力終了 {"昼食"=>"昼ご飯"} irsv{c106052}% cat words.dat [~/Ruby] 昼食昼ご飯 irsv{c106052}% ./wordbook.rb [~/Ruby] 単語を登録します。 終了はCtrl-Dです。 単語を入力してください。 単語:財布 意味を入力してください。 意味:お金をいれておくもの 単語:入力終了 {"財布"=>"お金をいれておくもの"} irsv{c106052}% cat words.dat [~/Ruby] 昼食昼ご飯 財布お金をいれておくもの e.考察 open - end を使ったことにより、データを開くことができた。また「a+」と したことで次々に保存された。 f.参考文献 まどか先生のホームページとアドバイス。先輩のわかりやすいレポート。 クイズを出すプログラムは作り方が分かりませんでした…。データを噛ませた プログラムなのではないかというところまでは考えられました。 5.感想 まだほとんど忘れている状態だったので、友だちと手探り状態でレポートを完 成させた。やはり先生のホームページ、アドバイス、先輩のレポートが参考になった。 次はもっと思い出して応用問題などにも挑戦したい。