第6回 基礎プログラミング II レポート課題 氏名: 横山 広樹 学籍番号: C109149A 語学クラス: 英語 1 コース(系): 環境サイエンス A 1. alphabet = ["a","b","c","d",…,"z"] というように配列を用意したとき alphabet[18] は、配列の場合最初 0 から数 え始めるので a が 0番目、 b が 1 番目、 c が 2 番目と数えていくと 18 番 目は s になる。よって alphabet[18] は s になる。 alphabet[40] は上と同じように数えていくが、アルファベットは 26 までしか なく配列も z までしかないので nil つまり何もないという答えがかえってくる。 よって alphabet[40] は nil(ありません)になる。 B A. 1.考えた設定 入力されたものを配列にしまいそこから平均と分散、標準偏差が求められるプロ グラムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def average(kazu) # メソッドの設定 goukei = 0.0 # 平均を求めるので最初 0.0 を代入する for heikin in kazu # kazu 配列の全ての要素に対して繰り返す goukei += heikin # 合計を求めるため足す end # for の end goukei / kazu.size # 平均を求めるため個数で割る end # def の end def var(kazu1) # メソッドの設定 goukei = 0 # goukei1 に 0 を代入 for bunsan in kazu1 # kazu1 配列の全ての要素に対して繰り返す goukei += (bunsan-average(kazu1))**2 # (データ-平均)^2 を計算し答えを全て足す end # for の end goukei / kazu1.size # 分散を求めるため個数で割る end # def の end def stdev(kazu2) # メソッドの設定 Math.sqrt(var(kazu2)) # ルートを取れば標準偏差になるのでルートをとる # Math.sqrt(a) で a の正の平方根 end # def の end total = Array.new # total という新しい配列をつくる while true # break するまで繰り返し STDERR.print("テストの点数を入力して下さい。(終了はq)\n") tensu = gets.chomp # 入力された値を改行を切り取り変数 hensu に代入する if tensu == "q" # もし tensu が q だったら break # while を抜ける end # if の end total << tensu.to_i # tensu を整数に直し total に追加する end # while の end printf("テストの平均は %3.1f です。\n",average(total)) printf("テストの分散は %.3f です。\n",var(total)) printf("テストの標準偏差は %.3f です。\n",stdev(total)) 3.もとにしたプログラムからの変更点 メソッドの名前を変更した。 平均と分散、標準偏差も、求められるようにした。 4.実行結果 pan{c109149}% ./def_statistic.rb [~/Ruby] テストの点数を入力して下さい。(終了はq) 70 テストの点数を入力して下さい。(終了はq) 65 テストの点数を入力して下さい。(終了はq) 80 テストの点数を入力して下さい。(終了はq) 50 テストの点数を入力して下さい。(終了はq) 80 テストの点数を入力して下さい。(終了はq) 85 テストの点数を入力して下さい。(終了はq) 72 テストの点数を入力して下さい。(終了はq) q テストの平均は 71.7 です。 テストの分散は 119.1 です。 テストの標準偏差は 10.9 です。 5.考察 この計算があっているか確かめ算をした。 pan{c109149}% bc -l [~/Ruby] (70+65+80+50+80+85+72)/7 71.71428571428571428571 平均を計算してみると 71.71428571428571428571 となった。表示するとき小数 点第 2 位を四捨五入しているため 71.7 と表示される。よって平均は正しく計 算されているといえる。 (70-71.7)^2+(65-71.7)^2+(80-71.7)^2+(50-71.7)^2+(80-71.7)^2+(85-71.7)^2+(72-71.7)^2 833.43 883.43/7 126.20428571428571428571 分散を計算してみると 126.20428571428571428571 となった。実行結果と大部値 が違う。これはプログラムでは四捨五入せずに計算をしているからである。プロ グラムと同じように結果をだすには、四捨五入せずに計算しなければならない。 しかし、どこまで数が続いているのか分からないので計算のしようが無い。よっ て分散があっているか確認することはできなかった。 10.9^2 118.81 quit 標準偏差を計算すると 118.81 となった。これも四捨五入して計算したため実行 結果と違っている。これも上と同じ理由で標準偏差があっているか確認すること はできなかった。 B. 1.考えた設定 選択肢によって終わり方が違うプログラムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def sewa(namae) # メソッドの設定 STDERR.printf("%s を世話しよう\n",name) STDERR.print("1.エサをあげる\n") STDERR.print("2.一緒に遊ぶ\n") STDERR.print("3.寝る\n") end # def の end def zouka(day_a,kotae) # メソッドの設定 a = 3 + day_a - kotae printf("%d 日目\n",day_a) a.to_i # a の 値を返す end # def の end print("何にでもなれるクラゲを見つけた。\n") STDERR.print("名前は何にするの?\n") name = gets.chomp # 入力されたものを改行を切り取り変数 name に代入する if name == "" # もし neme がなにも入力されなかったら name = "クラゲ" # name に クラゲを代入する end # if の end day = 0 # 0 日目から始めるので 0 を代入 taijyu = 1 # taijyu は 1 から始めるので 1 を代入 print("体重が増えると大きくなるよ\n") while true # break するまで繰り返し sewa(name) # sewa メソッドを呼び出す answer = gets.chomp.to_i # 入力されたものを改行を切り取り整数に直して変数 answer に代入する taijyu += zouka(day,answer) # zouka メソッドを呼び出し体重を増やす printf("体重 : %d \n",taijyu) if taijyu > 6 # taijyu が 6 以上になったら break # while を抜ける end # if の end day += 1 # 次の日にするため 1 を足す end # while の end print("%s は",name) if taijyu > 10 # taijyu が 10 以上だったら print("海坊主") elsif taijyu <= 7 # taijyu が 10 以下で 7 以上だったら print("人魚") else # それ以外だったら print("プランクトン") end # if の end print("になった\n") 3.もとにしたプログラムからの変更点 メソッド名を変更した。 選択した答えによって終わり方が変わるようにした。 4.実行結果 pan{c109149}% ./def_rollplaying_a.rb [~/Ruby] 何にでもなれるクラゲを見つけた。 名前は何にするの? くらげっち 体重が増えると大きくなるよ くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 3 0 日目 体重 : 1 くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 1 日目 体重 : 4 くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 3 2 日目 体重 : 6 くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 3 日目 体重 : 11 くらげっち は海坊主になった pan{c109149}% ./def_rollplaying_a.rb [~/Ruby] 何にでもなれるクラゲを見つけた。 名前は何にするの? 体重が増えると大きくなるよ クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 2 0 日目 体重 : 2 クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 1 日目 体重 : 5 クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 2 日目 体重 : 9 クラゲ は人魚になった pan{c109149}% ./def_rollplaying_a.rb [~/Ruby] 何にでもなれるクラゲを見つけた。 名前は何にするの? 体重が増えると大きくなるよ クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 2 0 日目 体重 : 2 クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 2 1 日目 体重 : 4 クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 2 日目 体重 : 8 クラゲ はプランクトンになった 5.考察 計算があっているか確かめ算をした。 海坊主の場合 pan{c109149}% bc -l [~/Ruby] 3 + 0 - 3 0 3 + 1 - 1 3 3 + 2 - 3 2 3 + 3 - 1 5 1 + 0 + 3 + 2 + 5 11 計算すると 11 になった。プログラムで 11 は海坊主になるので正しく動いて いる。 人魚の場合 3 + 0 - 2 1 3 + 1 - 1 3 3 + 2 - 1 4 1 + 1 + 3 + 4 9 計算すると 9 になった。プログラムで 9 は人魚になるので正しく動いている。 プランクトンの場合 3 + 0 - 2 1 3 + 1 - 2 2 3 + 2 - 1 4 1 + 1 + 2 + 4 8 quit 計算すると 8 になった。プログラムで 8 はプランクトンになるので正しく動い ている。 よってこのプログラムは正しく動いているといえる。 C. 1.考えた設定 前問に遊んだ記録と最高点を超えたかどうか表示させるプログラムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def sewa(namae) # メソッドの設定 STDERR.printf("%s を世話しよう\n",namae) STDERR.print("1.エサをあげる\n") STDERR.print("2.一緒に遊ぶ\n") STDERR.print("3.寝る\n") end # def の end def zouka(day_a,kotae) # メソッドの設定 a = 3 + day_a - kotae printf("%d 日目\n",day_a) a.to_i # a の 値を返す end # def の end print("何にでもなれるクラゲを見つけた。\n") STDERR.print("名前は何にするの?\n") name = gets.chomp # 入力されたものを改行を切り取り変数 name に代入する if name == "" # もし neme がなにも入力されなかったら name = "クラゲ" # name に クラゲを代入する end # if の end day = 0 # 0 日目から始めるので 0 を代入 taijyu = 1 # taijyu は 1 から始めるので 1 を代入 print("体重が増えると大きくなるよ\n") while true # break するまで繰り返し sewa(name) # sewa メソッドを呼び出す answer = gets.chomp.to_i # 入力されたものを改行を切り取り整数に直して変数 answer に代入する taijyu += zouka(day,answer) # zouka メソッドを呼び出し体重を増やす printf("体重 : %d \n",taijyu) if taijyu > 6 # taijyu が 6 以上になったら break # while を抜ける end # if の end day += 1 # 次の日にするため 1 を足す end # while の end printf("%s は",name) if taijyu > 10 # taijyu が 10 以上だったら print("海坊主") elsif taijyu > 8 # taijyu が 10 以下で 8 以上だったら print("人魚") else # それ以外だったら print("プランクトン") end # if の end print("になった\n") open("rollplaying.dat" , "a") do |rol| # rollplaying.dat というファイルを # 追加入力で開き rol という名前に # 置き換える rol.printf("%s\t%d\n",name,taijyu) # ファイルの中にいれる end # open の end rollplay = Hash.new # rollplay という新しい Hash をつくる open("rollplaying.dat" , "r") do |roll| # rollplaying.dat というファイルを # 読み込みで開き roll という名前に # 置き換える while line = roll.gets # ファイルの中身が無くなるまで繰り返す if /(\S+)\s(\d+)/ =~ line # もし文字列、空白、数字と変数 line が # 一致したら rollplay[$1] = $2.to_i # Hash の中に代入する end # if の end end # while の end end # open の end i = 1 # i に 1 を代入する print("\n順位\t名前\t体重\n") for jyuni in rollplay.keys.sort {|x,y| rollplay[y] <=> rollplay[x]} # Hash の Value を大きい順で並びかえ変数 jyuni にいれ、Hash の中にある # 数だけ繰り返す printf("%2d位\t%s\t%2d\n",i,jyuni,rollplay[jyuni]) i += 1 # 次の順位にするため 1 を足す end # for の end 3.もとにしたプログラムからの変更点 違うファイルを作りそこに結果を記録できるようにした。 結果を並びかえ順に表示できるようにした。 4.実行結果 pan{c109149}% ./def_rollplaying_b.rb [~/Ruby] 何にでもなれるクラゲを見つけた。 名前は何にするの? くらげっち 体重が増えると大きくなるよ くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 2 0 日目 体重 : 2 くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 1 日目 体重 : 5 くらげっち を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 3 2 日目 体重 : 7 くらげっち はプランクトンになった 順位 名前 体重 1位 クラゲ 11 2位 アリス 10 3位 次郎 8 4位 くらげっち 7 5位 太朗 7 5.考察 前問で作ったプログラムに結果が表示できるように付け加えただけで、ほかの所 は変更していないので前問の考察から正しく計算されている。 記録したファイルには下のようになっている。 太朗 7 アリス 10 クラゲ 11 次郎 8 くらげっち 7 これを大きい順に並びかえると、 クラゲ 11 アリス 10 次郎 8 くらげっち 7 太朗 7 というように実行結果と同じようになった。よってこのプログラムは正しく動い ているといえる。 D. 1.考えた設定 前問に絵が出るように改良したプログラムを考えた。 2.作成したプログラム #!/usr/koeki/bin/ruby def sewa(namae) # メソッドの設定 STDERR.printf("%s を世話しよう\n",namae) STDERR.print("1.エサをあげる\n") STDERR.print("2.一緒に遊ぶ\n") STDERR.print("3.寝る\n") end # def の end def zouka(day_a,kotae) # メソッドの設定 a = 3 + day_a - kotae printf("%d 日目\n",day_a) a.to_i # a の 値を返す end # def の end print("何にでもなれるクラゲを見つけた。\n") system('display http://roy/~c109149/kurage.png&') # 絵を表示させる STDERR.print("名前は何にするの?\n") name = gets.chomp # 入力されたものを改行を切り取り変数 name に代入する if name == "" # もし neme がなにも入力されなかったら name = "クラゲ" # name に クラゲを代入する end # if の end day = 0 # 0 日目から始めるので 0 を代入 taijyu = 1 # taijyu は 1 から始めるので 1 を代入 print("体重が増えると大きくなるよ\n") while true # break するまで繰り返し sewa(name) # sewa メソッドを呼び出す answer = gets.chomp.to_i # 入力されたものを改行を切り取り整数に直して変数 answer に代入する taijyu += zouka(day,answer) # zouka メソッドを呼び出し体重を増やす printf("体重 : %d \n",taijyu) if taijyu > 6 # taijyu が 6 以上になったら break # while を抜ける end # if の end day += 1 # 次の日にするため 1 を足す end # while の end system('pkill display -U `whoami`') # 絵を消す printf("%s は",name) if taijyu > 10 # taijyu が 10 以上だったら print("海坊主") system('display http://roy/~c109149/bouzu.png&') # 絵の表示 elsif taijyu > 8 # taijyu が 10 以下で 8 以上だったら print("人魚") system('display http://roy/~c109149/ningyo.png&') # 絵の表示 else # それ以外だったら print("プランクトン") system('display http://roy/~c109149/purankuton.png&') # 絵の表示 end # if の end print("になった\n") sleep(2) # 2 秒間止める system('pkill display -U `whoami`') # 絵を消す open("rollplaying.dat" , "a") do |rol| # rollplaying.dat というファイルを # 追加入力で開き rol という名前に # 置き換える rol.printf("%s\t%d\n",name,taijyu) # ファイルの中にいれる end # open の end rollplay = Hash.new # rollplay という新しい Hash をつくる open("rollplaying.dat" , "r") do |roll| # rollplaying.dat というファイルを # 読み込みで開き roll という名前に # 置き換える while line = roll.gets # ファイルの中身が無くなるまで繰り返す if /(\S+)\s(\d+)/ =~ line # もし文字列、空白、数字と変数 line が # 一致したら rollplay[$1] = $2.to_i # Hash の中に代入する end # if の end end # while の end end # open の end i = 1 # i に 1 を代入する print("\n順位\t名前\t体重\n") # Hash の Value を大きい順で並びかえ変数 jyuni にいれ、Hash の中にある # 数だけ繰り返す for jyuni in rollplay.keys.sort {|x,y| rollplay[y] <=> rollplay[x]} printf("%2d位\t%s\t%2d\n",i,jyuni,rollplay[jyuni]) i += 1 # 次の順位にするため 1 を足す end # for の end 3.もとにしたプログラムからの変更点 絵が出てくるように open をつかった。 並びかえるために sort をつかった。 4.実行結果 pan{c109149}% ./def_rollplaying_c.rb [~/Ruby] 何にでもなれるクラゲを見つけた。 名前は何にするの? 体重が増えると大きくなるよ クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 2 0 日目 体重 : 2 クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 1 1 日目 体重 : 5 クラゲ を世話しよう 1.エサをあげる 2.一緒に遊ぶ 3.寝る 3 2 日目 体重 : 7 クラゲ はプランクトンになった 順位 名前 体重 1位 アリス 10 2位 次郎 8 3位 クラゲ 7 4位 くらげっち 7 5位 太朗 7 5.考察 計算は前問と同じように、B のプログラムに順位と絵が表示されるように付け加 えただけで、ほかは変更していないため計算は正しく動いている。 実行結果では表示されていないが、実行してみると絵がきちんとでてくるのでこ のプログラムは正しく動いている。よってこのプログラムは正しく動いていると いえる。 3.感想 メソッドを使ってトランプが出来ると思う。配列をつくりそこにカードをしまい 並びかえたり、カードを配るようなメソッドを作れば出来ると思う。 今回の課題をやってみてこれを応用すれば自分でも、ゲームを作ることが出来る のではないかと思った。なので自由課題では面白いゲームを作りたいと思う。 4.参考文献 去年の先輩のレポート http://roy/~madoka/2009/r2/06/rpt/c108077.txt 去年の先輩 1.4 分散と標準偏差 http://kogolab.jp/elearn/hamburger/chap1/sec4.html mathn - Rubyリファレンスマニュアル http://www.ruby-lang.org/ja/man/html/mathn.html 5.共同学習者 青木 千紗 小松 由里 久保田 瑛一郎 6.添付