講評: 頑張りました。 printf("%s" , menu) を増やしておくとよいのではないでしょうか。 ---- 10 月 17 日 第 3 回レポート 「Value が配列のとき」 学籍番号 :C106XXXX 氏名 :XXXXXXXX 語学クラス:XXXXX語 XX 系 : XXXX系 1、 A 各店ラーメンについての hash 配列 noodle としました。 noodle の key と value はそれぞれ各店のお薦めラーメンとその値段(大盛)、(並)と、店の名前にとりました。 その 1: key 「豚肉細切りラーメン」に対して valueは「800,780, "桃圜"」 その 2: key 「とびうおラーメン」に対して valueは「720,700, "味好"」 その 3: key 「しおラーメン」に対して valueは「710,690, "千石や"」 その 4: key 「天神ラーメン」に対して valueは「750,730, "菜花"」 その 5: key 「とんた麺」に対して valueは「850,830, "とん太"」 これらを hash 配列で表記すると、 noodle["豚肉細切りラーメン"] =800,780,"桃圜" noodle["とびうおラーメン"] =720,700,"味好" noodle["しおラーメン"] =710,690,"千石や" noodle["天神ラーメン"] =750,730,"菜花" noodle["とんた麺"] =850,830,"とん太" e-townsを参考にお薦めラーメンと店の名前のデータを作成しました。 値段は自分で設定しました。 B ASCllコードを参考に、自分の名前を当てはまる。 S → 0x53 H → 0x48 O → 0x4F K → 0x4B O → 0x4F 16進数に当てはめた自分の名前(S,H,O,K,O)を、それぞれ10進数に変換する。 S 0x53 を10進数に変換する。 5*16**1=80 3*16**0=3 それぞれで求めた値を足す。 80+3=83 S → 0b83 H 0x48 を10進数に変換する。 4*16**1=64 8*16**0=8 それぞれで求めた値を足す。 64+8=72 H → 0b72 O 0x53(15) を10進数に変換する。 4*16**1=64 15*16**0=15 それぞれで求めた値を足す。 64+15=79 O → 0b79 K 0x4B(11) を10進数に変換する。 4*16**1=64 11*16**0=11 それぞれで求めた値を足す。 64+11=75 K → 0b75 ●確かめ● 10進数を16で割って、その商をさらに16で割る。 余りを出しながら、商が0になるまで繰り返す。 S 0b83 83/16=5余り3 5/16=0余り5 最後の余りを下から順に並べる。 5 3 それぞれの数を表を見ながら、16進数に当てはまる。 5 → 5 3 → 3 すなわち 0x53になるので、 Sは0x53で良い。 同じ要領で、H,O,K,O も計算する。 H 0b72 72/16=4余り8 4/16=0余り4 最後の余りを下から順に並べる。 4 8 それぞれの数を表を見ながら、16進数に当てはまる。 4 → 4 8 → 8 すなわち 0x48になるので、 Sは0x48で良い。 O 0b79 79/16=4余り15 4/16=0余り4 最後の余りを下から順に並べる。 4 15 それぞれの数を表を見ながら、16進数に当てはまる。 4 → 4 15 → F すなわち 0x4Fになるので、 Sは0x4Fで良い。 K 0b75 75/16=4余り11 4/16=0余り4 最後の余りを下から順に並べる。 4 11 それぞれの数を表を見ながら、16進数に当てはまる。 4 → 4 11 → B すなわち 0x4Bになるので、 Sは0x4Bで良い。 ●参考文献● 西村先生のHP ASCllコード表 http://roy/~madoka/2007/r1/05/05-03-ascii.html 2 hash-for.rb 1. 考えた設定 お薦めラーメンと、その値段(大盛り)(並み)と店の名前を表示させるプログラ ムを作りました。 表示させるさいに、選びやすいように値段の安い順にお薦めラーメンを表示させ ます。 2. 作成したプログラムコード #!/usr/koeki/bin/ruby $KCODE = 'e' noodle = Hash.new noodle["豚肉細切りラーメン"] = 800,780,"桃圜" noodle["とびうおラーメン"] = 720,700,"味好" noodle["しおラーメン"] = 710,690,"千石や" noodle["天神ラーメン"] = 750,730,"菜花" noodle["とんた麺"] = 850,830,"とん太" #p noodle print("金額の安い順に、ラーメンを表示します。\n") noodle.keys.sort{ |price,place| noodle[price][1] <=>noodle[place][1] }.each{ |ramen| printf("%-20s\t%10d円\t%10d円\t%s\n", ramen, noodle[ramen][0], noodle[ramen][1], noodle[ramen][2]) } 3. もとにしたプログラムからの変更点 value の一部を使って sort する例 の sesame を noodle に変更しました。 4. プログラムを実行した結果画面 irsv{c106145}% ./hash-for.rb [~/Ruby] 金額の安い順に、ラーメンを表示します。 しおラーメン 710円 690円 千石や とびうおラーメン 720円 700円 味好 天神ラーメン 750円 730円 菜花 豚肉細切りラーメン 800円 780円 桃圜 とんた麺 850円 830円 とん太 5. 導き出された結果の考察 プログラムで作成した通りに、ktermで実行された。 6. 参考文献 西村先生のHP value の一部を使って sort する例 http://roy/~madoka/2007/r2/03/03-07-sort-hash-array-02.html hash-array-calc.rb 1. 考えた設定 各店のお薦めのラーメンと、大盛り、並み盛りをお客様に選んでもらいます。 選んで貰ったラーメン、サイズの合計を表示させるプログラムを作りました。 2. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' noodle = Hash.new total = 0 noodle["豚肉細切りラーメン"] =[ 800,780,"桃圜"] noodle["とびうおラーメン"] =[ 720,700,"味好"] noodle["しおラーメン"] =[ 710,690,"千石や"] noodle["天神ラーメン"] =[ 750,730,"菜花"] noodle["とんた麺"] =[ 850,830,"とん太"] #p noodle noodle.each{ |menu,praice| printf("%-20s\t%10d円\t%10d円\t場所:%s\n",menu,noodle[menu][0],noodle[menu][1],noodle[menu][2]) } while true STDERR.print("ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d)\n") menu = gets if menu == nil break else menu = menu.chomp print("\n%s ですね。\n",menu) STDERR.print("大盛りと並み盛り、どちらになさいますか??\n") STDERR.print("大盛り → 1、並み盛り → 2\n") select = gets.chomp.to_i if select ==1 printf("\n%sの%sの大盛りは%d円です。 \n",noodle[menu][2],menu,noodle[menu][0]) total += noodle[menu][0] else printf("\n%sの%sの並み盛りは%d円です。\n",noodle[menu][2],menu,noodle[menu][1]) total += noodle[menu][1] end end end printf("合計%d円、頂戴いたします。\n",total) 3. もとにしたプログラムからの変更点 hash-for.rbで作成したプログラムに、if文を使いプログラムを作成した。 最終的に、合計金額が表示されるように total += noodle[menu][1]をつけくわ え計算させました。 4. プログラムを実行した結果画面 irsv{c106145}% ./hash-array-calc.rb [~/Ruby] しおラーメン 710円 690円 場所:千石や とんた麺 850円 830円 場所:とん太 豚肉細切りラーメン 800円 780円 場所:桃圜 とびうおラーメン 720円 700円 場所:味好 天神ラーメン 750円 730円 場所:菜花 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) しおラーメン %s ですね。 大盛りと並み盛り、どちらになさいますか?? 大盛り → 1、並み盛り → 2 しおラーメン1 千石やのしおラーメンの大盛りは710円です。 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) 天神ラーメン %s ですね。 大盛りと並み盛り、どちらになさいますか?? 大盛り → 1、並み盛り → 2 天神ラーメン2 菜花の天神ラーメンの並み盛りは730円です。 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) 合計1440円、頂戴いたします。 irsv{c106145}% bc -l [~/Ruby] 710+730 1440 5. 導き出された結果の考察 大盛り、並み盛りの選択や、合計金額を求めることができた。 いろいろな変数を代入しても、30行目にラーメンの名前を表示させることが出来 なかった。 6. 参考文献 (参照した本、ホームページなど) 西村先生のHP value の一部を使って sort する例 http://roy/~madoka/2007/r2/03/03-07-sort-hash-array-02.html hash-each.rb 1. 考えた設定 各店のお薦めのラーメンと、大盛り、並み盛りをお客様に選んでもらいます。 選んで貰ったラーメン、サイズの合計を表示させるプログラムを作りました。 2. 作成したプログラムコード #!/usr/koeki/bin/ruby $KCODE = 'e' noodle = Hash.new total = 0 noodle["豚肉細切りラーメン"] =[ 800,780,"桃圜"] noodle["とびうおラーメン"] =[ 720,700,"味好"] noodle["しおラーメン"] =[ 710,690,"千石や"] noodle["天神ラーメン"] =[ 750,730,"菜花"] noodle["とんた麺"] =[ 850,830,"とん太"] #p noodle for menu,shop in noodle printf("%-20s\t%10d円\t%10d円\t場所:%s\n",menu,noodle[menu][0],noodle[menu][1],noodle[menu][2]) end while true STDERR.print("ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d)\n") menu = gets if menu == nil break else menu = menu.chomp print("\n%sですね。\n",menu) STDERR.print("大盛りと並み盛り、どちらになさいますか??\n") STDERR.print("大盛り → 1、並み盛り → 2\n") select = gets.chomp.to_i if select ==1 printf("\n%sの%sの大盛りは%d円です。 \n",noodle[menu][2],menu,noodle[menu][0]) total += noodle[menu][0] else printf("\n%sの%sの並み盛りは%d円です。\n",noodle[menu][2],menu,noodle[menu][1]) total += noodle[menu][1] end end end printf("合計%d円、頂戴いたします。\n",total) 3. もとにしたプログラムからの変更点 hash-array-calc.rbで作成したプログラムにfor文を用いるために、 noodle.each{ |menu,praice| printf("%-20s\t%10d円\t%10d円\t場所:%s\n",menu,noodle[menu][0],noodle[menu][1],noodle[menu][2]) } の部分を消し、 for menu,shop in noodle printf("%-20s\t%10d円\t%10d円\t場所:%s\n",menu,noodle[menu][0],noodle[menu][1],noodle[menu][2]) を付け加えた。 4. プログラムを実行した結果画面 irsv{c106145}% ./hash-each.rb [~/Ruby] しおラーメン 710円 690円 場所:千石や とんた麺 850円 830円 場所:とん太 豚肉細切りラーメン 800円 780円 場所:桃圜 とびうおラーメン 720円 700円 場所:味好 天神ラーメン 750円 730円 場所:菜花 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) とんた麺 %sですね。 大盛りと並み盛り、どちらになさいますか?? 大盛り → 1、並み盛り → 2 とんた麺1 とん太のとんた麺の大盛りは850円です。 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) 豚肉細切りラーメン %sですね。 大盛りと並み盛り、どちらになさいますか?? 大盛り → 1、並み盛り → 2 豚肉細切りラーメン2 桃圜の豚肉細切りラーメンの並み盛りは780円です。 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) とびうおラーメン %sですね。 大盛りと並み盛り、どちらになさいますか?? 大盛り → 1、並み盛り → 2 とびうおラーメン2 味好のとびうおラーメンの並み盛りは700円です。 ラーメンをメニューの中から、お選び下さい。(終了はCntrl-d) 合計2330円、頂戴いたします。 irsv{c106145}% bc -l [~/Ruby] 850+780+700 2330 5. 導き出された結果の考察 (ここで計算結果が合っているか調べる) 大盛り、並み盛りの選択や、合計金額を求めることができた。 いろいろな変数を代入しても、30行目にラーメンの名前を表示させることが出来 なかった。 6. 参考文献 (参照した本、ホームページなど) 西村先生のHP Hash の対を表示するには http://roy/~madoka/2007/r2/02/02-07-for-hash.html 3 私は今回のレポートで、前回のレポートで指摘されたことこのレポートでは繰り 返さないように心がけた。 ×や乗を*や**で表記して進数計算をした。 前期で学んだのに、忘れていたので以後気を付けたいです。 また、今回のレポートでは前回よりも見やすいプログラムにしようと思い、 %-10sなどを使い文字を揃えるなどの工夫もしました。 今回のレポートでは西村先生のHP、value の一部を使って sort する例 と Hash の対を表示するには を参考にプログラムを作成しました。 合計金額を表示させるプログラムでは、いろいろな代数を代入してもお薦めのラー メンを表示させることが出来ませんでした。 私は今回のレポートで、前回指摘された部分に気を付けたり、見やすいプログラ ムを意識して頑張りました。 次回は、今回以上のレポートが作成できるように、日々努力していきたいです。