第 5 回 何度も呼び出そう レポート課題 氏 名: 本間 紘司 学籍番号: C1101796 語学クラス: 中国語 コース(系): 社会福祉 1.筆記問題 -------------------------------------------------------------------------------- A.まず自分の名前のASCLLコードの16進数と10進数の結果をあげる ~16進数~ ~10進数~ K 0x4b K 0d75 o 0x6f o 0d111 j 0x6a j 0d106 i 0x69 i 0d105 H 0x48 H 0d72 o 0x6f o 0d111 n 0x6e n 0d110 m 0x6d m 0d109 a 0x61 a 0d97 <手順> 1.16進数を10進数に直す。*結果を16で割る。 2.10進数の数を全て足す。 3.直した16進数と全て足した10進数の合計が同じ数字になれば = と証明できる。 * なぜ 1 の手順で結果を16で割ったかと言うと、足した数を16で割ることで元 の16進数の数を全て足した結果にすることができるからである <実行> まず16進数の中にあるb、f、aなどを数字に直す。 a = 10 b = 11 d = 13 e = 14 f = 15 10進数に直すためには、16進数の桁数分をかけて足せば良い。 K 0x4b (16^1*4)+(16^0*11)= 75 o 0x6f (16^1*6)+(16^0*15)= 111 j 0x6a (16^1*6)+(16^0*10)= 106 i 0x69 (16^1*6)+(16^0*9 )= 105 H 0x48 (16^1*4)+(16^0*8 )= 72 o 0x6f (16^1*6)+(16^0*15)= 111 n 0x6e (16^1*6)+(16^0*14)= 110 m 0x6d (16^1*6)+(16^0*13)= 109 a 0x61 (16^1*6)+(16^0*1 )= 97 75+111+106+105+72+111+110+109+97=896 (結果) 0d896 (確かめ算) pan{HOMMA Koji}% bc -l [~] 75+111+106+105+72+111+110+109+97 896 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (補足) この答えを16で割る 16 )896 余り0 ---- 16 ) 56 余り8 #余りを下から上へ数える ---- 16 ) 3 余り3 ---- 0 (結果)0x380(16進数) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 10進数をすべて足す 75+111+106+105+72+111+110+109+97=896 これで 896 という数字が同じ結果になった。つまり、 0x380 = 0d896 が証明された。 参考文献 神田先生 16進数・ASCLLコード http://roy/~naoya/ruby/9.html -------------------------------------------------------------------------------- B.(毎朝の料理を作るプログラ厶) def cook(egg,ham,bread) breadをトースターで焼く hamのうえにeggをのせて、フライパンで焼く dish = bread のうえに hameggをのせる end #返すものは dish cook(1個、2枚、1枚) # 朝飯を食べるので呼び出す print("いただきます!\n") -------------------------------------------------------------------------------- 2. A.i.クラスの人数を入力してもらい、研究結果を発表するメンバーの組合せを求める プログラム (def_combination.rb) ii.作成したプログラム #!/usr/koeki/bin/ruby def factorial(a) #メソット if a == 1 1 else a * factorial(a-1) end end def kumiawase(m,n) factorial(m)/(factorial(n)*factorial(m-n)) # mCn = m! / (m-n) # 組合せを求める式 end print("クラスの中から、研究結果を発表する人数を選ぶ。\n") sleep(1) print("研究結果を発表するメンバーの組合せは何通りか?\n") sleep(1) STDERR.print("クラスの人数") kurasu = gets.chomp!.to_i #文字列を整数に変えるプログラム STDERR.print("研究結果を発表する人") member = gets.chomp!.to_i printf("%d人のなかから発表するメンバーの組合せは%d通りです。\n",kurasu, kumiawase(kurasu,member)) iii.もとにしたプログラムからの変更点 (def_factorial.rb) ・STDERR.print分の追加 ・mCn = m! / (m-n) 組合せを求める式の追加 ・キーボードからの入力をうながす、gets.chomp!.to_iの追加 ・sleep()の追加 iv.プログラムの実行結果 pan{c110179}% ./def_combination.rb [~/Ruby] クラスの中から、研究結果を発表する人数を選ぶ。 研究結果を発表するメンバーの組合せは何通りか? クラスの人数8 研究結果を発表する人3 8人のなかから発表するメンバーの組合せは56通りです。 pan{c110179}% ./def_combination.rb [~/Ruby] クラスの中から、研究結果を発表する人数を選ぶ。 研究結果を発表するメンバーの組合せは何通りか? クラスの人数10 研究結果を発表する人3 10人のなかから発表するメンバーの組合せは120通りです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (確かめ算) pan{HOMMA Koji}% bc -l [~/Ruby] (8*7*6)/(3*2*1) 56.00000000000000000000 (10*9*8)/(3*2*1) 120.00000000000000000000 quit 以上から組合せの求めかた mCn = m! / (m-n) の 式に当てはめて 上のように56通り、120通りと出たので正解と証明できる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ v.考察 最初は組合せの式を勘違いして、factorial(m)/(factorial(n)としてしまい、 変な答えになってしまた。 その後、調べた後に直してプログラムを実行したのだが、なぜか以下の通り pan{c110179}% ./def_combination.rb [~/Ruby] クラスの中から、研究結果を発表する人数を選ぶ。 研究結果を発表するメンバーの組合せは何通りか? クラスの人数10 研究結果を発表する人3 10人のなかから発表する人の組合せは3048192000通りです。 と膨大な数になってしまった。なぜかと思い何度も実行してみるとプログラムの 中での factorial(m)/(factorial(n)*factorial(m-n))が factorial(m)/factorial(n)*factorial(m-n)と( )を付けなかったため、公式と 合致せず上の膨大な答えになったと思われる。 その後は無事確かめ算で計算した通り、成功した。 参考文献:西村先生 第 5 回 「階乗計算」 http://roy/~madoka/2011/r2/05/r2_05_07_theme_05_factorial.html vi.感想 今回は無事終われて良かった… 考察をやってみると自分がどこを間違っていたか再確認出来るので勉強になる 次も頑張りたい。