第6回 基礎プログラミング II レポート課題 氏名:小松 由里 学籍番号:c1090673 語学クラス:中国語1 コース(系):環境サイエンス 1、筆記問題 A、 まず、配列を全て表示させる。 alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p", "q","r","s","t","u","v","w","x","y","z"] となる。 配列は数える際、0、1、2、3、…というように数えていくので、そのようにして 数えてみる。 alphabet[18]は、配列を先頭から数えて18番目ということなので、数えると、 " s "に当てはまる。 つまり、alphabet[18] = s となった。 次に alphabet[40] を配列に当てはめる。 しかし、配列の中には 25 番目までしか入っていないため、40 番目を数えること ができない。 よって、alphabet[40] = nil (無し) となることがいえる。 ============================================================================== 2、プログラム問題 A、 a、考えた設定 打ち込まれた数値(配列)を取り込んで、来場者数の平均・偏差・分散を表示させる。 プログラム。 b、作成したプログラム(def_statistic.rb) #!/usr/koeki/bin/ruby def average(score) # 平均。数値をしまう変数。 sum = 0.0 # 割り算のため、少数点数にする。 for hito in score # for hito in score で score の中の hito について sum += hito # 値を sum に入れる。 end # for 終わり sum / score.length end # def 終わり def bunsan(score) # 分散 sum = 0.0 for hito in score sum += (hito - average(score))**2 end sum / score.length end # 分散 = ((データ - 平均値 ^2)の総和 / 個数 def hyoujyun(score) # 標準偏差 Math.sqrt(bunsan(score)) # Math.sqrt … ルート end # 標準偏差 = ( 分散 )の平方根 raikyaku = Array.new # 配列 raikyaku を作る。 print("\n") print("水族館の来客数を調べます。\n") print("\n") print("来客数の平均・分散・標準偏差を求めることができます。\n") print("\n") while true # 繰り返し。 STDERR.print "今日の来客人数を入力してください: " line = gets # line を入れる。 if line == nil # もしline なら nil 。 break # 繰り返しから抜ける。 end # if 終わり。 raikyaku << line.to_i # 上か下かどちらでもよい。 end # while 終わり。 printf("\n 来客人数の平均は %3.1f です。分散は %.3f で、標準偏差は %.3f です。\n", average(raikyaku) ,bunsan(raikyaku),hyoujyun(raikyaku)) c、もとにしたプログラム プログラム def_ary.movie.rb を参考にした。 def文を増やし、 分散の式< 分散 = ((データ - 平均値 ^2)の総和 / 個数 > 標準偏差の式< Math.sqrt >を付け加えた。 d、実行結果 水族館の来客数を調べます。 来客数の平均・分散・標準偏差を求めることができます。 pan{c109067}% ./def_statistic.rb [~/Ruby] 今日の来客人数を入力してください: 230 今日の来客人数を入力してください: 502 今日の来客人数を入力してください: 352 今日の来客人数を入力してください: 732 今日の来客人数を入力してください: 642 今日の来客人数を入力してください: 542 今日の来客人数を入力してください: ^D 来客人数の平均は 500.0 です。分散は 28426.667 で、標準偏差は 168.602 です。 e、考察 bc -l で、プログラムで求められた計算が正しいのか確認する。 <始めに来客人数の合計を求める。> pan{c109067}% bc -l [~/Ruby] 230 + 502 + 352 + 732 + 642 + 542 3000 <次に来客人数の1日の平均人数を求める。> 3000 / 6 500.00000000000000000000 <平均人数が求められたので、分散を求める。> (230-500)^2+(502-500)^2+(352-500)^2+(732-500)^2+(642-500)^2+(542-500)^2 170560 170560 / 6 28426.66666666666666666666 <標準偏差は分散で求められた答えの2乗なので、2乗の計算を行う。> 168.602 ^2 28426.634404 quit 計算し、確認したところ、プログラムの答えと一致した。 分散・標準偏差の確認計算では、四捨五入されているため、答えに多生の差が発 生している。 f、参考文献 最後に記載 ============================================================================= B、 a、考えた設定 method を3つ使用し、かえる を看病して回復させる。 名前を付け、育てていくが、もし名前がなにも打ち込まれなかった場合は、"ぴょ ん太"という名前が自動的に付けられる。 b、作成したプログラム(def_rollplaying_a.rb) #!/usr/koeki/bin/ruby def cry(naku) # 数値をしまう変数。 naku.times do # 指定された回数だけ繰り返す。 print("げこ\t") # かえる の鳴き声。 end # def 終わり。 print("\n") # 改行。 sleep(0.5) # sleep させる。 end # def 終わり。 def message(name) STDERR.printf("%sの世話しよう!: \n", name) STDERR.print("[1]\t小粥を食べさせる?\n") STDERR.print("[2]\t花を食べさせる?\n") STDERR.print("[3]\t薬草を食べさせる?\n") end def grow(time, syurui) x = 4 * time - syurui printf("%d日目\n",time) # 日にち printf("体重増加分 %d\n", x) # 体重増加量 x.to_i end print("弱っているカエルを助けた。\n") print("\n") STDERR.printf("まず 名前を付けてあげよう!: ") print("\n") name = gets.chomp if name == "" # もし空白だったら name = "ぴょん太" # ぴょん太 と名付ける end # if 終わり printf("%sという名前を付けてあげた。\n",name) print("\n") manpuku = 1 # 満腹度 weight = 1 # 体重 day = 0 # 育てた日付 print("\n") printf("よく鳴くと元気になってきている証拠だ!\n") print("\n") while true # 繰り返す cry(manpuku) # 鳴き声 message(name) # 文章 a = gets.chomp.to_i # 値を取ってきて、改行を取り、整数にして a にいれる。 print "*" * 80 # アスタリスクを80こ表示させる。 manpuku += day * a printf("満腹度 manpuku = %d\n", manpuku) weight += grow(day,a) printf("体重 weight = %d\n", weight) if manpuku > 4 # 満腹度が 4 より大きければ break # 繰り返しから抜ける end # if 終わり if weight > 4 # 体重が 4 より大きければ break end cry(a) day += 1 end cry(weight) # 最終段階の体重が鳴き声になる.。 printf("%sは", name) if weight > 8 print("元気になり、餅肌の白い") # 鳴き声が 5 以上 8 以下なら、餅肌の白いかえるになる。 elsif weight <= 5 print("元気になり、虹色の") # 5 以下なら、虹色のかえるになる。 else print("元気になり、しゃべる") # それ以外はしゃべるかえるになる。 end print("かえるに進化しました!よかった!\n") c、もとにしたプログラム プログラム def_rubiochi.rb を参考にした。 print文・printf文を変更した。 print("\n") を付け足した。 d、実行結果 3通りの結果が出るように設定されているので、3通り分を表示する。 pan{c109067}% ./def_rollplaying_a.rb [~/Ruby] 弱っているカエルを助けた。 まず 名前を付けてあげよう!: ぴょん太という名前を付けてあげた。 よく鳴くと元気になってきている証拠だ! げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 1 ********************************************************************************満腹度 manpuku = 1 0日目 体重増加分 -1 体重 weight = 0 げこ げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 1 ********************************************************************************満腹度 manpuku = 2 1日目 体重増加分 3 体重 weight = 3 げこ げこ げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 1 ********************************************************************************満腹度 manpuku = 4 2日目 体重増加分 7 体重 weight = 10 げこ げこ げこ げこ げこ げこ げこ げこ げこ げこ ぴょん太は元気になり、餅肌の白いかえるに進化しました!よかった! pan{c109067}% ./def_rollplaying_a.rb [~/Ruby] 弱っているカエルを助けた。 まず 名前を付けてあげよう!: ぴょん太という名前を付けてあげた。 よく鳴くと元気になってきている証拠だ! げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 2 ********************************************************************************満腹度 manpuku = 1 0日目 体重増加分 -2 体重 weight = -1 げこ げこ げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 2 ********************************************************************************満腹度 manpuku = 3 1日目 体重増加分 2 体重 weight = 1 げこ げこ げこ げこ げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 2 ********************************************************************************満腹度 manpuku = 7 2日目 体重増加分 6 体重 weight = 7 げこ げこ げこ げこ げこ げこ げこ ぴょん太は元気になり、虹色のかえるに進化しました!よかった! pan{c109067}% ./def_rollplaying_a.rb [~/Ruby] 弱っているカエルを助けた。 まず 名前を付けてあげよう!: ぴょん太という名前を付けてあげた。 よく鳴くと元気になってきている証拠だ! げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 3 ********************************************************************************満腹度 manpuku = 1 0日目 体重増加分 -3 体重 weight = -2 げこ げこ げこ げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 3 ********************************************************************************満腹度 manpuku = 4 1日目 体重増加分 1 体重 weight = -1 げこ げこ げこ げこ げこ げこ げこ ぴょん太の世話しよう!: [1] 小粥を食べさせる? [2] 花を食べさせる? [3] 薬草を食べさせる? 3 ********************************************************************************満腹度 manpuku = 10 2日目 体重増加分 5 体重 weight = 4 げこ げこ げこ げこ ぴょん太は元気になり、しゃべるかえるに進化しました!よかった! e、考察 [1]を押し続けると、餅肌のかえる。 [2]を押し続けると、虹色のかえる。 [3]を押し続けると、しゃべるかえる。 になるように設定したので、このプログラムは正しく表示されていることがいえる。 確認のため、体重増加分 の計算を行う。 体重増加分を求めるには、 x = 4 * time - syurui に当てはめて計算する。 始めに、餅肌になる かえる の計算を行う。 pan{c109067}% bc -l [~/Ruby] 4 * 0 - 1 -1 4 * 1 - 1 3 4 * 2 - 1 7 quit << 5 以上 8 以下なら、餅肌の白い かえる になる設定。>> 次に、虹色になる かえる の計算を行う。 pan{c109067}% bc -l [~/Ruby] 4 * 0 - 2 -2 4 * 1 - 2 2 4 * 2 - 2 6 quit <<それ以外の数値は虹色の かえるになる設定。>> 最後に、しゃべる かえる の計算を行う。 pan{c109067}% bc -l [~/Ruby] 4 * 0 - 3 -3 4 * 1 - 3 1 4 * 2 - 3 5 quit << 5 以下なら、しゃべる かえる になる設定。>> それぞれの数値をプログラムによって求められた数値と当てはめると全て一致し 、また、設定したエンディングの基準とも一致したため、このプログラムは正し いといえる。 f、参考文献 最後に記載 3、感想 ====================================================================== method の考え方は、ゲームで、主人公にどちらかのアイテムを選ばせ、そのア イテムにより話が変化する。生年月日・名前占いなどが当てはまると思う。 今回のプログラム問題 A では、"分散"の部分のプログラムがなかなか解けなかっ た。しかし、友達に教えてもらい、解くことができた。新たに、 Math.sqrt(ルー ト)を学ぶことができたので良かった。 そして、問題 B では、かえる を助けるはずが、逆にマイナス何十キロ というような数値がでてしまうことがあった。しかし、プログラムの値を変更し たことにより、きちんと値をプラスにすることができた。数値一つで大きく変化 するものなのだと思った。 プログラムはゲーム感覚だったので、プログラムを作成するのが楽しかった。 4、参考文献 =================================================================== 西村 まどか 基礎プログラミング I 第5回 配列の構造 http://roy/~madoka/2010/r1/05/ 「配列 Array」 http://roy/~madoka/2010/r1/05/05_03_theme_02_array.htmlhttp://roy/~madoka/2010/r1/05/05_03_theme_02_array.html 向後 千春 kogolad.jp http://kogolab.jp/wordpress/ 1.4 分散と標準偏差 http://kogolab.jp/elearn/hamburger/chap1/sec4.html 作者不明 Math http://www.ruby-lang.org/ja/man/html/mathn.html 強力してくれた先輩 工藤 智也さん 共同学習者 青木 千紗 久保田 瑛一郎 横山 広樹