第 5 回 何度も呼び出そう レポート課題 氏名: 鈴木椎菜 学籍番号: c1101276 語学クラス: 英語6 コース(系): 社会福祉コース 1.筆記問題 A. <第三回での変換結果> shiina suzuki s 0x73 10進数 115 h 0x68 10進数 104 i 0x69 10進数 105 i 0x69 10進数 105 n 0x6e 10進数 110 a 0x61 10進数 97 s 0x73 10進数 115 u 0x75 10進数 117 z 0x7a 10進数 122 u 0x75 10進数 117 k 0x6b 10進数 107 i 0x69 10進数 105 <10進数の計算> pan{c110127}% bc -l 115 + 104 + 105 + 105 + 110 + 97 + 115 + 117 + 122 + 117 + 107 + 105 1319 <16進数の計算> 16進数の足し算は、16ごとに1繰り上がる。 #0x73(s)と0x68(h)を足す 0x73 + 0x68 = 0xDB 1桁目 3 + 8 = 11(B) 2桁目 7 + 6 = 13(D) #0x69(i)を足す 0xDB + 0x69 = 0x144 1桁目 11(B) + 9 = 20 = 16 と 4 2桁目 13(D) + 6 + 1 = 20 = 16 と 4 3桁目 2桁目の繰り上げ分の1 #0x69(i)を足す 0x144 + 0x69 = 0x1AD 1桁目 4 + 9 = 13(D) 2桁目 4 + 6 = 10(A) 3桁目 1 #0x6E(n)を足す 0x1AD + 0x6E = 0x21B 1桁目 13(D) + 14(E) = 27 = 16 と 11(B) 2桁目 10(A) + 6 + 1 = 16 と 1 3桁目 1 + 1 = 2 #0x61(a)を足す 0x21B + 0x61 = 0x26C 1桁目 11(B) + 1 = 12(C) 2桁目 1 + 6 = 7 3桁目 2 #0x73(s)を足す 0x27C + 0x73 = 0x2DF 1桁目 12(C) + 3 = 15(F) 2桁目 7 + 7 = 14(E) 3桁目 2 #0x75(u)を足す 0x2EF + 0x75 = 0x354 1桁目 15(F) + 5 = 20 = 16 と 4 2桁目 14(E) + 7 + 1 = 22 = 16 と 6 3桁目 2 + 1 = 3 #0x7A(z)を足す 0x364 + 0x7A = 0x3DE 1桁目 4 + 10(A) = 14(E) 2桁目 6 + 7 = 13(D) 3桁目 3 #0x75(u)を足す 0x3DE + 0x75 = 0x453 1桁目 14(E) + 5 = 19 = 16 と 3 2桁目 13(D) + 7 + 1 = 21 = 16 と 5 3桁目 3 + 1 = 4 #0x6B(k)を足す 0x453 + 0x6B = 0x4BE 1桁目 3 + 11(B) = 14(E) 2桁目 5 + 6 = 11(B) 3桁目 4 #0x69(i)を足す 0x4BE + 0x69 = 0x527 1桁目 14(E) + 9 = 23 = 16 と 7 2桁目 11(B) + 6 + 1 = 18 = 16 と 2 3桁目 4 + 1 = 5 答え 0x527 ----------- <確かめ> -------------- 16進数→10進数 -------------- 1、 16**2| 16**1| 16**0 # 16のべき算 ---------------------- 2、 256| 16| 1 # 16のべき算の答え 3、 5| 2| 7 # 上記で行った16進数の答え ---------------------- 4、 1280| 32| 7 # 2と3の乗算の答え 1280 + 32 + 7 = 1319 よって、 0x527 は、10進数 1319 となる。 -------------- 10進数→16進数 -------------- 16 ) 1319 7 ------- 16 ) 82 2 ------- 5 よって、 10進数 1319 は、 0x527 となる。 <参考文献など> Oharaのゲームプログラミング入門 2進数と16進数の計算 URL http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/keisan.html B. <設定> 入浴についての流れをプログラム風に書き直します。 <プログラム風書き下し文> def both(heat, oyu, nyuyokuzai) heat を設定する yokusou = oyu を入れる yokusou = oyu に nyuyokuzai を入れる end # 返すものはyokusou def wash(shampoo, conditionoor, soap) shampoo に髪をにつける conditionoor を髮につける soap で体を洗う sukkiri = shampoo conditionoor soap end # 返すものは sukkiri both(40度, 22リットル, 10グラム) hair(3プッシュ, 2プッシュ, 1プッシュ) print("あー、いい湯だった!!\n") 2.プログラム問題 選択した問題: A <設定> クラスの中から障害物リレーの選手を選出して、 その組み合わせの数を求める。 <プログラム本体> #!/usr/koeki/bin/ruby def factorial(m) if m == 1 # もし m が 1 なら 1 # 1をかえす else # それ以外なら m * factorial(m-1) # mを階乗する end end def kumiawase(k,g) # kumiawase(k,g)というメソッドをつくる factorial(k) / (factorial(g) * factorial(k-g)) # 組み合わせを求める公式 end print("もうすぐクラス対抗の運動会です。\n") print("障害物リレーがあるため、クラスの中から6人の選手を選出しなければなりません。\n") print("あなたのクラスの人数は何人ですか?\n") kurasu = gets.to_i # 入力された文字列を10進数に変換して kurasu に代入する printf("クラスの人数; %d 人\n →選出メンバーは %d 通り出来ます。\n", kurasu, kumiawase(kurasu,6)) <実行結果 その1> -------------------------- pan{c110127}% ./def_combination.rb [~/Ruby] もうすぐクラス対抗の運動会です。 障害物リレーがあるため、クラスの中から6人の選手を選出しなければなりません。 あなたのクラスの人数は何人ですか? 10 クラスの人数; 10 人 →選出メンバーは 210 通り出来ます。 -------------------------- <考察 その1> 計算結果の確認 ------------------------------ 10*9*8*7*6*5*4*3*2*1 # 10の階乗 3628800 # 答え ☆ 6*5*4*3*2*1 # 6の階乗 720 # 答え 4*3*2*1 # 4の階乗 24 # 答え 720*24 # 6の階乗と4の階乗の掛算 17280 # 答え ★ 3628800 / 17280 # ☆ を ★ で割る 210.00000000000000000000 ------------------------------- 正しい。 ちなみに、kumiawase(k,g)メソッドの公式のかっこの数が一つ違うだけで 計算結果は異ってしまう。 def kumiawase(k,g) factorial(k) / factorial(g) * factorial(k-g) end にした場合は、 ------------------------------ pan{c110127}% ./def_combination.rb [~/Ruby] もうすぐクラス対抗の運動会です。 障害物リレーがあるため、クラスの中から6人の選手を選出しなければなりません。 あなたのクラスの人数は何人ですか? 10 クラスの人数; 10 人 →選出メンバーは 120960 通り出来ます。 ------------------------------ となり、計算結果が変わってしまう。 組合せの公式は m! mCn = ----------- n!(m-n) 本当は / 以下の [factorial(g) * factorial(k-g)] 部分をかっこでくくる。 そうしないと、計算の順番が変わってしまい、正しい公式で計算をしてくれない。 <参考文献など> 組合せの公式 →基礎プログラミングIIで同じクラスの伊藤桜子さんに教えてもらいました。 プログラム →プログラミングII 第5回の講義で作成した def_factorial.rb を参考にしました。 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ 選択した問題: C <設定> すずき君の身長の推移を計算してくれるプログラム <プログラム本体> #!/usr/koeki/bin/ruby # shincho(a,h)メソッドを作成 def shincho(a,h) # a = 年齢 # h = 身長 # printf("年齢 %d, 身長 %d\n", a, h) if 7 <= a && a <= 12 # 7歳以上 かつ 12歳以下 h += 3.3 # h に 3.3 足す elsif 12 < a && a <= 15 # 12歳より大きい かつ 15歳以下 h += 10 # h に 10 足す elsif 15 < a && a <= 18 # 15歳より大きい かつ 18歳以下 h += 0.5 # h に 0.5 足す end return h # h の値を返す end # プログラムを作成 age = 6 # 初期年齢を6歳と設定 high = 122 # 初期身長を122cmと設定 STDERR.print("すずき君が6歳から18歳までの間の身長の推移です。\n") while age < 19 # ageが 19歳 より小さいときに繰り返す high = shincho(age,high) # high に shincho(age,high) メソッドを代入 if age == 13 # age が 13歳 の時 STDERR.print"中学生になったすずき君は牛乳をたくさん飲んだため、身長はたくさん伸びました。\n" elsif age == 16 # age が 16歳 の時 STDERR.print"高校生になったすずき君はいくら牛乳を飲んでもあまり身長は伸びませんでした。\n" end STDERR.printf(" %2d 歳;%10.1f[cm]\n", age, high) age += 1 # age に 1 を足す end <実行結果> ----------------------------------- pan{c110127}% ./def_sim.rb [~/Ruby] すずき君が6歳から18歳までの間の身長の推移です。 6 歳; 122.0[cm] 7 歳; 125.3[cm] 8 歳; 128.6[cm] 9 歳; 131.9[cm] 10 歳; 135.2[cm] 11 歳; 138.5[cm] 12 歳; 141.8[cm] 中学生になったすずき君は牛乳をたくさん飲んだため、身長はたくさん伸びました。 13 歳; 151.8[cm] 14 歳; 161.8[cm] 15 歳; 171.8[cm] 高校生になったすずき君はいくら牛乳を飲んでもあまり身長は伸びませんでした。 16 歳; 172.3[cm] 17 歳; 172.8[cm] 18 歳; 173.3[cm] ----------------------------------- <考察> 計算結果の確認 ------------------------- pan{c110127}% bc -l # 3.3[cm] ずつ増える 122 + 3.3 125.3 # 7歳 125.3 + 3.3 128.6 # 8歳 128.6 + 3.3 131.9 # 9歳 131.9 + 3.3 135.2 # 10歳 135.2 + 3.3 138.5 # 11歳 138.5 + 3.3 141.8 # 12歳 # 10[cm] ずつ増える 141.8 + 10 151.8 # 13歳 151.8 + 10 161.8 # 14歳 161.8 + 10 171.8 # 15歳 # 0.5[cm] ずつ増える 171.8 + 0.5 172.3 # 16歳 172.3 + 0.5 172.8 # 17歳 172.8 + 0.5 173.3 # 18歳 -------------------------- 実行結果の計算結果と合致していた。 <参考文献など> プログラム →プログラミングII 第5回の講義で作成した def_firefly.rb と def_metabolic.rbを参考にしました。 3.感想 ・コンビニエンスストアなどの店員 お客さんがきたら「いらっしゃいませ」と言い、 お客さんが帰るときは「ありがとうございます」と言う。 ・しゃべる人形 何かの音にスピーカーが反応して決められた言葉を発する。 高機能のものは言葉を選別して反応する。 4.参考文献など 各項目ごとに記しています。 --------------------------- 東北公益文科大学 公益学部 公益学科 2年 鈴木椎菜 c110127@f.koeki-u.ac.jp