第 5 回 何度も呼び出そう レポート課題 氏名:菊地瑞紀 学籍番号:c1100673 語学クラス:英語6 コース(系):地域共創コース 1-A まず、kikuchimizuki を16進数に変換します。 (k) 0x6b (i) 0x69 (k) 0x6b (u) 0x75 (c) 0x63 (h) 0x68 (i) 0x69 (m) 0x6d (i) 0x69 (z) 0x7a (u) 0x75 (k) 0x6b (i) 0x69 これを10進数になおしていくと (k) 0x 6b → 6 11 # 0xは 16進数を表しているものです。 (i) 0x 69 → 6 9 (k) 0x 6b → 6 11 (u) 0x 75 → 7 5 (c) 0x 63 → 6 3 (h) 0x 68 → 6 8 (i) 0x 69 → 6 9 (m) 0x 6d → 6 13 (i) 0x 69 → 6 9 (z) 0x 7a → 7 10 (u) 0x 75 → 7 5 (k) 0x 6b → 6 11 (i) 0x 69 → 6 9 それぞれの一の位、十の位と分けて足していきます。 【一の位】 (k) 11 + (i) 9 = 20 これをまた16進数になおすので16で割ります。 20 / 16 = 1 余り 4 4を16進数になおすと 4 となります。 また、1は繰り上がります。 【十の位】 (k) 6 + (i) 6 + 1 = 12 # 1は1の位で繰り上がったときのもの = 13 これを16進数になおすと = d よって、 (k) と (i) を足すと d4 となります。 この計算方法で上から順に足していきます。 6b + 69 = d4 d4 + 6b = 13f 13f + 75 = 1b4 1b4 + 63 = 217 217 + 68 = 27f 27f + 69 = 2e8 2e8 + 6d = 355 355 + 69 = 3be 3be + 7a = 438 438 + 75 = 4ad 4ad + 6b = 518 518 + 69 = 581 よって、全て足すと 0x581 になりました。 ----------------------------------------------------------------- 次に、10進数に変換します。 (k) 0x6b = 6 * 16 + 11 ( 6 * 16^1 + 11 * 16^0) = 107 (i) 0x69 = 6 * 16 + 9 = 105 (k) 0x6b = 6 * 16 + 11 = 107 (u) 0x75 = 7 * 16 + 5 =117 (c) 0x63 = 6 * 16 + 3 = 99 (h) 0x68 = 6 * 16 + 8 = 104 (i) 0x69 = 6 * 16 + 9 = 105 (m) 0x6d = 6 * 16 + 13 = 109 (i) 0x69 = 6 * 16 + 9 = 105 (z) 0x7a = 7 * 16 + 10 = 122 (u) 0x75 = 7 * 16 + 5 =117 (k) 0x6b = 6 * 16 + 11 = 107 (i) 0x69 = 6 * 16 + 9 = 105 これを全て足していきます。 = 107 + 105 + 107 + 117 + 99 + 104 + 105 + 109 + 105 + 122 + 117 + 107 +105 = 1409 1409 を16進数に変換 ! 16でひたすら割ります。 16 )1409 1 ------ 16 ) 88 8 ------ 5 この余りを下から順によんでみると、 581 で同じになります。 1-B 毎朝の化粧ををプログラム風に書いてみました。 def makeup(foundation, eyeline, lipstick) foundation をぬる eyeline を引く face = foundation と lipstick をぬる face = face に eyeline を引く end # face を返す makeup(40秒, 90秒 , 20秒) # 化粧をするので呼び出す print("可愛いはつくれるのだ! いってきます!\n") #メッセージ 2-A [プログラムの設定] 部員の中から部長を選抜するために、その候補を何人か選ぶプログラム [プログラム本体] #!/usr/koeki/bin/ruby def factorial(b) # b は buin の b if b == 1 # b が 1 のとき 1 # 1 とする else # それ以外だったら、 b * factorial(b-1) # b に b より 1 小さい数を掛ける end # if の終わり end # def の終わり def combination(buin,kouho) #関数をつくる if buin == kouho # buin,kouhoが同じ数だった場合 1 # 1を呼び出します else #それ以外だったら、 factorial(buin)/(factorial(kouho) * factorial(buin-kouho)) # 組合せの計算 # 組合せの公式は # n! # nCr = -------- # r!(n-r)! # # このとき n は変数buinで r は変数kouhoである end # if の終わり end # factional の終わり STDERR.printf("部員の数は何人ですか:") member = gets.to_i # 部員の数を入力 to_i で整数に変換 STDERR.printf("候補者は何人選びますか:") choice = gets.to_i # 候補者の数を入力 to_iで整数に変換 printf("部員%d人の中から候補者%d人選ぶ組み合わせは%d通りです。\n",member,choice,combination(member,choice)) # 結果を表示する [実行結果] pan{c110067}% ./def_combination.rb [~/Ruby] 部員の数は何人ですか:5 候補者は何人選びますか:2 部員5人の中から候補者2人選ぶ組み合わせは10通りです。 部員の数より候補者の数を多くして実行すると pan{KIKUCHI Mizuki}% ./def_combination.rb [~/Ruby] 部員の数は何人ですか:12 候補者は何人選びますか:23 ./def_combination.rb:7:in `factorial': stack level too deep (SystemStackError) from ./def_combination.rb:7:in `factorial' from ./def_combination.rb:16:in `combination' from ./def_combination.rb:39 エラーがでてしまいました。 改善しましょう! [Aからの改善] プログラムAで部員の数より候補者の数を多く入力したときにエラーが出たので、 プログラムを改善しました。 [プログラム本体] #!/usr/koeki/bin/ruby def factorial(b) # b は buin の b if b == 1 # b が 1 のとき 1 # 1 とする else # それ以外だったら、 b * factorial(b-1) # b に b より 1 小さい数を掛ける end # if の終わり end # def の終わり def combination(buin,kouho) #関数をつくる if buin == kouho # buin,kouhoが同じ数だった場合 1 # 1を呼び出します else #それ以外だったら、 factorial(buin)/(factorial(kouho) * factorial(buin-kouho)) # 組合せの計算 # 組合せの公式は # n! # nCr = -------- # r!(n-r)! # # このとき n は変数buinで r は変数kouhoである end # if の終わり end # factional の終わり while true STDERR.printf("部員の数は何人ですか:") member = gets.to_i # 部員の数を入力 to_i で整数に変換 STDERR.printf("候補者は何人選びますか:") choice = gets.to_i # 候補者の数を入力 to_iで整数に変換 if choice > member # 入力された候補者の数が部員より多い場合 print("部員よりも候補者の人数が多いようです。 もう一度入力して下さい。\n") # メッセージを表示 redo #もう一度入力させる else printf("部員%d人の中から候補者%d人選ぶ組み合わせは%d通りです。\n",member,choice,combination(member,choice)) # 結果を表示する break #繰り返しから抜ける end end [実行結果] pan{c110067}% ./def_combination.rb [~/Ruby] 部員の数は何人ですか:12 候補者は何人選びますか:23 部員よりも候補者の人数が多いようです。 もう一度入力して下さい。 部員の数は何人ですか:12 候補者は何人選びますか:5 部員12人の中から候補者5人選ぶ組み合わせは792通りです。 [計算の確認] pan{KIKUCHI Mizuki}% bc -l [~/Ruby] (12*11*10*9*8*7*6*5*4*3*2*1)/(5*4*3*2*1*7*6*5*4*3*2*1) 792.00000000000000000000 [変更点] 授業で作成した def_factorial.rb をもとに作成しました。 関数の計算式は組合せの公式 n! nCr = --------- r!(n-r)! を使いました。 部員の数より候補者の数が多くなるとエラーがでてしまったので、if文を使って 場合分けをしました。 候補者の数を多く入力してしまった場合に、もう一度入力をうながすようにしま した。 [考察] 実行したところ、部員より候補者の数が多いともう一度入力をうながされるよう になりました。 pan{c110067}% ./def_combination.rb [~/Ruby] 部員の数は何人ですか:5 候補者は何人選びますか:2 部員5人の中から候補者2人選ぶ組み合わせは10通りです。 5人の中から3人選ぶ組合せは、 5*4*3*2*1 5C3 = ------------- 3*2*1 (5-3)! 120 = --------- 12 = 10 なので 10通りであることがわかります。 bc -l で確認してみると pan{c110067}% bc -l [~/Ruby] (5*4*3*2*1)/(3*2*1*2*1) 10.00000000000000000000 10通りであることが確認されました。 よって、このプログラムは正しく計算出来ています。 3 機械的な操作を繰り返すものの例として、駅の改札、自動ドアなどが挙げられる と思います。 今回は、進数の計算を理解するのに時間がかかった。 でも、ようやく理解することが出来たと思う。 プログラムはAだけやったが比較的分かりやすかった。 4 参考文献 e web 10進数・16進数変換表 http://color.eweb-design.com/0103_jr.html KIT ナビゲーション 組合せの総数 http://w3e.kanazawa-it.ac.jp/math/category/kakuritu/jyunretukumiawase/henkan-tex.cgi?target=/math/category/kakuritu/jyunretukumiawase/kumiawase.html 西村まどか 第5回 基礎プログラミングII (何度も呼び出そう) 階乗計算 http://roy/~madoka/2011/r2/05/r2_05_07_theme_05_factorial.html 協同学習者 宮原絵美里 見川英駿 五十嵐兼一 ----------------------- 東北公益文化大学 公益学部 公益学科  2年 菊地瑞紀 c110067@f.koeki-u.ac.jp -----------------------