第 5 回 何度も呼び出そう レポート課題 氏名:夏井 知恵子 学籍番号:c1101655 語学クラス:英語クラス6 コース:政策マネジメント 1.筆記問題 A. 自分の名前をASCIIコード表を参考に16進数に変換すると N→0x4e a→0x61 t→0x74 s→0x73 u→0x75 i→0x69 C→0x43 h→0x68 i→0x69 e→0x65 k→0x68 o→0x6f 16進数で足していく 文字コードを上から順番に足していくと 計算する際には10の位と1の位は分けて計算する(計算の際 0x は省略) 割り算になるところは余りの部分をそのままその位に残し、商の部分は次の位に 繰り上げて計算する。 4e + 61 4+6 =10(a) |e(14)+1 =f | af af + 74 a(10)+7+1 =18/16 =1…2|f(15)+4 =19/16 = 1…3|123 123 + 73 2+7 =9 |3+3 =6 |196 196 + 75 9+7 =16/16 =1 |6+5 =11 =b |1+1=2 |20b 10b + 69 0+6+1 =7 |b(11)+9 =20/16 =1…4 |274 174 + 43 7+4 =11 =b |4+3 =7 |2b7 1b7 + 68 b+6 =17/16 =1…1 |7+8 =15 =f |2+1 =3 |31f 21f + 69 1+6+1 =8 |f+9 =24/16 =1…8 |388 288 + 65 8+6 =14 =e |8+5 =13 =d |3ed 2ed + 68 e+6+1 =21/16 =1…5 |d+8 =21/16 =1…5 |3+1=4 |455 355 + 6f 5+6+1 =12 =c |5+f =20/16 =1…4 |4c4 計算すると 0x4c4 となる 10進数で足していく場合 先ず、16進数から10進数に変換する 0x4e = 4 * 16 **1 + e(14) * 16 **0 = 64 + 14 = 78 0x61 = 6 * 16 **1 + 1 * 16 **0 = 96 + 1 = 97 0x74 = 7 * 16 **1 + 4 *16 **0 = 112 + 4 = 116 0x73 = 7 * 16**1 + 3 * 16**0 = 112 + 3 = 115 0x75 = 7 * 16 ** 1 + 5 * 16 ** 0 = 112 + 5 = 117 0x69 = 6 * 16 ** 1 + 9 * 16 ** 0 = 96 + 9 = 105 0x43 = 4 * 16**1 + 3 * 16**0 = 64 + 3 = 67 0x68 = 6 * 16 ** 1 + 8 * 16 ** 0 = 96 + 8 = 104 0x69 = 6 * 16 ** 1 + 9 * 16 ** 0 = 96 + 9 = 105 0x65 = 6 * 16**1 + 5 * 16**0 = 96 + 5 = 101 0x68 = 6 * 16**1 + 8 * 16**0 = 96 + 8 =104 0x6f = 6 * 16**1 + 15(f) * 16**0 = 96 +15 = 111 N→0d78 a→0d97 t→0d116 s→0d115 u→0d117 i→0d105 C→0d67 h→0d104 i→0d105 e→0d101 k→0d104 o→0d111 これらを合計すると 78 + 97 + 116 + 115 + 117 + 105 + 67 + 104 + 105 + 101 + 104 + 111 =1220 よって 0x1220 これを16進数に変換すると 16 )1220 4 ------- 16 ) 76 12 = c ------- 16) 4 4 ------- 0 0x1220 = 0x4c4 参考文献 2010年度の先輩のレポート http://roy.e.koeki-u.ac.jp/~madoka/2010/r2/05/rpt/c109067.txt 先輩 B. def food(oil,ham ,egg ) oil をはかる ham を取り出す egg を割る pan = oil と hamを乗せる pan =pan に egg をかける end # 返すものは pan def toast(bread,wait,butter) bread を取り出す wait 焼けるまで待つ butter を取り出す toaster = bread を wait する toaster = toaster に butter を塗る end # 返すものは toaster food(5 cc, 1 枚, 1 個) # ハムエッグを作るので呼び出す toast(1 枚 ,3 分 ,5 g) #トーストを作るので呼び出す print("朝食の準備ができました。\n") 2.プログラム問題 i) 考えた設定 市会議員の候補者の中から当選者をX人選ぶときの組み合わせを求めるプログラ ムを設定した。 ii) 作成したプログラム #!/usr/koeki/bin/ruby def factorial(m) #メソッドの設定 if m == 1 #m が1の場合 1 else m * factorial(m-1) end # if 終わり end # def 終わり def election(candidate , elected) #メソッドの設定 factorial(candidate) / (factorial(elected) * factorial(candidate-elected)) # factorial(m)メソッドmを呼び出す # nCr= n! / (n!(n-r))を用いて計算する end # def 終わり print("市会議員の候補者の中から、当選者を何人か選ぶときの組み合わせは?\n") STDERR.printf("候補者は何人ですか?:") # 候補者数 ninzu = gets.to_i # ninzu を整数に変換 STDERR.print("当選者の人数は何人ですか?: ") # 当選者数 tousensha = gets.to_i # tousensha を整数に変換 printf("候補者が%d人ときの組み合わせは%d通りです。\n", ninzu , election(ninzu , tousensha)) iii) もとにしたプログラムからの変更点 基礎プログラミング II 第 5 回 (何度も呼び出そう) 「階乗計算」講義ノート のプログラムを参考にした。 変更点は、def election(candidate , elected) を設定した点と、組合せの計 算が出来るようにした点、候補者の人数と当選者の人数を入力出来るようにした 点である。 iv) プログラムを実行した結果画面 pan{c110165}% ./def_combination.rb [~/Ruby] 市会議員の候補者の中から、当選者を何人か選ぶときの組み合わせは? 候補者は何人ですか?:10 当選者の人数は何人ですか?: 5 候補者が10人ときの組み合わせは252通りです。 v) 考察 bc -l を用いて再度計算した。 pan{NATSUI Chieko}% bc -l [~] (10 * 9 * 8 * 7 * 6) / (5 * 4 * 3 * 2 * 1) 252.00000000000000000000 この値はプログラムの実行結果と一致するため、このプログラムは正しいといえ る。 vi) 参考文献 http://roy/~madoka/2011/r2/05/r2_05_07_theme_05_factorial.html 基礎プログラミング II 第 5 回 (何度も呼び出そう) 「階乗計算」 西村まどか B i) 考えた設定 鉛筆と消しゴムを購入したときの合計金額を求めるプログラムを設定した。 鉛筆は12本以上購入すると値段が15円から10円に変更されるようになっている。 ii) 作成したプログラム #!/usr/koeki/bin/ruby def pencil(p) # pを引数とするメソッドの設定 if p >= 12 # pが12以上の場合 p * 10 # 鉛筆の値段の合計 else # pが12以下の場合 p * 15 # 鉛筆の値段の合計 end # ifの終わり end # defの終わり def eraser(e) # eを引数とするメソッドの設定 e * 80 # 消しゴムの値段の合計 end print("鉛筆と消しゴムを購入したときの合計金額を計算します。\n") print("鉛筆は12本以上購入すると1本の値段が10円になります。\n") STDERR.print("鉛筆を何本購入しますか?:\n") enpitu = gets.to_i # 入力された鉛筆の本数を整数にする STDERR.print("消しゴムを何個購入しますか?:\n") keshigomu = gets.to_i # 入力された消しゴムの個数を整数にする total = pencil(enpitu) + eraser(keshigomu) #合計の金額を求める printf("合計 %d 円です。\n",total) # %d の中に変数totalを代入 iii) もとにしたプログラムからの変更点 基礎プログラミング II 第 5 回 (何度も呼び出そう) 「ほたるの数と米の収穫 量」の def_firefly.rb を参考にした。 変更点は プログラムに合うように変数を変更した点と入力された値によって金 額を変更するようにし、それを踏まえて合計金額を求められるようにした点である。 iv) プログラムを実行した結果画面 鉛筆を12本以上購入した場合 pan{c110165}% ./two_methods.rb [~/Ruby] 鉛筆と消しゴムを購入したときの合計金額を計算します。 鉛筆は12本以上購入すると1本の値段が10円になります 鉛筆を何本購入しますか?: 15 消しゴムを何個購入しますか?: 5 合計 550 円です。 鉛筆を12本購入した場合 pan{c110165}% ./two_methods.rb [~/Ruby] 鉛筆と消しゴムを購入したときの合計金額を計算します。 鉛筆は12本以上購入すると1本の値段が10円になります。 鉛筆を何本購入しますか?: 12 消しゴムを何個購入しますか?: 5 合計 520 円です。 鉛筆の購入量が12本以下の場合 pan{c110165}% ./two_methods.rb [~/Ruby] 鉛筆と消しゴムを購入したときの合計金額を計算します。 鉛筆は12本以上購入すると1本の値段が10円になります。 鉛筆を何本購入しますか?: 5 消しゴムを何個購入しますか?: 5 合計 475 円です。 v)考察 bc -l を用いて計算すると pan{c110165}% bc -l [~/Ruby] 15 * 10 + 5 * 80 550 鉛筆を15本、消しゴムを5個購入した場合の合計金額と一致する。 pan{c110165}% bc -l [~/Ruby] 12 * 10 + 5 * 80 520 鉛筆を12本、消しゴムを5個購入した場合の合計金額と一致する。 pan{c110165}% bc -l [~/Ruby] 5 * 15 + 5 * 80 475 鉛筆を5本、消しゴムを5個購入した場合の合計金額と一致する。 よって、このプログラムは正しいといえる。 vi) 参考文献 http://roy/~madoka/2011/r2/05/r2_05_04_appendix_01_firefly.html 基礎プログラミング II 第 5 回 (何度も呼び出そう) 「ほたるの数と米の収穫 量」 西村まどか 3.感想 機械的な操作を繰り返すものとして考えついたのは、コンピュータのログイン 画面である。例えば、このコンピュータにログインするためには自分の学籍番号と パスワードを入力しなければならない。これは機械的な操作を繰り返すものとい えるだろう。 今回のプログラムでは階乗の部分が分からなくなり、プログラムの設定に苦労し た。また、引数の名前を間違えてしまい、プログラムが動かないことがあったの で、気を付けたい。 筆記問題では16進数の計算が合わず、最初からやり直すことになった。