第 5 回 何度も呼び出そう レポート課題 氏名:加藤恭平 学籍番号:c1100549 語学クラス:英語2 コース(系):政策マネジメント 1.筆記問題 A.自分の名前を16進数で表した結果 k→0x4b a→0x61 t→0x74 o→0x6f k→0x4b y→0x79 o→0x6f h→0x68 e→0x65 i→0x69 となる。 文字コードを全て足していく。 計算方法は 0x6b(k) + 0x61(a) を例に挙げて計算する。 それぞれを10進数に沿って数字になおしていくと、以下のようになる。 6b = 6 11 61 = 6 1 次に、1の位・10の位に分け、足し算を行う。 [1の位] 11 + 1 = 12 16進数に直すと12はcとなる。 [10の位] 6 + 6 = 12 12を16進数に直すとcとなる。 よって、0x6b + 0x61 = ccとなる事が分かる。 以下、この方法で計算した。 文字コードをすべてたしていくと。 6b + 61 = cc cc + 74 = 13a 13a + 6f = 1a9 1a9 + 4b = 1f4 1f4 + 79 = 26d 26d + 6f = 2dc 2dc + 68 = 344 344 + 65 = 3a9 3a9 + 69 = 3f8 計算の結果0x3fcとなる。 次に、10進数になおすために16をかけていく。 16進数で表示されている部分は表で確認しながら計算を行った。 0x4b =4 * 16^1 + 11 * 16^0 =75 0x61 =6 * 16^1 + 1 * 16^0 =97 0x74 =7 * 16^1 + 4 * 16^0 =116 0x6f =6 * 16^1 + 15 * 16^0 =111 0x4b =4 * 16^1 + 11 * 16^0 =75 0x79 =7 * 16^1 + 9 * 16^0 =121 0x6f =6 * 16^1 + 15 * 16^0 =111 0x68 =6 * 16^1 + 8 * 16^0 =104 0x65 =6 * 16^1 + 5 * 16^0 =101 0x69 =6 * 16^1 + 9 * 16^0 =105 という結果となった。 よって以下の通りになる。 k→0d75 a→0d97 t→0d116 o→0d111 k→0d75 y→0d121 o→0d111 h→0d104 e→0d101 i→0d105 文字コードを全て足すと、 75+97+116+111+75+121+111+104+101+105 =1016 よって、0d1016となる。 これを16進数になおすために16で割る。 1016 / 16 = 63余り8 63 /16 = 3あまり15 3 / 16 = 0 余り3 下から読み上げると、3、15、8 となり、 16進数になおすと、 3、 f、8 となる。 結果、0x3f8 = 0d1016(=0x3f8) となるので、答えは一致しているといえる。 B.おにぎりを作るときの行動をプログラミング風に表した。 def food(rice,solt,nori) rice を 炊く solt を取り出す riceball = rice を握り solt をかける riceball = riceball に nori を巻く end #返すものはriceball def soup(miso,oyu,tofu,wakame) miso を取り出す oyu を沸かす tofu を 切る wakame を切る misosoup = oyu に miso を溶かしながら加える misosoup = tofu と wakame を 入れる food(0.5合,小匙 3 杯,1枚) #おにぎりを作るので呼び出す soup(大匙山盛1杯,200mリットル,一丁,10g) #味噌汁を作るので呼び出す print("いただきます\n") 2.プログラム問題 選択した問題 A a)考えた設定 部隊の人数、小隊長に選ばれる人数を入力し、組合せを求めるプログラム (def_combination) b)作成したプログラム #!/usr/koeki/bin/ruby def factional(n)#関数factionalを作る。引数はninzuuのn if n == 1 #nが1のとき、 1 #1を返す。 else #nが1以外のとき n * factional(n-1) #一つ少ない数字をかける end #ifに対するend end #factionalの定義終了。 def combination(force,commander)#関数combinationの式を作る。 if force==commander #force,commanderが同じ数の場合 1 #1を返す else #それ以外の場合 factional(force)/(factional(commander)*factional(force-commander)) #上で定義したfactionalに入れられた数を代入したものを # nCr = n!/r!(n-r)!の公式に従い計算させる。 #今回の場合、nはforce,rはcommanderとなる。 end #ifに対するend end #factionalの定義終了。 STDERR.printf("何人編成の部隊ですか?: ") member = gets.to_i #入力された値を整数に変換 STDERR.printf("小隊長は何人選びますか?: ") choose = gets.to_i #入力された値を整数に変換 if member < choose #部隊の人数より選ぶ小隊長の人数が多い場合 print("部隊の数を超えているので計算できません。\n正しい値を入力して下さい。\n) #エラーメッセージを表示。 else #部隊の人数の方が選ぶ小隊長の人数より多い場合 printf("%d人から%d人選ぶときの組み合せは、%d通りです。 \n",member,choose,combination(member,choose))#結果を表示する end #ifに対するend c)元にしたプログラム 授業中に作成したdef_metabolic.rbを参考に作成した。 d)実行結果 pan{c110054}% ./def_combination.rb [~/Ruby] 何人編成の部隊ですか?: 20 小隊長は何人選びますか?: 5 20人から5人選ぶときの組み合せは、15504通りです。 pan{c110054}% ./def_combination.rb [~/Ruby] 何人編成の部隊ですか?: 20 小隊長は何人選びますか?: 30 部隊の数を超えているので計算できません。 正しい値を入力して下さい。 e)考察 bc -lで確かめ算をする。 pan{c110054}% bc -l [~/Ruby]0 5*4*3*2*1 120 20*19*18*17*16/120 15504.00000000000000000000 プログラムが表示した結果と同じなので、このプログラムは正しく計算できてい るといえる。 また入力された部隊の人数より選ぶ小隊長の人数が多く入力された場合、正しく エラーメッセージが表示されている。 3.感想 機械的な動作を繰り返すものの例としては、エレベーター、エスカレーター、自 動ドアなどがあげられると考えた。 今回の課題は筆記問題の16進数の計算に一番時間を費やした。最後の計算結果が 合わず、何度も最初から計算することになったが、最終的に計算結果を合わせる ことが出来て良かった。 プログラムの方は、高校のときに数学Aで習った階乗の式を授業用ページで見て 思い出し授業中に作ったプログラムを参考にして今までの課題よりは比較的早く 完成させることが出来た。 -------------------------------------------------------------------------------- 参考文献 基礎プログラミング II 第 5 回 (何度も呼び出そう) 「階乗計算」 http://roy/~madoka/2011/r2/05/r2_05_07_theme_05_factorial.html 基礎プログラミング II 第 5 回 (何度も呼び出そう) 「ひとつずつ確かめよう」 http://roy/~madoka/2011/r2/05/r2_05_08_theme_06_onebyone.html 著者 西村まどか CyberLibrarian 2進数、16進数と10進数 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/bdh.html 著者 上綱 秀治