第5回 基礎プログラミング II レポート課題 再提出 氏名:笹原千珠子 学籍番号:c109080A 語学クラス:英語3 コース(系):政策マネジメント ---- 再提出での変更点 1)添付できなかったデータの添付 2)解説の追加 1. A. ASCII コードで自分の名前を表すと S = 0x53 a = 0x61 s = 0x73 a = 0x61 h = 0x68 a = 0x61 r = 0x72 a = 0x61 C = 0x43 h = 0x68 i = 0x69 z = 0x7a u = 0x75 k = 0x6b o = 0x6f 16進数で計算 アルファベットは表を見るなどして繰り上げを意識して足す。 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 苗字 53 b4 127 188 1f0 + 61 + 73 + 61 + 68 + 61 ----- ----- ----- ----- ---- b4 127 188 1f0 251 251 2c3 + 72 + 61 ----- ----- 2c3 324 苗字 324 アルファベットは表を見るなどして繰り上げを意識して足す。 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 名前 43 ab 114 18e 203 26e + 68 + 69 + 7a + 75 + 6b + 6f ----- ----- ----- ----- ----- ----- ab 114 18e 203 26e 3dd 名前 3dd 苗字 + 名前 324 +3dd ----- 701 答えは 0x3dd 10進数の計算 まず16進数を2進数に直して10進数にする S = 0x53 = 1 0 1 0 0 1 1 * * * * * * * 64 32 16 8 4 2 1 64 0 16 0 0 2 1 答えは 0d = 83 これを繰り返す 0x 0b 0d a = 61 = 1100001 = 97 s = 73 = 1110011 = 115 a = 61 = 1100001 = 97 h = 68 = 1101000 = 104 a = 61 = 1100001 = 97 r = 72 = 1110010 = 114 a = 61 = 1100001 = 97 C = 43 = 1000011 = 67 h = 68 = 1101000 = 104 i = 69 = 1101001 = 105 z = 7a = 1111010 = 122 u = 75 = 1110101 = 117 k = 6b = 1101011 = 107 o = 6f = 1101111 = 111 答えは 0d1537 求めた答えは 0x = 0d になるはずだが、 計算してみた結果、 16進数の計算 0x3dd = 0x989 10進数の計算 0d1537 =0x601 で一致しなかった。おそらく16進数の繰り上げで間違ったと思われるが、 自分ではここまでしか計算できなかった。 参考文献:ウェブページ 2進数と16進数の計算 http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/keisan.html 2進数、16進数と10進数 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html B.歯みがきの動作をプログラム風に書いた. def brushing(toothbrush, toothpaste, mouth) toothbrush を取り出す migaku = toothbrush に toothpaste をつける migaku += mouth を磨いてすすぐ end brushing(1本, 1g, 1回) #歯みがきをするのでよびだす print("おはよう。1日がはじまります。\n") 2. 設定 お菓子が何種類あるか入力して何個取るか入力すると答えが出るプログラム #!/usr/koeki/bin/ruby def factorial(m) #階乗の計算 if m == 1 #もし m が 1 と等しければ return 1 # 1 を返す else #それ以外なら m * factorial(m-1) # m に m から 1 引いたものを掛ける end # if の終わり end # defの終わり def combination(n,m) if n == m #種類と個数が同じなら return 1 #1を返す elsif n < m #選んだ数が多いときに終了する print("選ぶ数がお菓子の種類より多いです。\nもう一度やり直してください。\n") exit else factorial(n)/(factorial(m)*factorial(n-m)) #組み合わせの公式 end end STDERR.print("お菓子の組み合わせ\n") STDERR.print("何種類?:") n = gets.chomp.to_i #入力した種類をもってくる STDERR.print("何個?:") m = gets.chomp.to_i #入力した個数をもってくる STDERR.printf("全部で%d個、その中から%d個選ぶと、%d種類。",n , m, combination(n,m)) #最後にどういう結果になったかを表示させる 変更点 def_factorial.rb をもとに入力ミスしたとき、一度出るようにしたりした。 その他、去年の先輩の講評ページなどを参考にして組み合わせの公式をプログラ ムでも再現できるようにした。 参考文献 組合わせ(1) http://www.kwansei.ac.jp/hs/z90010/sugaku1/kakuritu/combi1/combi1.htm 基礎プログラミング II 第5回 何度も呼び出そう 「階乗計算」 (講義ノート) 西村まどか http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 基礎プログラミング II 第05回 何度も呼び出そう レポート講評 西村まどか http://roy/~madoka/2009/r2/05/crt.html 結果 3種類の中から2こ選んだ場合 pan{c109080}% ./def_combination.rb [~/Ruby] お菓子の組み合わせ 何種類?:3 何個?:2 全部で3個、その中から2個選ぶと、3種類。% 種類よりも多く選んだ場合 pan{c109080}% ./def_combination.rb [~/Ruby] お菓子の組み合わせ 何種類?:2 何個?:5 選ぶ数がお菓子の種類より多いです。 もう一度やり直してください。 考察 3種類の中から2こ選んだときの計算をしてみると 3・2 3C2 = -------- = 3 2・1 で計算は当っていたのできちんと動いているといえる。 種類よりも多く選んでしまったときも、文章がきちんと表示された。 3. 万歩計が揺れるたびに歩数が増えて機械的な操作を繰り返しているとおもった。 階乗の計算など高校でやったきり忘れていたのでよけいに難しかった。 便利なプログラムをつくるにはこういう公式を入れる必要があることがわかった。 共同学習者:金田麻美