講評: to_i method をつけるといいようです。 今のままでは、入力した文字列を、値段の数値分かけ算するような かたちになっているようです。 ---- 10月17日 第3回レポート 「Value が配列のとき」 C106XXXX XXXXXXXX XXXXX語 XXXX系 1. A. 国名とそれに関する順位を Hash 配列 country とした。 country の key を国名、value を国の面積,人口の世界順位と、公用語にとった。 その1 : key 「アメリカ合衆国」 value 「3, 3, "英語"」 その2 : key 「イギリス」 value 「76, 21, "英語"」 その3 : key 「中華人民共和国」 value 「4, 1, "中国語"」 その4 : key 「フランス」 value 「47, 20, "フランス語"」 その5 : key 「ロシア」 value 「1, 7, "ロシア語"」 ( 1 ) country["アメリカ合衆国"] = 3, 3, "英語" country["イギリス"] = 76, 21, "英語" country["中華人民共和国"] = 4, 1, "中国語" country["フランス"] = 47, 20, "フランス語" country["ロシア"] = 1, 7, "ロシア語" ( 2 ) country = {"アメリカ合衆国" => 3, 3, "英語" , "イギリス" => 76, 21,"英語 " , "中華人民共和国" => 4, 1, "中国語" ,"フランス" => 47, 20, "フランス 語" , "ロシア" => 1, 7, "ロシア語"} B. Miura Shiori (miura shiori) *小文字の場合 *大文字の場合 m → 6 D s → 7 3 M → 4 D S → 5 3 i → 6 9 h → 6 8 I → 4 9 H → 4 8 u → 7 5 i → 6 9 U → 5 5 I → 4 9 r → 7 2 o → 6 F R → 5 2 O → 4 F a → 6 1 r → 7 2 A → 4 1 R → 5 2 i → 6 9 I → 4 9 * 16進数 m → 0x 6d s → 0x 73 M → 0x 4d S → 0x 53 i → 0x 69 h → 0x 68 I → 0x 49 H → 0x 48 u → 0x 75 i → 0x 69 U → 0x 55 I → 0x 49 r → 0x 72 o → 0x 6f R → 0x 52 O → 0x 4f a → 0x 61 r → 0x 72 A → 0x 41 R → 0x 52 i → 0x 69 I → 0x 49 * 10進数に変換 *小文字の場合 (m) 0x 6d = 6 * 16 ** 1 + 13 * 16 ** 0 = 109 (i) 0x 69 = 6 * 16 ** 1 + 9 * 16 ** 0 = 105 (u) 0x 75 = 7 * 16 ** 1 + 5 * 16 ** 0 = 117 (r) 0x 72 = 7 * 16 ** 1 + 2 * 16 ** 0 = 114 (a) 0x 61 = 6 * 16 ** 1 + 1 * 16 ** 0 = 97 (s) 0x 73 = 7 * 16 ** 1 + 3 * 16 ** 0 = 115 (h) 0x 68 = 6 * 16 ** 1 + 8 * 16 ** 0 = 104 (o) 0x 6f = 6 * 16 ** 1 + 15 * 16 ** 0 = 111 m → 0d 109 s → 0d 115 i → 0d 105 h → 0d 104 u → 0d 117 i → 0d 105 r → 0d 114 o → 0d 111 a → 0d 97 r → 0d 114 i → 0d 105 *大文字の場合 (M) 0x 4d = 4 * 16 ** 1 + 13 * 16 ** 0 = 77 (I) 0x 49 = 4 * 16 ** 1 + 9 * 16 ** 0 = 73 (U) 0x 55 = 5 * 16 ** 1 + 5 * 16 ** 0 = 85 (R) 0x 52 = 5 * 16 ** 1 + 2 * 16 ** 0 = 82 (A) 0x 41 = 4 * 16 ** 1 + 1 * 16 ** 0 = 65 (S) 0x 53 = 5 * 16 ** 1 + 3 * 16 ** 0 = 83 (H) 0x 48 = 4 * 16 ** 1 + 8 * 16 ** 0 = 72 (O) 0x 4f = 4 * 16 ** 1 + 15 * 16 ** 0 = 79 M → 0d 77 S → 0d 83 I → 0d 73 H → 0d 72 U → 0d 85 I → 0d 73 R → 0d 82 O → 0d 79 A → 0d 65 R → 0d 82 I → 0d 73 参考 「2進数,16進数変換(2)」 http://roy/~madoka/2007/r1/04/04-12-binary2.html 「ASCIIコード」 http://roy/~madoka/2007/r1/05/05-03-ascii.html 2. mister Donutの商品とそれに関する情報を Hash 配列 sweet とした。 sweet の key を分類、value を商品名、価格[円]、カロリー[kcal]にとった。 その1 : key 「フレンチ」 value 「"フレンチクルーラー",115,185」 その2 : key 「ケーキドーナツ」 value 「"ホームカット",94,219」 その3 : key 「チョコ」 value 「"ダブルチョコレート",115,302」 その4 : key 「リッチドーナツ」 value 「"ハニーディップ",126,215」 その5 : key 「パイ」 value 「"アップルパイ",189,241」 sweet["フレンチ"] = "フレンチクルーラー",115,185 sweet["ケーキドーナツ"] = "ホームカット",94,219 sweet["チョコ"] = "ダブルチョコレート",115,302 sweet["リッチドーナツ"] = "ハニーディップ",126,215 sweet["パイ"] = "アップルパイ",189,241 ○○データ参考○○ ミスタードーナツ公式サイトより http://www.misterdonut.jp/ a.設定 データから読みこんできて、表示するプログラム b.プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する sweet = Hash.new # Hash 配列を sweet と定義する print("フレンチクルーラー\n\n") # 商品 sleep 1 # 待機時間の指定 print("ホームカット\n\n") sleep 1 print("ダブルチョコレート\n\n") sleep 1 print("ハニーディップ\n\n") sleep 1 print("アップルパイ\n\n") sleep 1 print("現在の取扱い商品は以上です。\n\n") sleep 2 while donut = gets # while-if-end くりかえし if /(\S+)\s+(\S+)\s+(\d+)\s+(\d+)/ =~donut # 正規表現 sweet[$1] = [$2,$3,$4.to_i] end # if の end end # while の end for cake,donut in sweet printf("%-15s 系の %-202s は %-5d 円で %d kcal です。\n",cake,donut[0],donut[1],donut[2]) end ○データ○ フレンチ フレンチクルーラー 115 185 ケーキドーナツ ホームカット 94 219 チョコ ダブルチョコレート 115 302 リッチドーナツ ハニーディップ 126 215 パイ アップルパイ 189 241 c.実行結果 irsv{c106175}% ./hash-for_a.rb sweet.dat [~/Ruby] フレンチクルーラー ホームカット ダブルチョコレート ハニーディップ アップルパイ 現在の取扱い商品は以上です。 パイ 系の アップルパイ は 189 円で 241 kcal です。 ケーキドーナツ 系の ホームカット は 94 円で 219 kcal です。 フレンチ 系の フレンチクルーラー は 115 円で 185 kcal です。 チョコ 系の ダブルチョコレート は 115 円で 302 kcal です。 リッチドーナツ 系の ハニーディップ は 126 円で 215 kcal です。 d.参考 「データを切り取るには」 http://roy/~madoka/2007/r2/03/03-02-review_cut.html ■最後に表示されるデータを見やすくするために揃えようとしたが、文字数がバ ラバラなので少し手間取った。いろいろと試行錯誤してなんとか見やすくなった と思う。 a.設定 数値を計算するプログラム b.プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する sweet = Hash.new # Hash 配列を sweet と定義する while donut = gets if /(\S+)\s+(\S+)\s+(\d+)\s+(\d+)/ =~donut sweet[$1] = [$2,$3.to_i,$4.to_i] end end print("合計金額とカロリ−を計算します\n") print("いくつ買いますか??\n") kosuu = gets.chomp # 購入数 for cake,donut in sweet nedan = kosuu * donut[1] # 購入数 * ドーナツの値段 kal = kosuu * donut[2] # 購入数 * ドーナツのカロリ− printf("%s系の %s は合計 %d 円で %d kcal になります!\n",cake,donut[0],nedan,kal) end ■欲しいドーナツの数を入力して、合計カロリ−も計算するプログラムを作ろう としたけれど、最後まで完成することができませんでした。 nedan = kosuu * donut[1] # 購入数 * ドーナツの値段 kal = kosuu * donut[2] # 購入数 * ドーナツのカロリ− がおかしいみたいですが、考えていじっくるたびにどんどん意味不明になりまし た。実行結果も貼り付けます。すごくびっくりしました。 c.実行結果 irsv{c106175}% ./hash-array-calc.rb sweet.dat [~/Ruby] 合計金額とカロリ−を計算します いくつ買いますか?? 3 パイ系の アップルパイ は合計 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 円で 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 kcal になります! ケーキドーナツ系の ホームカット は合計 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 円で 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 kcal になります! フレンチ系の フレンチクルーラー は合計 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 円で 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 kcal になります! チョコ系の ダブルチョコレート は合計 3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 円で 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 kcal になります! リッチドーナツ系の ハニーディップ は合計 333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 円で 33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 kcal になります! 3.感想 Aの配列を考える作業はもう滞りなく作れるし、進数変換も時間はかかってしま うけど、正確に答えを導き出せるようになった。 2の最初のプログラムも少し余裕が出てきて、見やすいように手を加えたりもで きるようになったが、二つ目の計算するプログラムは途中で断念してしまった。 こうしたら良いのではないか、こうすれば計算できるのではないか、と発想ま では出来るのにプログラム完成までのが到らなかったのが悔しかった。