第5回 基礎プログラミング II レポート課題 氏名: xxxxxxxx 学籍番号: C109xxx 語学クラス: 英語 1 コース(系): 環境サイエンス 1. yokoyama hiroki これを ASCII コード表見ながら直していく。横にある数字と縦にある数字と 文字を組み合わせて 0x xx のように表現する。xx のところに組み合わせたも のが入る。y は 横にある数字で 7 のところにある。縦は 9のところにある。こ れを組み合わせ 0x 79 となる。ほかのアルファベットも同じように直していく。 o = 0x 6f k = 0x 6b o = 0x 6f y = 0x 79 a = 0x 61 m = 0x 6d a = 0x 61 h = 0x 68 i = 0x 69 r = 0x 72 o = 0x 6f k = 0x 6b i = 0x 69 a = 10 b = 11 c = 12 d = 13 e = 14 f = 15 0x79 = 7*16^1+9*16^0 = 121 0x6 15 = 6*16^1+15*16^0 = 111 0x6 11 = 6*16^1+11*16^0 = 107 0x6 15 = 6*16^1+15*16^0 = 111 0x79 = 7*16^1+9*16^0 = 121 0x61 = 6*16^1+1*16^0 = 97 0x68 = 6*16^1+8*16^0 = 104 0x69 = 6*16^1+9*16^0 = 105 0x72 = 7*16^1+2*16^0 = 114 0x6 15 = 6*16^1+15*16^0 = 111 0x6 11 = 6*16^1+11*16^0 = 107 0x69 = 6*16^1+9*16^0 = 105 121 + 111 + 107 + 111 + 121 + 97 + 104 + 105 + 114 + 111 + 107 + 105 = 1314 1314 を 16 進数にするため 16 で割る。 16)1314 ----- 16) 82 2 ----- 16) 5 2 ----- 0 5 下から読んで 522 になる。よって 16 進数で表すと 0x522 になる。 全部足すと 10 進数は 1314 になり、16 進数は 0x522 になった。 0d1314 = 0x522 16 進数と 10 進数で計算した結果同じになったので計算はあっていることが確 認できた。 B 毎朝の歯を磨く行動をプログラム風にしてみた。 def hamigaki(hamigakiko ,ugai ,kaowoarau) 歯ブラシに hamigakiko をつける 歯を磨いたら ugai をする kao = kaowoarau end hamigaki(10g ,40秒 ,30秒) # 歯を磨くので呼び出す print("いってきます\n") 2 A 1.考えた設定 生徒の中から生徒会長を何人か選び、何通りあるか求めるプログラムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def factorial(s) # メソットの設定 if s == 1 # もし s が 1 だったら 1 else # 違っていたら s * factorial(s-1) # s に factorial(s) メソットを呼び、掛ける end # if の end end # def の end def kumiawase(f,w) # メソットの設定 factorial(f)/factorial(f-w) # factorial(s) を呼び出し # m! # mCr = -------- の計算をする # (r-m)! end # def の end STDERR.print("生徒会長の組み合わせを求めます。\n") STDERR.print("AからZ君の中から生徒会長を決めることになった。何人生徒会長を選びますか?\n") # 標準出力で画面に出力させる 表示させたい文章をカッコとダブルコーテーションで # 囲み出力する kaityou = gets.to_i # 入力された文字列を整数に変え変数 kaityou の中に # 代入する seito = 26 # 生徒数は 26 人なので 26 を代入 printf("%d 人選んだときの組み合わせは %d 通りです。\n",kaityou,kumiawase(seito,kaityou)) 3.元にしたプログラムからの変更点 factorial の引数を m から s に変えた。 組み合わせを求めるために def kumiawase(f,w) を定義した。 4.実行結果 pan{c109149}% ./def_combination.rb [~/Ruby] 生徒会長の組み合わせを求めます。 AからZ君の中から生徒会長を決めることになった。何人生徒会長を選びますか? 3 3 人選んだときの組み合わせは 15600 通りです。 pan{c109149}% ./def_combination.rb [~/Ruby] 生徒会長の組み合わせを求めます。 AからZ君の中から生徒会長を決めることになった。何人生徒会長を選びますか? 2 2 人選んだときの組み合わせは 650 通りです。 3.考察 生徒会長を 3 人の場合と 2 人の場合で実行してみた。 この結果が正しいか判断するために確かめ算を行なった。 まず 3 人の場合の確かめ算を行なった。 pan{c109149}% bc -l [~/Ruby] 26-3 23 (26*25*24*23*22*21*20*19*18*17*16*15*14*13*12*11*10*9*8*7*6*5*4*3*2*1)/(23* 22*21*20*19*18*17*16*15*14*13*12*11*10*9*8*7*6*5*4*3*2*1) 15600.00000000000000000000 quit m! 組み合わせを求めるときの式は mCr = -------- なので m の階乗を r から m (r-m)! を引き階乗したもので割ると答えが出てくる。この通りに確かめ算を行なうと 15600.000…という答えが出た。プログラムで 15600.000… ではなく 15600 なのかというと 15600.000… 人とは数えないので小数ではなく整数で表示して いるからである。よって 3 人の場合の計算は正しいといえる。 2 人場合はこのようになった。 pan{c109149}% bc -l [~/Ruby] 26-2 24 (26*25*24*23*22*21*20*19*18*17*16*15*14*13*12*11*10*9*8*7*6*5*4*3*2*1)/(24* 23*22*21*20*19*18*17*16*15*14*13*12*11*10*9*8*7*6*5*4*3*2*1) 650.00000000000000000000 quit これも上と同じ式で計算すると 650.000… という答えが出た。これも同じよう に 650.000… 人とは数えないので小数ではなく整数で表示している。よって 2 人の場合の計算は正しいといえる。 この 2 つの確かめ算からこのプログラムは正しく動いているといえる。 B 1.考えた設定 栗とサンマを買ったときの合計の値段を求めるプログラムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def kuri(k) # メソットの設定 150 * k end # def の end def sanma(s) # メソットの設定 if s >= 5 # もし s が 5 より大きかったら 150 * s * 0.8 else # 違っていたら 150 * s end # if の end end # def の end STDERR.print("栗とサンマを買ったときの値段を計算します。\n") STDERR.print("サンマを5匹以上買うと2割り引きになります。\n") STDERR.print("栗を何個買いますか?\n") # 標準出力で画面に出力させる 表示させたい文章をカッコとダブルコーテーションで # 表示させる kazu1 = gets.to_i # 入力された栗の数を整数に直し代入する STDERR.print("サンマを何匹買いますか?\n") kazu2 = gets.to_i # 入力したサンマの数を整数に直し代入する goukei = kuri(kazu1) + sanma(kazu2) # 金額の合計を kuri、sanma メソット # を使い求める printf("合計は %d 円です。\n",goukei) # 表示させたい文章をカッコとダブルコーテーションで囲み %d の中には変数 # goukei が入る 3.元にしたプログラムからの変更点 メソット名を kuri と sanma に変更した。 if 文を 5 より大きかったら に変更した。 4.実行結果 pan{c109149}% ./two_methods.rb [~/Ruby] 栗とサンマを買ったときの値段を計算します。 サンマを5匹以上買うと2割り引きになります。 栗を何個買いますか? 7 サンマを何匹買いますか? 8 合計は 2010 円です。 pan{c109149}% ./two_methods.rb [~/Ruby] 栗とサンマを買ったときの値段を計算します。 サンマを5匹以上買うと2割り引きになります。 栗を何個買いますか? 7 サンマを何匹買いますか? 3 合計は 1500 円です。 5.考察 割り引きされているか確かめるため、栗の数を 7 個としサンマの数を 8 匹と 3 匹として実行してみた。 この計算があっているか確かめ算を行なった。 pan{c109149}% bc -l [~/Ruby] 150*7+150*8*0.8 2010.0 quit 栗とサンマの値段は 150 円なので 7 と 8 を掛けて、サンマは 5 匹以上買ったの で 0.8 を掛けて割り引きした値段を足す。すると 2010.0 なった。2010.0 円と は数えないので小数ではなく整数で表示する。よって栗を 7 個サンマを 8 匹買っ たときの計算は正しいといえる。 次に栗は 7 個サンマは 3 匹買ったときの確かめ算をする。 pan{c109149}% bc -l [~/Ruby] 150*7+150*3 1500 quit 結果は 1500 になった。よって栗を 7 個サンマを 3 匹買ったときの計算は正し いといえる。 この 2 つの計算からこのプログラムは正しく動いているといえる。 C 1.考えた設定 老人が山に木を植えていくシミュレーションを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def syokurin(k) # メソットの設定 if k >= 80 # もし k が 80 より大きかったら hon = 100 # 変数 hon に 100 を代入する else # 違っていたら hon = 200 # 変数 hon に 200 を代入する end # if の end end # def の end age = 75 # 歳は 75 なので 75 を代入 goukei = 0 # 木の本数は最初 0 本なので 0 を代入 i = 0 # 年数を数える変数 STDERR.print("山に老人が木を植えるシミュレーションをします。\n") STDERR.print("老人は80歳になると足が悪くなり100本しか植えることが\nできなくなってしまう。現在は75歳である。\n") STDERR.print("何年間植えますか?\n") # 標準出力で画面に出力させる 表示させたい文章をカッコとダブルコーテーションで # 表示させる tsuki = gets.to_i # 入力された年数を整数に直し代入する while i < tsuki # 入力された年数分だけ繰り返す printf("%d 年目で植えた木の数\n",i+1) goukei += syokurin(age) # goukei に syokurin(age) # の計算結果を代入する printf("%d 本です。\n",goukei) age += 1 # 次の年齢にするため age に 1 を足す i += 1 # 次の年にするため i に 1 を足す print("\n") end # while の end 3.元にしたプログラムからの変更点 体重ではなく老人が木を植えていくように変更した。 もし 80 歳を超えたら植える本数を 200 から 100 本に減らすようにした。 4.実行結果 pan{c109149}% ./def_sim.rb [~/Ruby] 山に老人が木を植えるシミュレーションをします。 老人は80歳になると足が悪くなり100本しか植えることが できなくなってしまう。現在は75歳である。 何年間植えますか? 9 1 年目で植えた木の数 200 本です。 2 年目で植えた木の数 400 本です。 3 年目で植えた木の数 600 本です。 4 年目で植えた木の数 800 本です。 5 年目で植えた木の数 1000 本です。 6 年目で植えた木の数 1100 本です。 7 年目で植えた木の数 1200 本です。 8 年目で植えた木の数 1300 本です。 9 年目で植えた木の数 1400 本です。 5.考察 このプログラムがあっているか確かめ算を行なった。 pan{c109149}% bc -l [~/Ruby] 200+200+200+200+200+100+100+100+100 1400 quit 1 年目に植えた木の数 200 本 2 年目に植えた木の数 200 本というように本数 を足していくと 1400 になった。実行結果と確かめ算の答えが同じなのでこのプ ログラムは正しく動いているといえる。 3.感想 歩くおもちゃがあると思う。歩くという行動は右足を前に出し、次に左足を前に 出しまた右足を前に出すの繰り返しなので機械的に、繰り返していると思う。 今回の階乗を理解するのに時間がかかった。今回の講義ノートを何回も見て理解 することがなんとかできた。 4.参考文献 去年の先輩のレポート http://roy/~madoka/2009/r2/05/rpt/c108170.txt 去年の先輩 基礎プログラミング II 第 5 回 「何度も呼び出そう」体力があがったら http://roy/~madoka/2010/r2/05/05_02_theme_02_deccelate.html 西村まどか先生 基礎プログラミング II 第 5 回 「何度も呼び出そう」ほたるの数と米の収穫量 http://roy/~madoka/2010/r2/05/05_04_appendix_01_firefly.html 西村まどか先生 基礎プログラミング II 第 5 回 「何度も呼び出そう」階乗計算 http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 西村まどか先生 順列・組み合わせ http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/prob/node3.html 5.共同学習者 青木 千紗 大島 藍 小松 由里 6.添付