第5回 何度も呼び出そう レポート課題 阿部誠吾 c1110068 英語3 政策マネジメント 1.筆記問題 A.ASCIIコード ASCIIコードを使って名前を表すと A = 0x41 b = 0x62 e = 0x65 S = 0x53 e = 0x65 i = 0x69 g = 0x67 o = 0x6f となった。 これらの16進数を全て足す。 0x41 + 0x62 + 0x65 + 0x53 + 0x65 + 0x69 + 0x67 + 0x6f = 0x?? 多いので2つずつ計算することにする。 0x41 0x65 0x65 0x67 + 0x62 + 0x53 + 0x69 + 0x6f ------- ------- ------- ------- 0xa3 0xb8 0xce 0xd6 --------------------------------------------------- さらに足す。 0xa3 0xce + 0xb8 + 0xd6 ------- ------- 0x15b 0x1a4 ----------------------- もう一度足す。 0x15b + 0x1a4 ------- 0x2ff --------- 全て足すと 0x2ff になる。 また、各16進数を10進数に変換してから全て足し、16進数に戻すと どうなるか計算する。 0x41 = 0d?? 0x62 = 0d?? 0x65 = 0d?? 4*16^1 + 1*16^0 6*16^1 + 2*16^1 6*16^1 + 5*16^5 = 64 + 1 = 96 + 2 = 96 + 5 = 0d65 = 0d98 = 0d101 0x53 = 0d?? 0x65 = 0x?? 0x69 = 0d?? 5* 16^1 + 3*16^0 6*16^1 + 5*16^5 6*16^1 + 9*16^0 = 80 + 3 = 96 + 5 = 96 + 9 = 0d83 = 0d101 = 0d105 0x67 = 0d?? 0x6f = 0x?? 6* 16^1 + 7*16^0 6*16^1 + f*16^5 = 96 + 7 = 96 + 15 = 0d103 = 0d111 変換したものを足す。 0d65 + 0d98 + 0d101 + 0d83 + 0d101 + 0d105 + 0d103 + 0d111 = 0d?? 2進数なので普通に計算する。 計算した結果 0d767 となった。これを16進数に変換する。 0d767 = 0x?? 16 ) 767 ------ 16 ) 47 … 15 (f) ------ 16 ) 2 … 15 (f) ------ 0 … 2 余りの部分を取り出して並べると 0d767 = 0x2ff となる。 比較すると両方ともに同じ答えになった。 B.日常プログラム風 料理の手順をプログラム風に書き直した。 def cook(rice, egg, ketchup) rice を炊く eeg を焼く ketchup を取り出す dish = rice と egg を乗せる dish = dish に ketchup をかける end def soup(hotwater, vegetable, consomme) hotwater を沸かす vegetable を切る consomme を取り出す pot = hotwater 注ぎ vegetable を入れる pot = pot に consomme を入れる end cook(1合,2個,スプーン3杯) #オムライスを作るので呼び出す soup(150cc,30g,スプーン1杯) #野菜スープを作るので呼び出す print("調理完了!!") 2.プログラム問題 A.基数と指数 i.考えた設定 掛け算の延長だと思い入力させた base を ** を使って index 乗として表示す るような設定にした。 ii.作成したプログラム def_power.rb #!/usr/koeki/bin/ruby #coding: euc-jp def power(base ,index) base ** index #base の index乗 end STDERR.print("基数を入力してください。:\n") base = gets.to_i #基数を入力させる。 STDERR.print("指数を入力してください。:\n") index = gets.to_i #指数を入力させる。 STDERR.printf("%d の %d 乗は %d です。\n", base, index, power(base, index)) iii.もとにしたプログラムからの変更点 もとにしたのは def_func.rb であり、あまり複雑にならないように単純に簡潔 に変更した。 iv.プログラムを実行した結果画面 pan{c111006}% ./def_power.rb [~/Ruby] 基数を入力してください。: 1 指数を入力してください。: 0 1 の 0 乗は 1 です。 pan{c111006}% ./def_power.rb [~/Ruby] 基数を入力してください。: 2 指数を入力してください。: 1 2 の 1 乗は 2 です。 pan{c111006}% ./def_power.rb [~/Ruby] 基数を入力してください。: 3 指数を入力してください。: 2 3 の 2 乗は 9 です。 pan{c111006}% ./def_power.rb [~/Ruby] 基数を入力してください。: 4 指数を入力してください。: 3 4 の 3 乗は 64 です。 pan{c111006}% ./def_power.rb [~/Ruby] 基数を入力してください。: 5 指数を入力してください。: 4 5 の 4 乗は 625 です。 v.導き出された結果の考察 まず計算が正しいか確認してみる。 pan{c111006}% bc -l [~/Ruby] 1^0 1 2^1 2 3^2 9 4^3 64 5^4 625 これで計算が正しいと証明できた。 このことからプログラムで使った ** の使用方法が正しかったと言える。 vi.参考文献 西村まどか 第4回 基礎プログラミングII (繰り返しは引っ張りだそう) 「どんな関数がきてもだいじょうぶ」 http://roy/~madoka/2012/r2/04/r2_04_03_theme_03_method.html B.methodが2つ i.考えた設定 前回作った def_twoparam.rb を値引きありの計算になるように if 文を使って 作るという設定にした。 ii.作成したプログラム two_method.rb #!/usr/koeki/bin/ruby #coding: euc-jp print("どら焼きとクッキーを買って代金がいくらかかるか調べた。\n") print("どら焼きの値段は1個150円、クッキーの値段は1個100円である。\n") print("どら焼きは3個以上買うと1個120円になる。\n") print("クッキーは5個以上買うと1個50円になる。\n") cprice = 100 #クッキーの値段 dprice = 150 #どら焼きの値段 def goukei1(dora,dprice ) #仮引数を作るときに仮に使う。 if dora >= 3 #どら焼きが3個以上だったら dprice -= 30 #どら焼きの値段が30円安くなる。 end dora * dprice #それ以外はそのまま end def goukei2(cooky,cprice) #仮引数を作るときに仮に使う。 if cooky >= 5 #クッキーが5個以上だったら cprice -= 50 #クッキーの値段が50円安くなる。 end cooky * cprice #それ以外はそのまま end STDERR.print("どら焼きを何個買う? : ") dora = gets.to_i #どら焼きを何個買うか入力させる。 STDERR.print("クッキーを何個買う? : ") cooky = gets.to_i #クッキーを何個買うか入力させる。 STDERR.printf("どら焼きを%d個、クッキーを%d個買うと合計は%d円となる。\n" ,dora ,cooky ,goukei1(dora,dprice) + goukei2(cooky,cprice)) iii.もとにしたプログラムからの変更点 前回作った def_twoparam.rb をもとにして def 文の中に if 文を入れて「もし〜 だったら◯◯」というプログラムに変更した。 iv.プログラムを実行した結果画面 割引なしの場合 pan{c111006}% ./two_method.rb [~/Ruby] どら焼きとクッキーを買って代金がいくらかかるか調べた。 どら焼きの値段は1個150円、クッキーの値段は1個100円である。 どら焼きは3個以上買うと1個120円になる。 クッキーは5個以上買うと1個50円になる。 どら焼きを何個買う? : 2 クッキーを何個買う? : 4 どら焼きを2個、クッキーを4個買うと合計は700円となる。 割引ありの場合 pan{c111006}% ./two_method.rb [~/Ruby] どら焼きとクッキーを買って代金がいくらかかるか調べた。 どら焼きの値段は1個150円、クッキーの値段は1個100円である。 どら焼きは3個以上買うと1個120円になる。 クッキーは5個以上買うと1個50円になる。 どら焼きを何個買う? : 3 クッキーを何個買う? : 5 どら焼きを3個、クッキーを5個買うと合計は610円となる。 v.導き出された結果の考察 まず計算が合っているか確認する。 割引なしの場合 pan{c111006}% bc -l [~/Ruby] 150*2 300 100*4 400 300+400 700 割引ありの場合 pan{c111006}% bc -l [~/Ruby] 120*3 360 50*5 250 360+250 610 これで計算が正しいと証明された。 よって def 文の中に if 文を入れて計算させるという設定は正しかったと言え る。 vi.参考文献 西村まどか 第5回 基礎プログラミングII (何度も呼び出そう) 「ほたるの数と個目の収穫量」 def_firefly.rb http://roy/~madoka/2012/prog/def_firefly.rb C.◯◯シュミレーション i.考えた設定 オムライスの早食い大会の様子をプログラムにしてみた。時間経過と共にオムラ イスが 2 の 2乗 ずつ減り、体重が 「今の体重 + 食事の経過時間」 ずつ増えるという設 定にした。 ii.作成したプログラム def_sim.rb #!/usr/koeki/bin/ruby #coding: euc-jp def weight(now,eat) now + (eat + 1) #今の体重から増える分。 end def food(kg,eat) if kg > 0 #もし食べ物の量が0より多かったら kg -= 2 ** eat # 2 の 2乗 ずつ減らす。 else return 0 #負の数は0にして返す。 end end w = 60 #今の体重 e = e0 = 0 #食事の時間 f = 20 #食べ物の量 print("早食い大会が行われています。そんなに食べたら体重が…\n") STDERR.printf("オムライスは全部で %d 皿あります。 \n", f) print("\n") while true #条件が正しければ反復させる f = food(f,e) w = weight(w,e) if f > 0 #もし f が 0 より多かったら STDERR.printf(" 開始 %d 時間で 残りのオムライスは %d 皿 になり、体重は %d kg に増えました。\n", e += 1,f,w) #を表示させる。 else break #または終了 end if e > 10 #または e が 10 より多ければ break #終了 end end print("\n") print("完食しました。\n\n") print("おめでとう!優勝だね!!\n") print("でも食べ過ぎじゃないのかなぁ…。\n") iii.もとにしたプログラムからの変更点 授業で作った def_firefly.rb の形を参考に自分が分かるように改良してみた。 iv.プログラムを実行した結果画面 pan{c111006}% ./def_sim.rb [~/Ruby] 早食い大会が行われています。そんなに食べたら体重が… オムライスは全部で 20 皿あります。 開始 1 時間で 残りのオムライスは 19 皿 になり、体重は 61 kg に増えました。 開始 2 時間で 残りのオムライスは 17 皿 になり、体重は 63 kg に増えました。 開始 3 時間で 残りのオムライスは 13 皿 になり、体重は 66 kg に増えました。 開始 4 時間で 残りのオムライスは 5 皿 になり、体重は 70 kg に増えました。 完食しました。 おめでとう!優勝だね!! でも食べ過ぎじゃないのかなぁ…。 v.導き出された結果の考察 まずは計算が合っているか調べる。 始めはオムライスの減り方を調べる。 pan{c111006}% bc -l [~/Ruby] 20-1 19 19-2 17 17-4 13 13-8 5 8-16 -8 マイナスになると表示されなくなるので減り方は正しい。 次に体重の増え方を調べる。 pan{c111006}% bc -l [~/Ruby] 60+1 61 61+2 63 63+3 66 66+4 70 設定通り 「今の体重 + 食事の経過時間」ずつ増えているので正しい。 以上のことからこのプログラムは設定通り正しく動いたと言える。 vi.参考文献 西村まどか 第5回 基礎プログラミングII (何度も呼び出そう) 「ほたるの数と個目の収穫量」 def_firefly.rb http://roy/~madoka/2012/prog/def_firefly.rb 西村まどか 第2回 基礎プログラミングI (Rubyの基礎 / 計算が終わったら止まる問題) 「計算機に計算させるには」 http://roy/~madoka/2012/r1/02/r1_02_08_theme_06_printf.html 3.感想 お店の店員さんのあいさつ、野球のピッチャーなど。 4.共同学習者 武田広幸