先生に注意されたところを直しました。 正しく起動しなかったプログラムも完成したので再提出します。 第 5 回 何度も呼び出そう レポート課題 氏名:高橋岬 学籍番号:c1110973 語学クラス:英語5 コース:環境サイエンスコース 1.A.takahashi misaki は以下の16進数を使って表すことが出来る。 t = 0x74 a = 0x61 k = 0x6b h = 0x68 s = 0x73 i = 0x69 m = 0x6d また、これらを10進数に変換すると t = 0x74 = 16*7+ 4 = 116 a = 0x61 = 16*6+ 1 = 97 k = 0x6b = 16*6+11 = 107 h = 0x68 = 16*6+ 8 = 104 s = 0x73 = 16*7+ 3 = 115 i = 0x69 = 16*6+ 9 = 105 m = 0x6d = 16*6+13 = 109 となる。 16進数をすべて足し合わせる 0x74+0x61+0x6b+0x61+0x68+0x61+0x73+0x68+0x69+0x6d+0x69+0x73+0x61+0x6b+0x69 右から1桁目をすべて足し16で割る 4+1+11(b)+1+8+1+3+8+9+13(d)+9+3+1+11(b)+9 = 92 92 / 16 = 5...12 よって2桁目に 5 繰り上がり 1桁目は c(12) となる 2桁目もすべて足し16で割る 7+6+6+6+6+6+7+6+6+6+6+7+6+6+6+5 = 98 98 / 16 = 6...2 よって3桁目に 6 繰り上がり 2桁目は 2 となる 以上の結果よりすべて足し合わせると 0x62c となる。 10進数をすべて足し合わせる 116+97+107+97+104+97+115+104+105+109+105+115+97+107+105 = 1580 これを16進数に直すと 1580 / 16 = 98...12 98 / 16 = 6... 2 6 / 16 = 0... 6 よって 1580 = 0x62c となる。 この結果より16進数と10進数をすべて足した数が同じになることがわかった。 B.オムライスを作る行程をプログラム風にした def gohan(rice, ketchup) rice を炒める ketchup を入れる end def om(egg, cream, sio, oil) egg を混ぜる egg に cream と sio をいれる flying pan = oil をしき eggを焼く end gohan(1合, おおさじ3) om(2個, おおさじ1, こさじ1/2, おおさじ1) printf("%s完成",gohan+om) 2.A.def_power.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def power(m, n) # 関数 power ( m と n について) m ** n # m を n 乗する end STDERR.print("基数: ") # 基になる数を入力させる base = gets.to_f # 入力された文字を base として扱い、整数とする STDERR.print("指数: ") # 指数を入力させる index = gets.to_f # 入力された文字を index として扱い、整数とする printf("%d の %d 乗は %d です\n", base, index, power(base, index)) # kterm に表示する言葉(関数 power の m と n にそれぞれ base と index を代入する) 実行結果 a.pan{c111097}% ./def_power.rb [~/Ruby] 基数: 2 指数: 4 2 の 4 乗は 16 です b.pan{c111097}% ./def_power.rb [~/Ruby] 基数: 5 指数: 3 5 の 3 乗は 125 です 考察 a. 2^4 = 16 b. 2^5 = 125 上記の結果より実行したプログラムの計算が正しいのがわかる。 よってこのプログラムは正しく起動している。 B.two_methods.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def food(w, x) # 関数 food ( w と x について) if w >= 5 # w が 5 以上のとき w * x * 0.9 # w かける x かける 0.9 (1割引) else # そうでないとき w * x # w かける x end end def food2(y) # 関数 food2 ( y について) y / 500 # y を 500 で割る end print("公益精肉店\n\n") # kterm で表示させる言葉 meat = Hash.new("当店では取扱っておりません") # Hash配列 を meat とする meat[1] = ["牛切り落とし", 200] # Hash配列 meat にいれる key と value meat[2] = ["豚もも", 150] meat[3] = ["豚ロース", 130] meat[4] = ["鳥もも", 120] meat[5] = ["鳥むね", 80] for name, money in meat # Hash配列 meat の key を name、 value を money とする printf("%d:%s\t%d\n", name, money[0], money[1]) # 変数を代入し kterm に表示する文章( [ ] は value で何個目なのかを示す) end total = 0 # 合計の変数(始めは0) print("\n何を買いますか? (ctrl-Dで終了)\n") while true # 止めるまで計算する STDERR.print("番号 : ") # 入力させたい文字への導入 m = gets # 入力された文字を m とする if m == nil # m が ctrl-D だったら break # 計算終了 end m = m.to_i # m を整数とする if meat.key?(m) == true # meat に m があったら STDERR.printf("%s / 量[g] : ", meat[m][0]) n = gets.to_f/100 # 入力された文字を nとし、小数として扱い、そのうえで100で割る if n >= 5 # n が 5 以上だったら print("500[g]以上お買い上げで1割り引き\n") end STDERR.printf(" %d 円\n", food(n, meat[m][1])) # kterm に表示する言葉(関数 food の w と x にそれぞれ n と meat[m][1meat[m][1] を代入する) total += food(n, meat[m][1]) # 合計変数に足す else printf("%s\n", meat[m]) # key と一致するものがないときに表示される end end printf("\n\n合計 %d 円\n",total) printf("\t%d ポイント獲得 (500円で1ポイント)\n",food2(total)) # kterm に表示する言葉(関数 food2 の y にそれぞれ total を代入する) 実行結果 pan{c111097}% ./two_methods.rb [~/Ruby] 公益精肉店 1:牛切り落とし 200 2:豚もも 150 3:豚ロース 130 4:鳥もも 120 5:鳥むね 80 何を買いますか? (ctrl-Dで終了) 番号 : 1 牛切り落とし / 量[g] : 700 500[g]以上お買い上げで1割り引き 1260 円 番号 : 5 鳥むね / 量[g] : 300 240 円 番号 : 7 当店では取扱っておりません 番号 : 1 牛切り落とし / 量[g] : 234 468 円 番号 : 4 鳥もも / 量[g] : 345 414 円 番号 : ^D 合計 2382 円 4 ポイント獲得 (500円で1ポイント) 考察 pan{c111097}% bc -l [~/Ruby] 700*200*0.9+300*80+234*200+345*120 238200.0 上記の結果より実行したプログラムの計算が正しいのがわかる。 また、入力ミスが合ったときに表示するように指定した文章も表示される。 よって、このプログラムは正しく起動している。 C.def_sim.rb 100匹の鮭が海から生まれた川に帰るとき、何匹が帰れるのかシュミレーションした。 3日目以降は熊に捕食される、釣られる、力尽きる等の理由で減少率が高くなっている。 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def fish(day, egg, egg0) # 関数 fish ( day と egg と egg2 について) if day >= 3 # 3日目以降は減少の仕方が変わる dec = 0.5 # 天敵(熊)や川釣に捕まえられる、力尽きる else dec = 0.2 end egg -= dec * egg0 # 川に帰ってくる鮭が減る end sake = sake0 = 100 # 鮭の数 i = 0 # 変数 i printf("%s匹の鮭が1週間かけて、海から川に帰ります\n", sake) # kterm に表示される文章 while i < 7 # i は 7 より大きくならない back = fish(i, sake, sake0) # 関数 fish の day と egg と egg2 にそれぞれ i と sake と sake0 を代入し、それを back とする printf("%d日目\t%d匹 \n", i += 1, back) # kterm に表示される文章 end 実行結果 pan{c111097}% ./def_sim.rb [~/Ruby] 100匹の鮭が1週間かけて、海から川に帰ります 1日目 80匹 2日目 60匹 3日目 40匹 4日目 -10匹 5日目 -60匹 6日目 -110匹 7日目 -160匹 考察 減った鮭の数が次の計算に反映されておらず、100の何倍かを毎回引いてしまっている。 作り直したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def fish(day, egg) # 関数 fish ( day と egg について) if day >= 3 # 3日目以降は減少の仕方が変わる dec = 0.5 # 天敵(熊)や川釣に捕まえられる、力尽きる等の理由で減少率が高くなる else dec = 0.2 end egg -= dec * egg # 川に帰ってくる鮭が減る end sake = 100 # 鮭の数 i = 0 # 変数 i printf("%s匹の鮭が1週間かけて、海から川に帰ります\n", sake) # kterm に表示される文章 while i < 7 # i は 7 より大きくならない sake = fish(i, sake) # 関数 fish の day と egg にそれぞれ i と sake を代入し、それを次の sake の値とする printf("%d日目\t%d匹 \n", i += 1, sake) # kterm に表示される文章 end printf("川に着いたときは%d匹になってます\n", sake) 実行結果 pan{c111097}% ./def_sim.rb [~/Ruby] 100匹の鮭が1週間かけて、海から川に帰ります 1日目 80匹 2日目 64匹 3日目 51匹 4日目 25匹 5日目 12匹 6日目 6匹 7日目 3匹 川に着いたときは3匹になってます 考察 作り直す前のプログラムとの違いは関数中の計算式を egg -= dec * egg0 → egg -= dec * egg にしたところである。 egg0 は常に100であり計算結果が反映されない。 そのため、毎回計算で変わる egg を左辺に入れた。 これによる実行結果は、下記より正しいことが分かる。 pan{c111097}% bc -l [~] 100-100*0.2 80.0 80-80*0.2 64.0 64-64*0.2 51.2 51.2-51.2*0.5 25.60 25.6-25.6*0.5 12.80 12.8-12.8*0.5 6.40 6.4-6.4*0.5 3.20 途中の計算結果から小数点以下に数字が現れるが、何匹残っているのか考えるためどんな数でも切り捨てとなっている。 これらの結果より、このプログラムは正しく起動している。 3.感想 機械的な動作を毎日繰り返すのはファーストフード店などの調理だと思う。 決められた分量で決められた時間で調理するのは機械的ではないだろうか。 2.C.のプログラムがちゃんと動くように作り直すことができたので良かった。 ----------------------------- 高橋 岬 東北公益文科大学 2年 c111097@g.koeki-u.ac.jp -----------------------------