第 5 回 何度も呼び出そう レポート課題 氏名:照井さつき 学籍番号:C1101589 語学クラス:中国語3 コース(系):政策マネジメント ========== 筆記問題 ========== 1A.まず名前をローマ字に直すと Terui Satsuki となるので、 これを16進数に直すと T:0x54 e:0x65 r:0x72 u:0x75 i:0x69 S:0x53 a:0x61 t:0x74 s:0x73 u:0x75 k:0x6b i:ox69 となる。 これをそれぞれ10進数に直し、足算をしてふたたび16進数に直す。 例) T の場合 先ずは10進数に直す それぞれ十の位は16の1剰、一の位は16の0剰を掛ける。 T:0x54 = 5*16**1 = 80 4*16**0 = 4 80 + 4 = 84 となる。 このやり方で全てを10進数に直すと、 T:0x54 = 84 e:0x65 = 176 r:0x72 = 114 u:0x75 = 117 i:0x69 = 105 S:0x53 = 83 a:0x61 = 97 t:0x74 = 116 s:0x73 = 115 u:0x75 = 117 k:0x6b = 107 i:ox69 = 105 となる。 これを全て足すと、 84 + 176 + 114 + 117 + 105 + 83 + 97 + 116 + 115 + 117 + 107 + 105 = (0d)1136 そしてこれを 16進数に直すには 16 で割ればいいので、 16)1136 … 0 ----- 16) 71 … 7 ----- 16) 4 … 4 ----- 0 これを下から並べると 470 となる。 よって 0x470 となる。 また、合っているか確かめるために別の方法(2進数→16進数)で16進数に直す。 2進数にするには、2で割ればいいため、 2) 1136 … 0 ----- 2) 568 … 0 ----- 2) 284 … 0 ----- 2) 142 … 0 ----- 2) 71 … 1 ----- 2) 35 … 1 ----- 2) 17 … 1 ----- 2) 8 … 0 ----- 2) 4 … 0 ----- 2) 2 … 0 ----- 1 これを下から並べると、10001110000となり 0d1136 = 0b10001110000となる。 そしてこれを 4桁毎に区切って16進数に直すと、 (0)100 0111 0000 = 4 7 0 となり、 0x470となる。 どちらの方法でも0x470となる。 よって、0d1136 = 0x470 である。 ---------- 1B.お茶の作り方をプログラミング風にした。 def tea(tbag,water,boil) tbag を 取り出す。 #ティーバッグ water を 湧かす。 火で boil する。 oyu = boil * water #お湯を作る。 finish = oyu + tbag end tea(1個, 100ml, 5分) #作り方を呼び出す。 print("簡単にできますね!\n") ========== プログラミング問題 ========== 2A. ---------- a.考えた設定 ---------- 全て違う種類のクッキーを選んだときの組み合わせを求めるプログラム ---------- b.作成したプログラム ---------- #!/usr/koeki/bin/ruby def factorial(n) #メソットの設定 if n == 1 #nが1のとき、 1 #1を返す。 else #nが1以外のとき n * factorial(n-1) #一つ少ない数字をかける end end def choose(cookie,sort) # メソットの設定 if cookie == sort # cookie と sort が同じ数の場合 1 # 1を返す else # それ以外の場合 factorial(cookie) / (factorial(sort) * factorial(cookie-sort)) # mCn = m! / (n!(m-n)) end end STDERR.print("1種類 1個のクッキーが30個あります。\n") STDERR.printf("クッキーは何個選ぶ?:") ck = gets.to_i #入力した数字をckに代入 kind = 30 #クッキーの全体数 if kind < ck #クッキーより選ぶ量が多い場合 print("そんなにクッキーはありません!\n") else #メンバーの方が役職より多い場合 printf(" %d 個選んだときの組み合わせは、%d 通りです。\n",ck,choose(kind,ck)) end ---------- c.実行結果 ---------- <正しいとき> pan{c110158}% ./def_combination.rb [~/Ruby] 1種類につき 1個のクッキーが30個あります。 クッキーを何個選ぶ?:2 2 個選んだときの組み合わせは、435 通りです。 <全体数より多く選んだ場合> pan{c110158}% ./def_combination.rb [~/Ruby] 1種類につき 1個のクッキーが30個あります。 クッキーを何個選ぶ?:40 そんなにクッキーはありません! ---------- d.結果の考察 ---------- pan{c110158}% ./def_combination.rb [~/Ruby] 1種類につき 1個のクッキーが30個あります。 クッキーを何個選ぶ?:2 2 個選んだときの組み合わせは、435 通りです。 30種類のうちから2個選んだときの組み合わせの求め方は、 nCr=n!/r!(n-r)! であり、n*(n-1)*(n-2).../r! という風に、rの個数だけ 階乗させる。 30C2 30C2 = 30! / 2! となるので 30 * 29 / 2 * 1 = 15 * 29 = 435 これをbc -lで計算すると pan{c110158}% bc -l [~] 30*29/2*1 435.00000000000000000000 となり、このプログラムが合っていることが分かった。 ========== 3.感想 ========== 機械的な操作を繰り返すものというと、自転車が思い出された。 今回のプログラミングは、基礎の計算式自体を思い出せなかったため、 Bの問題まで進むことが出来なかった。 まずそこからなんとかしていかなければいけないと思った。 ========== 参考文献 ========== 基礎プログラミング II 第 5 回 「何度も呼び出そう」 http://roy/~madoka/2011/r2/05/ 西村まどか