第 2 回 なになにといえばこれこれ レポート課題 氏名:森桂太 学籍番号:c110190 語学クラス:中国語 コース(系):社会福祉コース 1.筆記問題 ・一つ目の表し方 animal["シマウマ"] = "縞模様" animal["クジラ"] = "長いヒゲ" animal["キリン"] = "長い首" animal["カンガルー"] = "袋" animal["ガゼル"] = "鋭い角" ・二つ目の表し方 animal{"シマウマ" => "縞模様", "クジラ" => "長いヒゲ","キリン" => "長い首","カンガルー" => "袋","ガゼル" => "鋭い角",} 2.計算問題 a. 0d 2011 = 0x ?? A. 二進数11111011010 十六進数7da b. 0d 2010 = 0b ?? A. 二進数11111011011 十六進数7db 3.作ったプログラム設定 A.プログラムに登録してある対を全て表示するプログラム B.ユーザが知りたい情報だけを結果表示するプログラム C.知りたい情報が出てこない場合に、ユーザに対を登録させ、 登録した結果を 出力するプログラム 4.作成したプログラム プログラムA #!/usr/koeki/bin/ruby $KCODE = 'e' shop = Hash.new shop["押し麦"] = 250 shop["あわ"] = 180 shop["ひえ"] = 130 shop["玄米"] = 200 shop["黒ごま"] = 230 shop["白ごま"] = 150 p shop print("商品と価格を入力してください(Ctrl-D で終了)\n") while true printf("商品を入力してください: \n") item = gets if item == nil break else item = item.chomp end printf("価格を入力: \n") shop[item] = gets.chomp.to_i end STDERR.print("入力終了 \n") p shop プログラムB #!/usr/koeki/bin/ruby $KCODE = 'e' item = Hash.new("非取扱商品") item["押し麦"] = 250 item["あわ"] = 180 item["ひえ"] = 130 item["白ごま"] = 150 STDERR.print("購入する品物:") customer = gets.chomp if item.key?(customer) == false printf("%s はありません\n", customer) printf("%s は %s です。\n",customer,item[customer] ) else STDERR.print("購入する重量:") weight = gets.chomp.to_f price = item[customer] / 100.0 * weight printf("%s\t(%5.1f グラム)\t %d 円\n", customer,weight,price ) end プログラムC #!/usr/koeki/bin/ruby shop = {"押し麦"=>250, "あわ"=>180, "ひえ"=>130, "きび"=>210, "クコの実"=>230, "そばの実"=>170, "白ごま"=>150, "黒ごま"=>150, "玄米"=>300, "七分付き"=>400, "白米"=>650, "干し椎茸"=>620,} while true for item, price in shop printf("%s\t%d\n", item, price) end STDERR.print("購入する品物:\n") item = gets.chomp if shop.key?(item) == false shop[item] = "非取扱い商品" printf("%sは%sです\n\n",item, shop[item]) $KCODE = 'e' printf"%sの価格を決めて下さい。\n",item printf("価格を入力: \n") shop[item] = gets.chomp.to_i STDERR.print("入力終了 \n\n") redo end STDERR.print("購入する重量:\n") weight = gets.chomp.to_f printf("%s\t(%5.0f グラム)\t%4.0f円\n",item, weight, shop[item] * weight / 100) 5.プログラム説明 ・プログラムA shop["商品名"] = 値段 であらかじめ作っていた商品データを、 p shop で全てを表 示させる。この場合、"商品名" = 値段 が対となる。 全体の商品を確認した後に、 print("商品と価格を入力してください(Ctrl-D で終了)\n") で商品の価格と値 段をつけ、 while true で繰り返し入力させる。 printf("商品を入力してください: \n") で商品名を入力させ、 if item == nil でもし、商品が無い場合 break で終わらせる。 STDERR.print("入力終了 \n") の後に p shop で、全てを表示させる。 ・プログラムB item["商品名"] = 値段 とあらかじめ商品データを用意。 STDERR.print("購入する品物:") を入力させる。 if shop.key?(item) == false で入力した商品はありますか?と尋ね、無い場合 printf("%s はありません\n", customer) printf("%s は %s です。\n",customer,item[customer] ) item = Hash.new("非取扱商品") により、〜は無いため、"非取扱商品です。"と表示。 商品がある場合 STDERR.print("購入する重量:")weight = gets.chomp.to_f price = item[customer] / 100.0 * weight により、重さを数字入力するよう指 示し、小数第一まで表示させる。 ・プログラムC shop = {"商品名"=>値段, をあらかじめ幾つかの商品を作ってをく。 for item, price in shop printf("%s\t%d\n", item, price) end で item = 商品 price = 値段 を繰り返し入力させるよう設定、 STDERR.print("購入する品物:\n") で入力した商品がなかった場合、 if shop.key?(item) == false shop[item] = "非取扱い商品" printf("%sは%sです\n\n",item, shop[item]) と設定し、もし商品がない物は、 "非取扱い商品" と表示させる。あった場合、STDERR.print("入力終了 \n\n") redo で繰り返しを終え、次の項目に進ませる。 STDERR.print("購入する重量:\n") printf("%s\t(%5.0f グラム)\t%4.0f円\n",item, weight, shop[item] * weight / 100) で、重さ、商品の値段を表示させる。 6.もとにしたプログラムからの変更点 ・プログラムAの、もとにしたプログラムからの変更点は、授業で作った hash_add.rbを基に、 shop[""] = 値段 の項目を追加。 ・プログラムBの、もとにしたプログラムからの変更点は、授業で作った hash_item.rbを基に、 printf("%s\t(%5.1f グラ ム)\t %d 円\n",customer,weight,price )end から以下の、print("本日の高値: ") を示すプログラムを省略。 ・プログラムCの、もとにしたプログラムからの変更点は、 授業で作った、 hash_item.rbを基に、shop[""] = 値段 の項目を追加と("価格入力: ") の追加。 7.プログラム実行結果 ・プログラムA pan{MORI Keita}% ./hash_for.rb\ [~/Ruby] {"白ごま"=>150, "押し麦"=>250, "玄米"=>200, "黒ごま"=>230, "ひえ"=>130, "あわ"=>180} 商品と価格を入力してください(Ctrl-D で終了) 商品を入力してください: 白ごま 価格を入力: 150 商品を入力してください: 押し麦 価格を入力: 300 商品を入力してください: 玄米 価格を入力: 600 商品を入力してください: 入力終了 {"白ごま"=>150, "押し麦"=>300, "玄米"=>600, "黒ごま"=>230, "ひえ"=>130, "あわ"=>180} pan{c110190}% ./hash_for.rb\ [~/Ruby] {"白ごま"=>150, "押し麦"=>250, "玄米"=>200, "黒ごま"=>230, "ひえ"=>130, "あわ"=>180} 商品と価格を入力してください(Ctrl-D で終了) 商品を入力してください: aaa 価格を入力: ./hash_for.rb :33: private method `chomp' called for nil:NilClass (NoMethodError) pan{MORI Keita}% ./hash_for.rb\ [~/Ruby] {"白ごま"=>150, "押し麦"=>250, "玄米"=>200, "黒ごま"=>230, "ひえ"=>130, "あわ"=>180} 商品と価格を入力してください(Ctrl-D で終了) 商品を入力してください: aaa 価格を入力: 300 商品を入力してください: fff 価格を入力: 400 商品を入力してください: qqq 価格を入力: 商品を入力してください: 入力終了 {"aaa"=>300, "白ごま"=>150, "押し麦"=>250, "玄米"=>200, "qqq"=>0, "fff"=>400, "黒ごま"=>230, "ひえ"=>130, "あわ"=>180} ・プログラムB pan{c110190}% ./hash_choice.rb\ [~/Ruby] 購入する品物:押し麦 購入する重量:600 押し麦 (600.0 グラム) 1500 円 pan{c110190}% ./hash_choice.rb\ [~/Ruby] 購入する品物:aaa aaa はありません aaa は 非取扱商品 です。 ・プログラムC pan{c110190}% ./hash_register2.rb [~/Ruby] 白ごま 150 きび 210 そばの実 170 押し麦 250 玄米 300 黒ごま 150 干し椎茸 620 ひえ 130 クコの実 230 白米 650 七分付き 400 あわ 180 購入する品物: 雑穀 雑穀は非取扱い商品です 雑穀の価格を決めて下さい。 価格を入力: 300 入力終了 白ごま 150 きび 210 そばの実 170 押し麦 250 玄米 300 黒ごま 150 干し椎茸 620 ひえ 130 雑穀 300 クコの実 230 白米 650 七分付き 400 あわ 180 購入する品物: 砂糖 砂糖は非取扱い商品です 砂糖の価格を決めて下さい。 価格を入力: 1000 入力終了 白ごま 150 きび 210 そばの実 170 押し麦 250 砂糖 1000 玄米 300 黒ごま 150 干し椎茸 620 ひえ 130 雑穀 300 クコの実 230 白米 650 七分付き 400 あわ 180 購入する品物: ひえ 購入する重量: 750 ひえ ( 750 グラム) 975円 8.考察 ・プログラムAは、全体の item = 商品 を表示させ、存在する商品を選択し値段を入力し 、(Ctrl-D で終了) をするともう一度商品全体が表示され、値段表示が変わっていた。 しかし、存在しない商品や、値段を入力しなかった場合、エラーが発生することがわか った。 ・プログラムBは、自分が知りたい商品名を入力し、もしデータがあるならば、重量と値 段についての結果が出たが、ない場合は非取扱商品と表示され、終了する事がわかった 。 ・プログラムCは、元からあるデータに、もし知りたい商品データがない場合、新に加え ていく事がわかりました。また、既に存在する商品は、重量と値段の表示をさせ、終了 することが分かった。 9.参考文献 西村先生の講義目次全般 http://roy/~madoka/2011/r2/02/ 神田先生の講義目次 http://roy/~naoya/ruby/6.html http://roy/~naoya/ruby/9.html 10.感想 友人にも大変協力してもらいましたが、西村先生の講義目次を見れば大体が上手 くできました。