第 5 回 何度も呼び出そう レポート課題 氏名: 松田 大輝 学籍番号: c1101804 語学クラス: 中国語 コース(系): 地域共創コース 1、筆記問題 A、 自分の名前のASCII コードは、以前調べた結果を使用した M = 0x4d a = 0x61 t = 0x74 s = 0x53 u = 0x55 t = 0x74 a = 0x61 T = 0x54 a = 0x61 i = 0x69 k = 0x6b i = 0x69 16進数での計算 計算方法 最初に1文字、1文字足していき2文字ずつにしていく。 ma, ts, ut, at, ai, ki 次に、先程計算した2文字を足して4文字zずつにしていく。 mats, utat, aiki 以下、同じように最初の方から順に足していく。 matsutatat, aiki → matsutataiki M+a 0x4d + 0x61 = 10の位(4+6) 1の位((d=13)+1) = (10=a) (14=e) = 0xae t+s 0x74 + 53 = (7+5) (4+3) = (12=c) (7) = 0xc7 u+t 0x55 + 0x74 = (5+7)(5+4) = (12=c) (9) = 0xc9 a+T 0x61 + 0x54 = (6+5)(4+1) = (11=b) (5) = 0xb5 a+i 0x61 + 0x69 = (6+6)(1+9) = (12=c) (10=a) = 0xca k+i 0x6b + 0x69 = (6+6)((b=11)+9)= (1)(20) = 0xd4 Ma+ts 0xae + 0xc7 = ((a=10)+(c=12))((e=14)+7)=(22)(21)= 0x175 ut+aT 0xc9 + 0xb5 = ((c=12)+(b=11)(9+5) = (23)(14) = 0x17e ai+ki 0xca + 0xd4 = ((c=12)+(d=13))((a=10)+4) = (25)(14) =0x19e Mats+utaT 0x175 + 0x17e = (1+1)(7+7)(5+(e=14))=(2)(14)(19) = 0x2f3 MatsutaT+aiki 0x2f3 + 0x19e = (2+1)((f=15)+9)(3+(e=14)=(3)(24)(17) = 0x491 文字コードを全て足し合わせると16進数では 0x491 となる。 16で割ると余りは 11 になった。 10進数での計算 計算方法 1つ1つ10進数に変換した後、すべてを合計した。 M = 0x4d = 16 * 4 + d(13) = 0d77 a = 0x61 = 16 * 6 + 1 = 0d97 t = 0x74 = 16 * 7 + 4 = 0d116 s = 0x73 = 16 * 7 + 3 = 0d115 # u = 0x55 = 16 * 5 + 5 = 0d85 t = 0x74 = 16 * 7 + 4 = 0d116 a = 0x61 = 16 * 6 + 1 = 0d97 T = 0x54 = 16 * 5 + 4 = 0d84 a = 0x61 = 16 * 6 + 1 = 0d97 i = 0x69 = 16 * 6 + 9 = 0d105 k = 0x6b = 16 * 6 + d(11) =0d107 i = 0x69 = 16 * 6 + 9 = 0d105 77+97+116+83+85+116+97+84+97+105+107+105 = 1169 0d1169 文字コードを全て足し合わせると10進数では 0d1169 となる。 16で割ると余りは 1 になった。 計算が正しいか確かめてみる。 16進数→10進数 (0x491) 256 * 4 + 16 *9 + 1 = 1169 0d1169 10進数→16進数 (0d1169) 16 ) 1169 ...1 16 ) 73 ...9 16 ) 4 ...4 0 0x491 どちらから計算しても計算が一致するため、計算が正しいことが証明された。 B、 ご飯をつくるための行程をプログラム風に書き直した。 def food(ninzin, kareeko, hatimitu) ninzin を切る kareeko をとりだす karei = ninzin と kareeko を混ぜる karei = kare に hatimitu を隠し味として入れる end # 返すものは karei とする def drink(coffee,satou,siroppu) coffee をカップに入れる coffee に satou を入れる coffee にsiroppu を入れる end food("1個,300g,100cc") # ご飯を作るので呼び出す drink("200ml,3個,3ml") # 飲み物を作るので呼び出す print("準備ができたのでいただきます。\n") 2、プログラム問題 A, 1)考えた設定 クラスの中から発表者を何人か選ぶ、組合せのプログラムを作成。 入力した数値が正しくない場合は繰り返すため while 文を使用。 2)プログラム(説明) #!/usr/koeki/bin/ruby # 最初に書かなければいけないもの def factorial(m) # 関数 factional として m を引数とした if m == 1 # もし m が1の場合であった時 1 # 1 を返すようにした else # 条件が2つ以上のため else を使用 m * factorial(m-1) # n に m から1少ない数(m - 1)をかけた end # if の end end # def の end def choice(minna, nin) # ここと下の行で、関数 choice の式を作成 factorial(minna) / (factorial(nin) * factorial(minna-nin)) end # def の end STDERR.print("私達のクラスの中から、発表者を数人選ぶことになった。\n") # 対話的な表示をするのためにSTDERR を使用。 STDERR.print("発表者を私達のクラスの中から選ぶ組み合わせは何通りあるか調 べてみる。\n\n") #上と同じように STDERR を使用 while true # while true を使用することによって # 永久に繰り返しが継続し、終了しないようにした # これは、記入ミスがあった場合のために使用 # そのため、繰り返しが終了するため、後に break を使用 STDERR.print("クラス人数は?(人)\n") # 対話的な表示をするのためにSTDERR を使用。 kurasu = gets.to_i #キーボードからの入力を読み込むメソッドとしてgetsメソッドを使用 STDERR.print("選ばれる発表者は?(人)\n") # 5行目と同じプログラム hito = gets.to_i # 4行目と同じプログラム if kurasu < hito # クラスの人数より発表者が多く # 設定してしまったときのための訂正の文 STDERR.print("\n") STDERR.print("クラスの人数より多くなることはない。\n") STDERR.print("数値を入力し直せ\n\n") redo # その回の繰り返しを無効化し、その回の繰り返しの # 先頭からやりなおすためにredo を使用 。 # ここでの先頭は15行前の while となる else # 条件が2つ以上のため else を使用 print("\n") # 改行するために使用 printf("%d人から%d人選ぶと組合せのパターンは、%d通りとなる。 \n",kurasu,hito,choice(kurasu,hito)) # 入力した数値の確認のため printf を用いた break # 繰り返しから抜けるために break を使用 end # if の end end # while の end 3) もとにしたプログラムからの変更点 講義中に作成したプログラム(def_factorial.rb)を基にした。 変更点は基のプログラムが単純なため、計算式を複雑にしたり 繰り返しなどもプログラム内に取り入れてみた。 4)実行結果 pan{c110180}% ./def_combination.rb [~/Ruby] 私達のクラスの中から、発表者を数人選ぶことになった。 発表者を私達のクラスの中から選ぶ組み合わせは何通りあるか調べてみる。 クラス人数は?(人) 5 選ばれる発表者は?(人) 2 5人から2人選ぶと組合せのパターンは、10通りとなる。 pan{c110180}% ./def_combination.rb [~/Ruby] 私達のクラスの中から、発表者を数人選ぶことになった。 発表者を私達のクラスの中から選ぶ組み合わせは何通りあるか調べてみる。 クラス人数は?(人) 5 選ばれる発表者は?(人) 8 クラスの人数より多くなることはない。 数値を入力し直せ クラス人数は?(人) 8 選ばれる発表者は?(人) 6 8人から6人選ぶと組合せのパターンは、28通りとなる。 5)結果の考察 計算が正しいか調べる。 5C2 = pan{c110180}% bc -l [~/Ruby] 5*4/2 10.00000000000000000000 8C6 = pan{c110180}% bc -l [~/Ruby] 8*7*6*5*4*3/6/5/4/3/2 28.00000000000000000000 どちらの計算も正しいことが確認できた。 B, 1)考えた設定 method を 2 つ以上使用するプログラムであり、ある条件になったときのみ 計算が変化するプログラムを作成。 今回は、りんごを3個以上買った時に、3割り引きになるようにした。 2)プログラム(説明) #!/usr/koeki/bin/ruby # 最初に書かなければいけないもの def ringo(r) #ここから、りんごの合計金額を定義していく # 関数 ringo として r を引数とした if r >= 3 # りんごを3個以上、購入した時の計算方法 300 * r * 0.7 #ここで3割り引きにするために 0.7をかけた else # 条件が2つ以上のため else を使用 300 * r # りんごを3 個以上、購入していない時の計算方法 end # if の end end # 7行前の def の end # ここまででりんごの合計金額を定義した。 def mikan(m) #ここから、みかんの合計金額を定義していく。 m * 200 end # 2行前の def の end # ここまででみかんの合計金額を定義した STDERR.print("りんご一個300円、みかん一個200円となっている。\n") # 対話的な表示をするのためにSTDERR を使用。 STDERR.print("りんごを3個以上買うとりんごの値段がすべて3割り引きになる。\n\n") # 上と同じプログラム STDERR.printf("りんごを何個、買いますか?\n") # ここでも対話的な表示をするのためにSTDERR を使用。 ringo2 = gets.to_i #キーボードからの入力を読み込むメソッドとしてgetsメソッドを使用 STDERR.printf("みかんを何個、買いますか?\n") # 5行前と同じプログラム mikan2 = gets.to_i # 4行前と同じプログラム goukei = ringo(ringo2)+ mikan(mikan2) # りんごとみかんの購入金額をここで計算した。 # 計算結果である合計金額を変数 goukei として、後に使用。 printf("合計金額は %d円となった。\n",goukei) # printf を用いて計算結果を表示させた。 3)もとにしたプログラムからの変更点 講義中に作成した「脱メタボリック計画」(def_metabolic.rb)を基にした。 計算方法は一定条件を満たしたときのみ割り引きになるように 変更していった。 4)実行結果 pan{c110180}% ./two_methods.rb [~/Ruby] りんご一個300円、みかん一個200円となっている。 りんごを3個以上買うとりんごの値段がすべて3割り引きになる。 りんごを何個、買いますか? 2 みかんを何個、買いますか? 5 合計金額は 1600円となった。 pan{c110180}% ./two_methods.rb [~/Ruby] りんご一個300円、みかん一個200円となっている。 りんごを3個以上買うとりんごの値段がすべて3割り引きになる。 りんごを何個、買いますか? 5 みかんを何個、買いますか? 5 合計金額は 2050円となった。 pan{c110180}% ./two_methods.rb [~/Ruby] りんご一個300円、みかん一個200円となっている。 りんごを3個以上買うとりんごの値段がすべて3割り引きになる。 りんごを何個、買いますか? 0 みかんを何個、買いますか? 0 合計金額は 0円となった。 5)結果の考察 計算が正しいか調べる。 pan{c110180}% bc -l [~/Ruby] 300*2+200*5 1600 pan{MATSUTA Taiki}% bc -l [~/Ruby] 300*5*0.7+200*5 2050.0 どちらの計算も正しいことが確認できた。 3、感想 機械的な操作を繰り返すものとして、同じものを作り続ける内職を挙げる。 同じ物を作成し、そのために同じ行動を繰り返すため機械的だと言える。 筆記問題、A の文字コードを全て足し合わせるのに苦労した。 10進数から16進数に変換するだけでなく 16進数のみの計算もあったため 時間がかかった。そのため、10進数と16進数が同じ答えになったとき嬉しかった。 4、参考文献 西村先生の講義ノート http://roy/~madoka/2011/r2/ 5、何度も呼び出そう http://roy/~madoka/2011/r2/05/ 1. 脱メタボリック計画 http://roy/~madoka/2011/r2/05/r2_05_01_theme_01_diet.html 2. 体力があがったら http://roy/~madoka/2011/r2/05/r2_05_02_theme_02_deccelate.html 3. シュミレーションで考えること http://roy/~madoka/2011/r2/05/r2_05_05_theme_03_param.html 4. これもだめで、あれもだめ http://roy/~madoka/2011/r2/05/r2_05_06_theme_04_exit.html 5. 階乗計算 http://roy/~madoka/2011/r2/05/r2_05_07_theme_05_factorial.html 6. ひとつずつ確かめよう http://roy/~madoka/2011/r2/05/r2_05_08_theme_06_onebyone.html 7. トランプの並べ替え http://roy/~madoka/2011/r2/05/r2_05_09_theme_07_quicksort.html 8. 並べかえプログラム http://roy/~madoka/2011/r2/05/r2_05_10_theme_08_quicksortprog.html 9. とりあえず全部並べる http://roy/~madoka/2011/r2/05/r2_05_11_theme_09_bubble.html 神田先生の授業用Webページ http://roy/~naoya/ruby/index.html 基礎プログラミングI 第5回 http://roy/~naoya/ruby/5.html 共同学習者 細田 洋平 渡辺 龍