第5回 基礎プログラミング II レポート課題 氏名: 金田麻美 学籍番号: C1090466 語学クラス: 英語3 コース(系): 政策マネジメント 1-A. Kaneta Asami を、ASCIIコードで表すと、 K = 0x4b a = 0x61 n = 0x6e e = 0x65 t = 0x74 a = 0x61 A = 0x41 s = 0x73 a = 0x61 m = 0x6d i = 0x69 である。 これを地道に足していく。 16進数の足し算は、9以上のアルファベットと繰り上がりに気をつけるだけで、 10進数の足し算のように計算することができる。 4b + 61 = ac ac + 6e = 11a 11a + 65 = 17f 17f + 74 = 1f3 1f3 + 61 = 254 254 + 41 = 295 295 + 73 = 308 308 + 61 = 369 369 + 6d = 3d6 3d6 + 69 = 43f 合計は 0x43f 次に16進数を10進数に直す。16進数から10進数への変換は、 1の位から順に16の0乗、16の1乗... といったように計算することでできる。 f(15) * (16 ** 0) = 15 * 1 = 15 3 * (16 ** 1) = 3 * 16 = 48 4 * (16 ** 2) = 4 * 256 = 1024 合計すると 1087 なので、0x43f = 0d1087 である。 答えは全て出たので確かめを行なう。 0x43f = 0d1087 を証明するために、10進数 0x1087 を16進数に変換する。 変換は、10進数を商が0になるまで16で割っていき、 生じた余りを最後の方から並べて16進数に当てはめる方法をとる。 1087 / 16 = 67 15 67 / 16 = 4 3 4 / 16 = 0 4 (確かめ) 16 * 67 + 15 = 1087 16 * 4 + 3 = 67 16 * 0 + 4 = 4 余りを最後の方から並べると 4 3 15 これを 16進数に当てはめると 43f となるため、 0x43f = 0d1087 は正しいと証明された。 1-B. 朝起きてから家を出るまでの行程をプログラム風に書き直す。 def mijitaku(hamigaki, sengan, kigae) print("おはよう。元気出していこう。\n") hamigaki をする sengan をする kigae をする kanryo = hamigaki, sengan, kigae を完了させる end # 返すものは kanryo def asagohan(gohan, misoshiru, medamayaki) gohan をよそう misoshiru をよそう medamayaki を焼く obon = gohan, misoshiru, medamayaki をのせる end # 返すものは obon mijitaku(しっかり, しっかり, 寒くない格好) # 身仕度をするので呼び出す asagohan(1杯, 1杯, 1つ) # 朝食を作るので呼び出す print("さあ、学校に行こう。\n") ------------------------------------------------- 2. Aだけを選択した。 2-a. 授業で作成した def_factorial.rb を基にして、 11のうち3つをまとめると何通りの組み合わせが出来るかを演算する プログラム def_combination.rb を作成した。 2-b. #!/usr/koeki/bin/ruby def combination(m) # 組み合わせを求めるmethod if m == 1 # m が1だったら答えは1 1 else # 1じゃなかったら m * combination(m-1) # 階乗の式 end # def の end end # if の end all = 11 # 全体の数は 11 choice = 3 # 選ぶ数は 3 answer = all - choice # 組み合わせを求める式に必要な部分。全体 - 選ぶ数 print("箱に入っているボールは 11個 です。\n3個 ずつの組み合わせを作ります ...\n") sleep 3 # 3秒待つ printf("\n11個のボールで 3個 ずつの組み合わせは %d 通り作れます。\n", combination(all)/(combination(choice)*combination(answer))) # 組み合わせを求める式。この場合 11!/(3! 11-3!) = 11!/(3! 8!) 2-c. def_combination.rb からの大きな変更は、組み合わせを求める式 x!/(y! x-y!) を付け加えたことと、この式を使うための変数を設けた点である。 all = 11 # 全体の数は 11 choice = 3 # 選ぶ数は 3 answer = all - choice # 組み合わせを求める式に必要な部分。全体 - 選ぶ数 combination(all)/(combination(choice)*combination(answer)) この2つの部分である。 その他は sleep の使用や、method名の変更などの細々としたものである。 2-d. pan{c109046}% ./def_combination.rb [~/Ruby] 箱に入っているボールは 11個 です。 3個 ずつの組み合わせを作ります ... 11個のボールで 3個 ずつの組み合わせは 165 通り作れます。 pan{c109046}% [~/Ruby] 表示は問題ない。 2-e. 組み合わせを求める公式 x!/(y! x-y!) に、今回の設定の数字を代入すると、 11!/(3! 11-3!) = 11!/(3! 8!) となる。 11!/(3! 8!) = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 / (3 * 2 * 1 * 8 * 7 * 6 * 5 * 4 * 3 * 2 *1) bc -l で計算してみると pan{c109046}% bc -l [~/Ruby] 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 / (3 * 2 * 1 * 8 * 7 * 6 * 5 * 4 * 3 * 2 *1) 165.00000000000000000000 quit pan{c109046}% [~/Ruby] 答えは165で、プログラムの実行結果と一致しているため、 このプログラムは正しいといえる。 3. 機械的な動作を繰り返すものとしては、アナログ時計が代表的だと思う。 人間がする機械的な動作としては、なわとびが考えられる。 また、トラックを何周もするような長距離走も、機械的といっていいと思う。 人間が行う機械的な動作は、陸上、水泳などのトラック競技に多いと思う。 今回のレポートは進数変換問題に、多くの時間をかけた。 そのおかげで自分の中でかなり進数法のしくみや計算方法が整理できてきた。 プログラムの方は、難しいと感じた前回よりも更に難しく、 今までで一番大変だった。 しかし自分の中で、数学の理解が不足だということがはっきりわかったので、 前向きに、勉強する機会としてがんばろうと思う。 いつまでも数学から逃げるのは無理ということも自覚したので、 初歩の参考書でも購入して、将来に備えたいと思う。 参考文献 基礎プログラミング II 第5回 何度も呼び出そう 「階乗計算」 http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 著者: 西村まどか 組合せの考え方と公式 http://www.ne.jp/asahi/license/ikawa17/info_2/kougi/kougi106.html 著者: 不明 共同学習者: 笹原千珠子