第3回 基礎プログラミング II レポート課題 氏名: 池田博哉 学籍番号: c1090147 語学クラス: 英語3 コース(系): 地域共創 1.筆記問題 A.「Ikeda Hiroya」なので、 I … 0x49 H … 0x48 k … 0x6b i … 0x69 e … 0x65 r … 0x72 d … 0x44 o … 0x6f a … 0x61 y … 0x79 a … 0x61 となった。 ここで出た16進数を10進数に変換する。その場合、右から各桁に16の倍数を 掛けていき、それらを全て合計する。英語表記のものは、10進数に変換して から掛けていく。 b = 11 f = 15 I … 4 * 16の1乗 + 4 * 16の0乗 = 64 + 4 = 68 k … 6 * 16の1乗 + 11 * 16の0乗 = 96 + 11 = 107 e … 6 * 16の1乗 + 5 * 16の0乗 = 96 + 5 = 101 d … 4 * 16の1乗 + 4 * 16の0乗 = 64 + 4 = 68 a … 6 * 16の1乗 + 1 * 16の0乗 = 96 + 1 = 97 H … 4 * 16の1乗 + 8 * 16の0乗 = 64 + 8 = 72 i … 6 * 16の1乗 + 9 * 16の0乗 = 96 + 9 = 105 r … 7 * 16の1乗 + 4 * 16の0乗 = 112 + 4 = 116 o … 6 * 16の1乗 + 15 * 16の0乗 = 96 + 15 = 111 y … 7 * 16の1乗 + 9 * 16の0乗 = 112 + 9 = 121 a … 6 * 16の1乗 + 1 * 16の0乗 = 96 + 1 = 97 B.「きのうえはこない」 き の うえ は こない → 木の上は来ない き の うえ はこ ない → 木の上、箱ない きのう え は こない → 昨日、絵は来ない きのう えはこ ない → 昨日、絵箱ない C. 吉野家のメニューの概要を hash 配列を yosi としました。 yosi の key と value は、それぞれ名前とそのサイズ、値段[円]、カロリー[kcal]をとりました。 その 1:key 「牛丼」に対して valueは「"並盛",380,667」 その 2:key 「牛皿」に対して valueは「"並盛",280,250」 その 3:key 「牛鍋丼」に対して valueは「"並盛",280,593」 その 4:key 「豚丼」に対して valueは「"並盛",330,634」 その 5:key 「豚皿」に対して valueは「"並盛",240,217」 これらを hash 配列で表記すると、 yosi["牛丼"] = "並盛",380,667 yosi["牛皿"] = "並盛",280,250 yosi["牛鍋丼"] = "並盛",280,593 yosi["豚丼"] = "並盛",330,634 yosi["豚皿"] = "並盛",240,217 また、もう一つの表記の仕方は、 { "牛丼" => "並盛",380,667, "牛皿" => "並盛",280,250, "牛鍋丼" => "並盛",280,593, "豚丼" => "並盛",330,634, "豚皿" => "並盛",240,217, } 2.プログラム問題 A.◯考えた設定 吉野家の並盛メニューの値段、カロリーを知ることが出来るプログラム。 ◯もとにしたプログラムからの変更点 前回のレポート課題「hash_for.rb」 ・調味料の項目を吉野家の項目に変更。 ・valueの数が増えたので、[0][1][2]を追加。 ◯プログラム本体「hash_ary_print.rb」 -------------------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化け防止 yosi = Hash.new # 配列を yosi にする yosi["牛丼"] = "並盛",380,667 yosi["牛皿"] = "並盛",280,250 yosi["牛鍋丼"] = "並盛",280,593 yosi["豚丼"] = "並盛",330,634 yosi["豚皿"] = "並盛",240,217 for menu,naiyo in yosi # 全てのものを表示する、for key名,値 in Hash配列名 printf("「%sの%s」は、%d円で %d[kcal]です!\n", menu, naiyo[0], naiyo[1], naiyo[2]) end -------------------------------------------------------------------------- ◯実行結果 -------------------------------------------------------------------------- pan{c109014}% ./hash_ary_print.rb [~/Ruby] 牛鍋丼 の 並盛 は、280[円]で 593[kcal]ですよ! 豚丼 の 並盛 は、330[円]で 634[kcal]ですよ! 牛皿 の 並盛 は、280[円]で 250[kcal]ですよ! 牛丼 の 並盛 は、380[円]で 667[kcal]ですよ! 豚皿 の 並盛 は、240[円]で 217[kcal]ですよ! -------------------------------------------------------------------------- ↓ -------------------------------------------------------------------------- pan{c109014}% ./hash_ary_print.rb [~/Ruby] 「牛鍋丼の並盛」は、280円で 593[kcal]です! 「豚丼の並盛」は、330円で 634[kcal]です! 「牛皿の並盛」は、280円で 250[kcal]です! 「牛丼の並盛」は、380円で 667[kcal]です! 「豚皿の並盛」は、240円で 217[kcal]です! -------------------------------------------------------------------------- ◯考察 プログラムに入力した通りに結果が表示されたので、正しく実行できた。 また、文章にすると長くなってかなり見にくいので、「」など使って適度 に間隔を開けてみた結果、前よりも文字が揃って見やすくなった。 B. ◯考えた設定 吉野家のメニューをカロリーが低い順に並べられるプログラム。 ◯もとにしたプログラムからの変更点 A問題「hash_ary_print.rb」 講義で作成した「hash_sesami.rb」 ・sesami を yosi に変更 ・ソートを行う文を追。 ・「カロリーの低い順」といったタイトルみたいなものを一つだけ表示する ようにした ◯プログラム本体 -------------------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化け防止 yosi = Hash.new # 配列を yosi にする yosi["牛丼"] = "並盛",380,667 yosi["牛皿"] = "並盛",280,250 yosi["牛鍋丼"] = "並盛",280,593 yosi["豚丼"] = "並盛",330,634 yosi["豚皿"] = "並盛",240,217 for menu,naiyo in yosi # 全てのものを表示する、for key名,値 in Hash配列名 printf("「%sの%s」は、%d円で %d[kcal]です!\n", menu, naiyo[0], naiyo[1], naiyo[2]) end print("\n「カロリーの低い順」\n") yosi.keys.sort{|ue, sita| yosi[ue][2] <=> yosi[sita][2] #[ ]の中で指定した部分の前後を入れ替える }.each{|seiton| printf("%s (%d [kcal])\n", seiton, yosi[seiton][2]) } -------------------------------------------------------------------------- ◯実行結果 -------------------------------------------------------------------------- pan{c109014}% ./hash_ary_sort.rb [~/Ruby] 「牛鍋丼の並盛」は、280円で 593[kcal]です! 「豚丼の並盛」は、330円で 634[kcal]です! 「牛皿の並盛」は、280円で 250[kcal]です! 「牛丼の並盛」は、380円で 667[kcal]です! 「豚皿の並盛」は、240円で 217[kcal]です! 「カロリーの低い順」 豚皿 (217 [kcal]) 牛皿 (250 [kcal]) 牛鍋丼 (593 [kcal]) 豚丼 (634 [kcal]) 牛丼 (667 [kcal]) -------------------------------------------------------------------------- ◯考察 A問題の時と違い、カロリーが低い順に並び替えされていたので、正しく実 行できた。 「mae」「ushiro」「retail」は変更しても、正しく入力していれば実行で きた。 C.◯考えた設定 もし、プログラム中で挙げたメニューを一人で食べた時、カロリーの合計 はどのくらいになるか計算できるプログラム。また、参考としてメニュー のカロリー量の平均も求める。 ◯もとにしたプログラムからの変更点 B問題「hash_ary_sort.rb」 講義で作成した「hash_sesami.rb」 ・合計と平均を求める部分を追加 ◯プログラム本体「hash_ary_calc.rb」 -------------------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化け防止 totalkane = 0 totalcal = 0 yosi = Hash.new # 配列を yosi にする yosi["牛丼"] = "並盛",380,667 yosi["牛皿"] = "並盛",280,250 yosi["牛鍋丼"] = "並盛",280,593 yosi["豚丼"] = "並盛",330,634 yosi["豚皿"] = "並盛",240,217 print("\n「カロリーの低い順」\n") yosi.keys.sort{|ue, sita| yosi[ue][2] <=> yosi[sita][2] #[ ]の中で指定した部分の前後を入れ替える }.each{|seiton| printf("%s (%d [kcal])\n", seiton, yosi[seiton][2]) } for menu , naiyo in yosi totalcal += naiyo[2] # naiyo[2]を全て足していき、totalcal とする end calave = totalcal / 5 print("\n「全て食べた場合」\n") printf("合計熱量は %s [kcal]で、平均は %4.1f [kcal] です。\n", totalcal, calave) #「%4.1」= 4桁を確保し、1桁を小数表示に使用 -------------------------------------------------------------------------- ◯実行結果 -------------------------------------------------------------------------- pan{c109014}% ./hash_ary_calc.rb [~/Ruby] 「カロリーの低い順」 豚皿 (217 [kcal]) 牛皿 (250 [kcal]) 牛鍋丼 (593 [kcal]) 豚丼 (634 [kcal]) 牛丼 (667 [kcal]) 「全て食べた場合」 合計熱量は 2361 [kcal]で、平均は 472.0 [kcal] です。 -------------------------------------------------------------------------- ◯考察 pan{c109014}% bc -l [~/Ruby] 667 + 250 917 917 + 593 1510 1510 + 634 2144 2144 + 217 2361 2361 / 5 472.20000000000000000000 quit 合計と平均を計算した結果、実行結果と同じ答えが出たので、正常に作動 したと言える。 また、「%4.1f」の「1」を 0、2、3 にして試してみた。 「%4.0f」の場合 … 平均は 472 [kcal] です。 「%4.2f」の場合 … 平均は 472.00 [kcal] です。 「%4.3f」の場合 … 平均は 472.000 [kcal] です。 「%4.0f」は表示結果こそ「%f」と同じだが、小数に一桁を使わない分、 数字の左にスペースが空くことが分かった。 試しに「%2.1f」と入力して百の位の数字が消えるのかを確かめてみたが、 表示結果は変わらないことを確認した。 D. ◯考えた設定 プログラム内にデータを入力していなくても、他からデータを取り込んで、 そこから合計と平均を求めるプログラム。 ◯もとにしたプログラムからの変更点 C問題「hash_ary_calc.rb」 講義で作成した「hash_sesami.rb」 ・C問題のプログラムにデータを取り込む open を使った。 ◯データ本体「hash_ary_data.dat」 -------------------------------------------------------------------------- 牛丼 並盛 380 667 牛皿 並盛 280 250 牛鍋丼 並盛 280 593 豚丼 並盛 330 634 豚皿 並盛 240 217 -------------------------------------------------------------------------- ◯プログラム本体「hash_ary_read.rb」 -------------------------------------------------------------------------- #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化け防止 totalkane = 0 totalcal = 0 yosi = Hash.new # 配列を yosi にする open("hash_ary_data.dat", "r") do |mesiya| #読みこんだものは mesiya に while gohan = mesiya.gets if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/=~ gohan yosi[$1] = [$2, $3.to_i, $4.to_i] end end end print("\n「カロリーの低い順」\n") yosi.keys.sort{|high, low| yosi[high][2] <=> yosi[low][2] #[ ]の中で指定した部分の前後を入れ替える }.each{|seiton| printf("%s (%d [kcal])\n", seiton, yosi[seiton][2]) } for menu , naiyo in yosi totalcal += naiyo[2] # naiyo[2]を全て足していき、totalcal とする end calave = totalcal / 5 print("\n「全て食べた場合」\n") printf("合計熱量は %s [kcal]で、平均は %2.1f [kcal] です。\n", totalcal, calave) #「%4.1」= 4桁を確保し、1桁を小数表示に使用 -------------------------------------------------------------------------- ◯実行結果 -------------------------------------------------------------------------- pan{c109014}% ./hash_ary_read.rb [~/Ruby] 「カロリーの低い順」 豚皿 (217 [kcal]) 牛皿 (250 [kcal]) 牛鍋丼 (593 [kcal]) 豚丼 (634 [kcal]) 牛丼 (667 [kcal]) 「全て食べた場合」 合計熱量は 2361 [kcal]で、平均は 472.0 [kcal] です。 -------------------------------------------------------------------------- ◯考察 yosi[$1] = [$2, $3.to_i, $4.to_i] の文で、データ内で数字になっているところに「.to_i」を入力し忘れると 上手く実行できなかった。 修正して実行した結果、データ内に入力した通りに結果が表示された。 計算はC問題で確認しているので、このプログラムは正常に作動したと言え る。 3.感想 「花咲じいさん」 お爺さんお婆さん、犬のシロを可愛がる → シロが畑で吠える シロが吠えた畑を掘る → 大判小判が見つかる 大判小判が見つかる → 隣の欲張り爺さんが来る 隣の欲張り爺さんが来る → シロを無理矢理連れていく シロを無理矢理連れていく → キャンキャン鳴いた場所を掘る キャンキャン鳴いた場所を掘る → ゴミが見つかる ゴミが見つかる → シロを殺されてしまう シロを殺してしまう → お爺さんお婆さん、棒を立てて墓を作る お爺さんお婆さん、棒を立てて墓を作る → 次の日、棒が大木になった 次の日、棒が大木になった → 大木から臼を作り、餅をつく 大木から臼を作り、餅をつく → 餅の中から宝物が出てくる 餅の中から宝物が出てくる → 隣の欲張り爺さんが来る 隣の欲張り爺さんが来る → 臼を無理矢理借りる 臼を無理矢理借りる → 餅をつく 餅をつく → 石ころばかり出てくる 石ころばかり出てくる → 臼を焼いて、灰にされてしまう 臼を焼いて、灰にされてしまう → お爺さんお婆さん、灰を持ち帰ろうとする お爺さんお婆さん、灰を持ち帰ろうとする → 灰が風に飛ばされる 灰が風に飛ばされる → 枯れ木に灰がかかる 枯れ木に灰がかかる → 枯れ木に満開の花が咲く 枯れ木に満開の花が咲く → お爺さん、次々に枯れ木に灰をまいていく お爺さん、次々に枯れ木に灰をまいていく → 通りかかったお殿様が喜ぶ 通りかかったお殿様が喜ぶ → お爺さんお婆さん、褒美をもらう お爺さんお婆さん、褒美をもらう → 灰を無理矢理取りあげる 灰を無理矢理取りあげる → お殿様に前で、枯れ木に灰をまく お殿様に前で、枯れ木に灰をまく → お殿様の目に入る お殿様の目に入る → お殿様の家来にさんざん殴られる 犬のシロを可愛がっていたお爺さんとお婆さんは、最後にはお殿様から褒美 を貰うことになる。逆に、動物や物を大事にしなかった欲張り爺さんは最後 にはひどい目にあうことになった。 「花咲じいさん」の話は、逆の立場の人たちのそれぞれの結末が書かれてい た。 今回のレポート課題はやることが多くて忙しかったけれど、何回かに分けて 作業を行なうと、それほど大変な作業になりませんでした。プログラム問題 では、自分なりの工夫というものをもっと入れていきたいと思いました。 次回の講義も頑張っていきたいです。 4.参考文献 ◯Rubyプログラミング基礎講座 著:広瀬雄二 P102〜104、P107 ◯吉野家ホームページ「http://www.yoshinoya.com/」 ◯昔話図書館「http://mukasibanasi.web.fc2.com/」 共同学習者 ◯遠藤孝之 ◯藤井駿 ◯佐藤裕康