第 5 回 何度も呼び出そう レポート課題 氏名:細田 洋平 学籍番号:c1101773 語学クラス:英語 6 コース(系):政策マネジメントコース 1.A これは以前提出したレポートのものを使用した。 Hosoda → 0x48 0x6F 0x73 0x6F 0x64 0x61 Yohe → 0x59 0x6F 0x68 0x65 a = 10 b = 11 c = 12 d = 13 e = 14 f = 15 それぞれ足すと、 0x48 + 0x6F = 4+6,8+F * 一の位と十の位で分けて計算する * * 一の位 * 8+F = 23 / 16 = 1 余り 7 商の1は十の位に繰り上げする よって 0x48 + 0x6F = B7 となる 以下、同じ計算を行う b7 + 0x73 = 12a 12a + 0x6F = 199 199 + 0x64 = 1fd 1fd + 0x61 = 25e 25e + 0x59 = 2b7 2b7 + 0x6F = 326 326 + 0x68 = 38e 38e + 0x65 = 3f3 よって 0x3f3 となる 次に、それぞれの16進数を10進数に直す 0x48 = 0d72 0x6F = 0d111 0x73 = 0d115 0x6F = 0d111 0x64 = 0d100 0x61 = 0d97 0x59 = 0d89 0x6F = 0d111 0x68 = 0d104 0x65 = 0d101 72 + 111 + 115 + 111 + 100 + 97 + 89 + 111 + 104 + 101 = 1011 よって 0d1011 となる 1011 / 16 = 63 余り 3 63 / 16 = 3 余り 15 3 / 16 = 0 余り 3 余りを16進数に直すと 3f3 となり、結果、0x3f3 = 0d1011 であると証明される。 1.B 毎日のゲームをする流れをプログラム風にしてみた def game(kidou,controller,disc) ゲーム機を kidou させる controller のスイッチを押す disc を選び、挿入する end game(10秒,5秒,1枚) #ゲームをするので呼び出す print("楽しいなあ\n") 2.A プログラム 考えた設定 ・ 一番くじ(くじびき) の設定にした #!/usr/koeki/bin/ruby def factorial(o) #今回の設定上、oubosilya の o if o == 1 # o が 1 のとき 1 # 1 を返す else # そうでないときは o * factorial(o-1) # o - 1 した数字をかける end end def itibannkuzi(oubosilya,tousennsilya) # 関数 itibannkuzi を定義する if oubosilya == tousennsilya # 応募者と当選者が同じ数の場合 1 # 1を返す else #そうでない場合 factorial(oubosilya)/(factorial(tousennsilya) * factorial(oubosilya - tousennsilya)) # 公式 end end STDERR.print("応募者は何人いますか?\n") zenntai = gets.to_i STDERR.print("当選者は何人ですか?\n") tousenn = gets.to_i if zenntai < tousenn print("正しい数を入力して下さい\n") #エラーメッセージを表示する else printf("応募者 %d人 から 当選者 %d人 を選ぶ場合の組み合わせは、%d通りです。\n",zenntai,tousenn,itibannkuzi(zenntai,tousenn)) end 変更点 授業で使用した def_fanction.rb のプログラムを元に作成 変数を今回の設定に合わせて変更 エラーメッセージが表示されるようにした * 実行結果 * pan{c110177}% ./def_combination.rb [~/Ruby] 応募者は何人いますか? 100 当選者は何人ですか? 1 応募者 100人 から 当選者 1人 を選ぶ場合の組み合わせは、100通りです。 * 失敗例 * pan{HOSODA Yohei}% ./def_combination.rb [~/Ruby] 応募者は何人いますか? 1 当選者は何人ですか? 100 正しい数を入力して下さい * 考察 * はじめは oubosilya * factorial(oubosilya - tousennsilya) で計算し、実行 したが pan{c110177}% ./def_combination.rb [~/Ruby] 応募者は何人いますか? 100 当選者は何人ですか? 1 応募者 100人 から 当選者 1人 を選ぶ場合の組み合わせは、93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000通りです。 などと途方もない数になってしまったので、今回調べて出てきた nCr=n!/r!(n-r)! という公式を使用することで、正しい計算に導いた 2.B 考えた設定 ・とある場所のビアホールでは、料金が男性なら4000円、女性なら3000円となっ ている。また、男性の人数が5人以上だと、そこからは男性のみ2500円となる サービスがある。これの合計を求める。 #!/usr/koeki/bin/ruby def dansei(m) # 男性の m if m < 5 # m が5人未満の場合 m * 4000 # 人数かける4000を行う else # それ以上の場合 5 * 4000 + (m-5) * 2500 # 5人までは4000円、それ以降は2500円 end end def zilyosei(w) # 女性の w w * 3000 # そのまま人数かける3000円 end STDERR.print("男性は何人いらっしゃいましたか?\n") m = gets.to_i STDERR.print("女性は何人いらっしゃいましたか?\n") w = gets.to_i goukei = dansei(m) + zilyosei(w) # 関数dansei と 関数zilyosei をそのまま使用した printf("合わせて %d円 になります。\n",goukei) * 実行結果 * pan{c110177}% ./two_methods.rb [~/Ruby] 男性は何人いらっしゃいましたか? 6 女性は何人いらっしゃいましたか? 0 合わせて 22500円 になります。 * 確かめ算 * pan{c110177}% bc -l [~] 4000 * 5 + 2500 * 1 22500 pan{c110177}% ./two_methods.rb [~/Ruby] 男性は何人いらっしゃいましたか? 10 女性は何人いらっしゃいましたか? 10 合わせて 62500円 になります。 * 確かめ算 * pan{c110177}% bc-l [~] zsh: command not found: bc-l pan{HOSODA Yohei}% bc -l [~] 4000 * 5 + 2500 * 5 32500 3000 * 10 30000 32500 + 30000 62500 pan{c110177}% ./two_methods.rb [~/Ruby] 男性は何人いらっしゃいましたか? 0 女性は何人いらっしゃいましたか? 6 合わせて 18000円 になります。 * 確かめ算 * pan{c110177}% bc -l [~] 3000 * 6 18000 * 考察 * 今回は関数を2つ作り、各々の結果を足すようにした。 プログラムの計算と bc -l での確かめ算が一致したので、正しく起動している と言える。 * 感想 * 機械的な動作を繰り返す例として、駅の自動改札がそうではないかと思った。 今回はそこまで頭を悩ませずに取り組むことが出来た。だが、プログ ラムの構成より、筆記問題の16進数の足し算の方が難しく感じられ、何度も違う 解答になるのは大変だった。 * 参考文献 * 基礎プログラミング II 第5回 何度も呼び出そう 「階乗計算」 (講義ノート) http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 基礎プログラミング II 第5回 何度も呼び出そう 「ひとつずつ確かめよう」 (講義ノート) http://roy/~madoka/2010/r2/05/05_08_theme_06_onebyone.html 作成者 : 西村まどか