第5回 基礎プログラミング II レポート課題 氏名: xxxxxxxxx 学籍番号:c109xxx 語学クラス:中国語1 コース(系):環境サイエンス 1、筆記問題 ================================================================= A、 私の名前は小松由里なので、アルファベットになおすと、komatsu yuri になる。 ASCIIコード表を参考に16進数になおすと、 k = 0x6b o = 0x6f m = 0x6d a = 0x61 t = 0x74 s = 0x73 u = 0x75 y = 0x79 u = 0x75 r = 0x72 i = 0x69 となる。 文字コードを全て足していく。 計算方法は 0x6B(k) + 0x6F(o) を例に挙げて計算する。 それぞれを10進数に沿って数字になおしていくと、以下のようになる。 6B = 6 11 6F = 6 15 次に、1の位・10の位というように分け、足し算を行なう。 < 1 の位> 11 + 15 = 26 再度16進数になおすので、計算結果を 16 で割る。 26 / 16 = 1 余り 10 この際に出た余りはそのまま下に降ろす。10 は16進数になおすと A となり、 1 は繰り上がる。 < 10 の位> 6 + 6 + 1(繰り上がった 1) = 13 13 を16進数になおすと D となる。 よって、0x6B + 0x6F = DA となることが分かる。 以下、このような方法で計算した。 文字コードを全て足していくと、 6B + 6F = DA DA + 6D = 147 147 + 61 = 1A8 1A8 + 74 = 21C 21C + 73 = 28F 28F + 75 = 304 304 + 79 = 37D 37D + 75 = 3F2 3F2 + 72 = 464 464 + 69 = 4CD 結果 0x4CD となる。 次に、10進数になおす。 16進数を10進数になおすには、16をかけていく。 また、16進数で表示されているので、10進数表で確認しながら10進数になおした。 0x6b = 6 * 16^1 + 11 * 16^0 = 107 0x6f = 6 * 16^1 + 15 * 16^0 = 111 0x6d = 6 * 16^1 + 13 * 16^0 = 109 0x61 = 6 * 16^1 + 1 * 16^0 = 97 0x74 = 7 * 16^1 + 4 * 16^0 = 116 0x73 = 7 * 16^1 + 3 * 16^0 = 115 0x75 = 7 * 16^1 + 5 * 16^0 = 117 0x79 = 7 * 16^1 + 9 * 16^0 = 121 0x75 = 7 * 16^1 + 5 * 16^0 = 117 0x72 = 7 * 16^1 + 2 * 16^0 = 114 0x69 = 6 * 16^1 + 9 * 16^0 = 105 上記の結果となった。 よって、以下のようになる。 k = 0d107 o = 0d111 m = 0d109 a = 0d 97 t = 0d116 s = 0d115 u = 0d117 y = 0d121 u = 0d117 r = 0d114 i = 0d105 文字コードを全て足すと、 107 + 111 + 109 + 97 + 116 + 115 + 117 + 121 + 117 + 114 + 105 = 1229 よって、0d1229 となる。 これを16進数になおすために16で割る。 1229 / 16 = 76 余り 13 76 / 16 = 4 余り 12 12 / 16 = 0 余り 4 下から読み上げると、4、12、13 となり、 16進数になおすと、 4、 C、 D となる。 結果、0x4CD = 0d1229(=0x4CD) となるので、答えは一致しているといえる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ B、 ティータイムの準備をするときの準備手順をプログラム風に書き直します。 def coffee(mame, oyu, milk, satou) # メゾット mame を挽く oyu を湧かす milk を入れる suger を入れる coffee = mame に oyu を注ぐ coffee = coffee に milk を注ぐ coffee = coffee に suger を注ぐ end # def 終わり。coffee を返す。 def cookie(komugi, satou, tamago, butter ) komugi をふるう satou をふるう tamago を割る butter を常温に戻す make = komugi に satou を入れる make = make に tamago を入れる make = make に butter を入れ 混ぜる end # def 終わり。make を返す。 coffee(200 g, 300 cc, 100 cc, 10 g) # 珈琲を作るので呼び出す cookie(300 g, 50 g, 2 個, 150 g) # クッキーを作るので呼び出す print("ティータイムにしましょう!\n") 2、プログラム問題 ============================================================ A、 a、考えた設定 社員の中から会議出席者に選ばれる社員の組み合わせを求めるプログラム。 b、作成したプログラム(def_combination.rb) #!/usr/koeki/bin/ruby def factorial(m) # メゾット if m == 1 # m が 1 だったら 1 else m * factorial(m-1) end # if 終わり。 end # def 終わり。 def erabu(a, b) factorial(a) / (factorial(b) * factorial(a-b)) # mCn = m! / (n!(m-n)) end # def 終わり。 print("会社の社員の中から、会議出席者を選ぶ。\n") print("\n") print("会議出席者に選ばれる社員の組み合わせは何通りか?\n") print("\n") STDERR.print("全社員数(人): ") # 全社員数 ninzu = gets.to_i # 入力された文字列を整数になおす。 STDERR.print("選ばれる社員数(人): ") # 選ばれる社員数 syain = gets.to_i printf("%d人選んだときの組み合わせは%d通りです。\n",syain , erabu(ninzu,syain)) c、もとにしたプログラム プログラム def_factorial.rb を参考にした。 def、print文、STDERR.print文、gets.to_i を付け足した。 d、実行結果 pan{c109067}% ./def_combination.rb [~/Ruby] 会社の社員の中から、会議出席者を選ぶ。 会議出席者に選ばれる社員の組み合わせは何通りか? 全社員数(人): 10 選ばれる社員数(人): 3 3人選んだときの組み合わせは120通りです。 e、考察 上記の数値を数式に当てはめると 10 C 3 = 10 * 9 * 8 / 3 * 2 * 1 このようになる。 bc -l で計算すると、 pan{c109067}% bc -l [~/Ruby] (10 * 9 * 8) / (3 * 2 * 1) 120.00000000000000000000 結果 120 通りとなり、プログラムの計算は正しいといえる。 次に、全社員数よりも選ばれる社員数の方が多い数値で計算をしてみる。 pan{c109067}% ./def_combination.rb [~/Ruby] 会社の社員の中から、会議出席者を選ぶ。 会議出席者に選ばれる社員の組み合わせは何通りか? 全社員数(人): 10 選ばれる社員数(人): 20 ./def_combination.rb:4:in `factorial': stack level too deep (SystemStackError) from ./def_combination.rb:7:in `factorial' from ./def_combination.rb:12:in `erabu' from ./def_combination.rb:27 結果、エラーが出てしまった。 エラーが出たのは、全社員数よりも選ばれる社員数の方が多い場合の設定をして いなかったためのようなので、if 文を付け足して、新たにプログラムを作成して みた。 プログラム(def_combination2.rb) #!/usr/koeki/bin/ruby def factorial(m) # メゾット if m == 1 # m が 1 だったら 1 else m * factorial(m-1) end # if 終わり。 end # def 終わり。 def erabu(a, b) factorial(a) / (factorial(b) * factorial(a-b)) # mCn = m! / (n!(m-n)) end # def 終わり。 print("会社の社員の中から、会議出席者を選ぶ。\n") print("\n") print("会議出席者に選ばれる社員の組み合わせは何通りか?\n") print("\n") STDERR.print("全社員数(人): ") # 全社員数 ninzu = gets.to_i # 入力された文字列を整数になおす。 STDERR.print("選ばれる社員数(人): ") # 選ばれる社員数 syain = gets.to_i if ninzu < syain print("\n") print("選ばれる社員数が全社員数よりも多いです!\n") else printf("%d人選んだときの組み合わせは%d通りです。\n",syain , erabu(ninzu,syain)) end 実行結果 pan{c109067}% ./def_combination2.rb [~/Ruby] 会社の社員の中から、会議出席者を選ぶ。 会議出席者に選ばれる社員の組み合わせは何通りか? 全社員数(人): 10 選ばれる社員数(人): 20 選ばれる社員数が全社員数よりも多いです! 今度はエラーでなく、全社員数よりも選ばれる社員数の方が多い場合、print文 で設定した文章が表示されるようになった。 f、参考文献 最後に記載 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ B、 a、考えた設定 method を2つ使用するプログラム (お菓子を買い、飲み物を10本以上買った場合5割り引きする設定) b、作成したプログラム(two_methods.rb) #!/usr/koeki/bin/ruby def nedan(okasi) # メゾット(お菓子の価格を表す) 250 * okasi # 250 * お菓子の数 end # def 終わり def waribiki(juce) # メゾット(飲み物の価格を表す) if juce >= 10 # もし飲み物が10本以上なら 150 * juce * 0.5 # 200 * 飲み物の本数 * 0.5 else 150 * juce # 200 * 飲み物 end # if 終わり end # def 終わり STDERR.print("お菓子の値段は 1 個 250 円で、飲み物は 1 個 150円です。\n") print("\n") STDERR.print("飲み物を 10 本買うと 5 割り引きになります。\n") print("\n") STDERR.print("お菓子を何個買いますか?\n") kazu1 = gets.to_i # 入力された文字列を整数になおす STDERR.print("飲み物は何個買いますか?\n") kazu2 = gets.to_i goukei = nedan(kazu1) + waribiki(kazu2) # 合計金額 = 値段 + 割り引き額 printf("合計は %d 円です。\n",goukei) c、もとにしたプログラム プログラム def_firefly.rb を参考にした。 作成した問題に合わせ、値・計算式を変更した。 d、実行結果 pan{c109067}% ./two_methods.rb [~/Ruby] お菓子の値段は 1 個 250 円で、飲み物は 1 個 150円です。 飲み物を 10 本買うと 5 割り引きになります。 お菓子を何個買いますか? 5 飲み物は何個買いますか? 12 合計は 2150 円です。 e、考察 上記の問題を bc -l で計算して確かめると、 pan{c109067}% bc -l [~/Ruby] 5 * 250 + 12 * 150 * 0.5 2150.0 quit となり、プログラムの実行結果と一致しているため、プログラムは正しいといえ る。 念のため、飲み物が10本に満たない場合・何も買わない場合 でも計算してみる。 <飲み物が10本に満たない場合> pan{c109067}% ./two_methods.rb [~/Ruby] お菓子の値段は 1 個 250 円で、飲み物は 1 個 150円です。 飲み物を 10 本買うと 5 割り引きになります。 お菓子を何個買いますか? 5 飲み物は何個買いますか? 5 合計は 2000 円です。 bc -l で計算すると、 pan{c109067}% bc -l [~/Ruby] 5 * 250 + 5 * 150 2000 quit <何も買わない場合> pan{c109067}% ./two_methods.rb [~/Ruby] お菓子の値段は 1 個 250 円で、飲み物は 1 個 150円です。 飲み物を 10 本買うと 5 割り引きになります。 お菓子を何個買いますか? 0 飲み物は何個買いますか? 0 合計は 0 円です。 飲み物が10本に満たない場合・何も買わない場合のそれぞれの合計金額はプログ ラム実施結果と一致している。なので、プログラムは値を正しく読み込み、計算 をしているということが言える。 f、参考文献 最後に記載 3、感想 ====================================================================== 機械的な操作を繰り返すものとしては、自動ドア・オルゴール・エスカレーター・ 改札口などが挙げられると思う。 今回の課題は内容を理解していくのにとても時間がかかった。友達に教えてもら い、プログラムの分からない部分を質問しながらようやくなんとか理解していく ことができた。友達には本当に助けてもらった。 再度自分でプログラムを確認しながら復習していきたい。 また、筆記問題の16進数の足し算の手順がなかなか分からなかったが、計算の手 順が理解できたのが嬉しかった。その結果、10進数の計算結果を間違えているこ とに気が付くことができた。なので再度計算しなおしたところ、答えが一致し、 正しい答えを求められたのでよかった。 4、参考文献 ================================================================== 西村 まどか 基礎プログラミング I 第4回 プログラミングの方法 http://roy/~madoka/2010/r1/04/ 「16 進数のまとめ」 http://roy/~madoka/2010/r1/04/04_13_appendix_03_hexdecimal.html 基礎プログラミング II 第5回 何度も呼び出そう http://roy/~madoka/2010/r2/05/ 「階乗計算」 http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 「ほたるの数と米の収穫量」 http://roy/~madoka/2010/r2/prog/def_firefly.rb 大原英郁 Oharaのゲームプログラミング入門 http://www.geocities.co.jp/SiliconValley-SanJose/7769/index.html ハード基礎 http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/menu.html 2進数と16進数の計算 http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/keisan.html 共同学習者 青木 千紗 久保田 瑛一郎 横山 広樹