第5回 基礎プログラミング II レポート課題 氏名:酒井 春香 学籍番号:c109074A 語学クラス:英語3 コース:政策マネ 1、筆記問題 A.自分の名前「SAKAI HARUKA」をASCIIコードに変換すると S = 0x53 A = 0x41 K = 0x4b A = 0x41 I = 0x49 H = 0x48 A = 0x41 R = 0x52 U = 0x55 K = 0x4b A = 0x41 参考文献 西村まどか先生のHPより http://roy.e.koeki-u.ac.jp/~madoka/2010/r1/05/05_01_theme_01_asciicode.html 「基礎プログラミング I 第5回 配列の構造」 10進数に直す 0x53 = 5 * 16^1 + 3 * 16^0 = 0d83 0x41 = 4 * 16^1 + 1 * 16^0 = 0d65 0x4b = 4 * 16^1 + 11 * 16^0 = 0d75 0x41 = 4 * 16^1 + 1 * 16^0 = 0d65 0x49 = 4 * 16^1 + 9 * 16^0 = 0d73 0x48 = 4 * 16^1 + 8 * 16^0 = 0d72 0x41 = 4 * 16^1 + 1 * 16^0 = 0d65 0x52 = 5 * 16^1 + 2 * 16^0 = 0d82 0x55 = 5 * 16^1 + 5 * 16^0 = 0d85 0x4b = 4 * 16^1 + 11 * 16^0 = 0d75 0x41 = 4 * 16^1 + 1 * 16^0 = 0d65 そして、この10進数の出た値を全て足すと 83 + 65 + 75 + 65 + 73 + 72 + 65 + 82 + 85 + 75 + 65 = 805 よって、0d805 次に、0d805 を2進数表記にする。 10進数を2進数に直すためには、これを2で割って行くと、 805 / 2 = 402 余り 1 402 / 2 = 201 余り 0 201 / 2 = 100 余り 1 100 / 2 = 50 余り 0 50 / 2 = 25 余り 0 25 / 2 = 12 余り 1 12 / 2 = 6 余り 0 6 / 2 = 3 余り 0 3 / 2 = 1 余り 1 1 / 2 = 0 余り 1 これを下から並べると 1100100101 これを下から4桁ずつ区切る。 0011 = 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 3 0010 = 0 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 = 2 0101 = 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 5 よって、0x325 そこで、10進数で計算した値を16で割ると 805 / 16 = 50 余り 5 50 / 16 = 3 余り 2 3 / 16 = 0 余り 3 下から並べると、325 となる。 よって、0d805 = 0x325 となり、一致する。 B. 学校にいく前の朝の行動をプログラム風にする。 def food(gohan, nori, tamago) gohanを盛る noriを冷蔵庫から取りだす tamagoを割る dish = nori をのせる dish = tammago をのせる end def milktea(mizu, moto) mizu を温める moto を取りだす cup = mizu と moto を入れ、混ぜる end food(1杯,1枚,1個) milktea(120cc,大さじ3杯) print("朝ご飯ですよー!!\n") 2、プログラム問題 A. a.設定 お菓子箱からチロルチョコを取りだすときの組み合わせを求めるプログラム。 b.プログラム本体 #!/usr/koeki/bin/ruby def factorial(r) # 階乗を求めるmethod if r == 1 1 else r * factorial(r-1) end end def combination(n, r) # 組み合わせを求めるmethod factorial(n) / (factorial(r) * factorial(n-r)) end print("お菓子箱にチロルチョコがあります。\n") STDERR.print("何個入っていますか?\n") p = gets.chomp.to_i STDERR.print("何個取りだしますか?\n") q = gets.chomp.to_i printf("%d 個のチロルチョコから %d 個取る組み合わせは \n", p, q) if p < q # 選んだ最初の数よりも多い場合 print("ありません。正しく入力してください。\n") elsif printf(" %d 通りです。\n", combination(p, q)) end c.もとのプログラムからの変更点 昨年の先輩のレポートを参考にした。 print文を変更。 内容に応じて変数を変更。 d.実行画面 1) pan{c109074}% ./def_combination.rb [~/Ruby] お菓子箱にチロルチョコがあります。 何個入っていますか? 10 何個取りだしますか? 3 10 個のチロルチョコから 3 個取る組み合わせは 120 通りです。 2) pan{c109074}% ./def_combination.rb [~/Ruby] お菓子箱にチロルチョコがあります。 何個入っていますか? 10 何個取りだしますか? 11 10 個のチロルチョコから 11 個取る組み合わせは ありません。正しく入力してください。 e.考察 計算が合っているか確かめるためにktermで確かめ算を行なった。 1)の場合 pan{c109074}% bc -l [~/Ruby] 10*9*8 720 3*2*1 6 720/6 120.00000000000000000000 quit よって、正しい。 2)の結果より 最初の数字より多い数字を入力してもprint文が出たので 正しく機能できたことがわかる。 f.参考文献 西村まどか先生のHPより 「基礎プログラミング II 第05 回 何度も呼び出そう レポート講評 その5」 http://roy.e.koeki-u.ac.jp/~madoka/2009/r2/05/rpt/c108170.txt 「基礎プログラミング II 第05 回 何度も呼び出そう 階乗計算」 http://roy.e.koeki-u.ac.jp/~madoka/2010/r2/05/05_07_theme_05_factorial.html B. a.設定 チロルチョコとコアラのマーチの合計金額を表示させるプログラム。 コアラのマーチを5個以上買うと3割引になる。 b.プログラム本体 #!/usr/koeki/bin/ruby def choco (x) # chocoという関数を定義。仮引数はx 20 * x end def koara (y) # koaraという関数を定義。仮引数はy if y >= 5 # もし5個以上だったら3割引 ((105 * y * 0.7) + 0.5).to_i else 105 * y end end print("チロルチョコとコアラのマーチ(チョコ味)を購入したときの\n合計金額を表示します。\n\n") print("コアラのマーチを5個以上買うと3割引になります。\n\n") print("購入個数を入力してください。\n") STDERR.print("チロルチョコの購入数: ") chirol = gets.to_i STDERR.print("コアラのマーチの購入数: ") march = gets.to_i total = choco(chirol) + koara(march) # 2つの合計 printf("\n合計金額は %d 円です。\n", total) c.もとのプログラムからの変更点 昨年の先輩のレポートを参考にした。 prit文を変更。 内容に応じて変数を変更。 d.実行画面 1)チロルチョコ 10個 、 コアラのマーチ 4個 の場合 pan{c109074}% ./two_methods.rb [~/Ruby] チロルチョコとコアラのマーチ(チョコ味)を購入したときの 合計金額を表示します。 コアラのマーチを5個以上買うと3割引になります。 購入個数を入力してください。 チロルチョコの購入数: 10 コアラのマーチの購入数: 4 合計金額は 620 円です。 2)チロルチョコ 10個 、 コアラのマーチ 5個 の場合 pan{c109074}% ./two_methods.rb [~/Ruby] チロルチョコとコアラのマーチ(チョコ味)を購入したときの 合計金額を表示します。 コアラのマーチを5個以上買うと3割引になります。 購入個数を入力してください。 チロルチョコの購入数: 10 コアラのマーチの購入数: 5 合計金額は 568 円です。 e.考察 print文など正しく実行することができた。 計算が合っているか確かめるためにktermで確かめ算を行なった。 1)の場合 pan{c109074}% bc -l [~/Ruby] 20*10 200 105*4 420 200+420 620 quit よって、正しい。 2)の場合 pan{c109074}% bc -l [~/Ruby] 20*10 200 105*5*0.7+0.5 368.0 200+368 568 quit よって、正しい。 3割引も計算されている。 上記より、このプログラムは正しく機能されたといえる。 f.参考文献 西村まどか先生のHPより 「基礎プログラミング II 第05 回 何度も呼び出そう レポート講評 その3」 http://roy.e.koeki-u.ac.jp/~madoka/2009/r2/05/rpt/c108170.txt 3、感想 機械的な操作を繰り返すものはこどものおもちゃに多いと思う。 今回の課題は、どのようなプログラムにしようか考えるまでに時間がかかったが、 思いついてからはどうにか形になったと思う。 今回は、高校の数学で習った順列や組み合わせを求めるプログラムを習った。 順列や組み合わせの公式など忘れているとこが多かったので復習が大切だと思っ た。 共同学習者 佐竹 聡美 / 横山 広樹