第 6 回 目的に応じて使ってみよう レポート課題 氏名:井上 宏美 学籍番号:c1110223 語学クラス:英語3 コース:政策マネジメント 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,4…と数えるので同じように数えていく。 配列を数える場合、最所は0から数え始めるので a が0番目、b が1番目になる。 その場合、alphabet[22]は、配列の先頭から数えて22番目のことなので、 "w"が当てはまる。 よって、alphabet[22]= w となる。 次に、alphabet[-1]を配列に当てはめる。 しかし、配列は25番目までしか存在しないので、-1を数えることは出来ない。 よって、alphabet[-1] =nil(ありません)となるといえる。 B.平均、標準偏差を計算して、プログラム風に表すように考えた。 その場合、 #!/usr/koeki/bin/ruby #coding: euc-jp math = [] sum = 0 # 最初は初期値で考える for o in 0..4 # for データの変数 in 初期値と終了値を指示する printf("%d 番目に入力した数値は? \n",o+1) #初めは、0からスタートなので1番目から始めるには+1にする。 math[o] = get.chomp!.to_f #入力した数字を実数に変換する sum += math[o] #上の行を繰り返して足していく end # for に対する終わり avg = sum / 5 # 平均を出すために全体の数値を割る total = 0 for p in math # for データの変数 in 初期値と終了値を指示 total += (p-avg)**2 #標準偏差を求める際の公式の分子のこと end # for に対する終わり hyojun = total / 5 # 分散を求める式 hyojun2 = Math.sqrt(hyojun) #分散の√をなくし、平方根の計算をする式 printf("平均の値は、 %0.1f である。\n ",avg) #答えを表示させる文 printf("標準偏差は、 %0.1f である。\n",hyojun2) これを、実際にプログラムを作成して実行すると次のようになる。 pan{c111022}% ./def_avg.rb [~/Ruby] 1 番目に入力した数値は? 1 2 番目に入力した数値は? 2 3 番目に入力した数値は? 3 4 番目に入力した数値は? 4 5 番目に入力した数値は? 5 平均の値は、 3.0 である。 標準偏差は、 1.4 である。 式として求められるのは、 「total += ( p - avg)**2」は標準偏差を求める時に使用する公式の分子の 部分である「Σ(測定値-平均値)の2乗」を表す。 このプログラムの場合は入力した5個の実数を取り出して足していくために使用 する。 また、上のプログラム中に書いた「分散」は 今回の標準偏差を求める時に使用した「Σ(測定値-平均値)の2乗/データ数」 の「√」をつける前の状態のことを示している。 分散の√を外す式の平方根の計算をする場合は、 「Math.sqrt()」という式を用いて計算する。 2.プログラム問題 A. i.考えた設定 入力されたものを配列にしまい、台風が来る確率の平均・分散・偏差を表示させる プログラムを考えた。 ii.作成したプログラム (def_statistic.rb) #!/usr/koeki/bin/ruby #coding: euc-jp def avg(score) #scoreには配列の入力した数値が入る、メソットの設定 sum = 0.0 #平均を出す際に小数を扱うため初期値も for ame in score # for データの変数 in 配列名 で指示する sum += ame #データの数値を sum に合わせて計算させる end # for に対する終わり sum /score.length # score に入っているデータ数を sum で割る end # def に対する終わり def std(score2) #score2には配列の入力した数値が入る、メソットの設定 Tenki.sqr(avg(score2))# ルートを取れば標準偏差になる end # def に対する終わり odd = Array.new #数値を入れる配列oddを置く while true #実行された結果を処理する STDERR.print("台風が来る確率の数値を入力して下さい。(終了はCtrl+d):") goal = gets #入力した数値を変数 goal に入れる if goal == nil # q(終了)が入力されたら break #終了する end # if に対する終わり odd << goal.to_i #変数に入る数値を配列にしまう end # while に対する終わり printf("\n台風が来る確率の平均は全体の %3.1f です\n",avg(odd)) # score を odd に入る数値にして、関数avgを計算する printf("台風が来る確率の分散は %.3f です\n",avg(odd)) # 分散を計算する iii.もとにしたプログラムからの変更点 メソットの名前を変更した。平均と分散を求められるようにした。 iv.プログラムを実行した結果画面 pan{c111022}% ./def_statistic.rb [~/Ruby] 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):60 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):70 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):40 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):30 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):70 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):^D 台風が来る確率の平均は全体の 54.0 です 台風が来る確率の分散は 54.000 です pan{c111022}% ./def_statistic.rb [~/Ruby] 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):50 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):30 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):10 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):50 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):90 台風が来る確率の数値を入力して下さい。(終了はCtrl+d):^D 台風が来る確率の平均は全体の 46.0 です 台風が来る確率の分散は 46.000 です v.導き出された結果の考察 上記の計算があっているか確かめる。 pan{c111022}% bc -l [~/Ruby] (60+70+40+30+70)/5 54.00000000000000000000 quit pan{c111022}% bc -l [~/Ruby] (50+30+10+50+90)/5 46.00000000000000000000 quit 平均を計算してみると、正しく計算されているといえる。 pan{c111022}% bc -l [~/Ruby] (60-54)^2+(70-54)^2+(40-54)^2+(30-54)^2+(70-54)^2 1320 1320/5 264.00000000000000000000 分散の計算をしたが、実行画面との数値とは異なった。 そのため、分散の結果が正しいかは確認出来なかった。 B. i.考えた設定 宇宙からやってきた宇宙人よしつねを育成するゲームを考えた。 ii.作成したプログラム def_rollplaying.rb #!/usr/koeki/bin/ruby #coding: euc-jp def uchu(name) #メソットを何度も表示させる # name はその時々によって異なる STDERR.printf("%s を世話する。何をする?\n", name) STDERR.printf("1.うどんを食べる\n") STDERR.printf("2.お風呂に入る\n") STDERR.printf("3.なでる\n") end # def に対する終わり def maru(day_a,ans) #メソットを何度も表示される a = 3 + day_a - ans printf("%d日目\n",day_a) a.to_i # a の値を繰り返す end # def に対する終わり print("丸い顔の宇宙人を見つけた!!\n") STDERR.print("名前は何にしようかな?\n") name = gets.chomp #改行の入力されたものを切り取る if name =="" #仮に name が何も入力されなければ name = "よしつね" # name によしつね を代入する end # def に対する終わり day = 0 #0日目から始めるので0を代入する weight = 0 #weight は0 から始めるので0 を代入 print("どういう風に成長するかな?\n") while true # break するまで繰り返す uchu(name) # uchu メソットを呼び出す ans = gets.chomp.to_i #改行に入力されたものを切り取る #整数に直して変数 ans に代入 weight += maru(day,ans) # maru メソットを呼び出して体重を増やす printf("体重は %d\n",weight) if weight >7 # weight が7 以上なら break # 抜く end # if に対するend day += 1 #次の日にするために1を足す end # while に対する終わり printf("%s は",name) if weight > 12 # weight が 12以上ならば print("丸いまんじゅう") elsif weight <=8 # weight が 12以下で 8以上であれば print("健康的な宇宙人くん!") else #それ以外であれば print("ナイスバディな宇宙人!") end # if に対する終わり print("になりました。\n") iii.もとにしたプログラムからの変更点 メソット名を変更した。 自分の選択した答えによって成長する姿が変化するように変更した。 iv.プログラムを実行した結果画面 pan{c111022}% ./rollplaying_a.rb [~/Ruby] 丸い顔の宇宙人を見つけた!! 名前は何にしようかな? よしむね どういう風に成長するかな? よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 1 0日目 体重は 2 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 1 1日目 体重は 5 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 1 2日目 体重は 9 よしむね はナイスバディな宇宙人!になりました。 pan{c111022}% ./rollplaying_a.rb [~/Ruby] 丸い顔の宇宙人を見つけた!! 名前は何にしようかな? どういう風に成長するかな? よしつね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 0日目 体重は 0 よしつね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 1日目 体重は 1 よしつね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 2日目 体重は 3 よしつね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 3日目 体重は 6 よしつね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 4日目 体重は 10 よしつね はナイスバディな宇宙人!になりました。 v.導き出された結果の考察 ナイスバディな宇宙人!の場合 pan{c111022}% bc -l [~/Ruby] 3 + 0 -1 2 3 + 0 -1 2 3 + 0 -1 2 2 + 2 + 2 6 quit 健康的な宇宙人くん!の場合 pan{c111022}% bc -l [~/Ruby] 3 + 0 - 3 0 3 + 1 - 1 3 3 + 2 - 3 2 3 + 3 - 1 5 0 + 3 + 2 + 5 10 quit 丸いまんじゅうの場合 pan{c111022}% bc -l [~/Ruby] 3 + 0 - 3 0 3 + 1 - 1 3 3 + 2 - 3 2 3 + 3 - 1 5 3 + 1 - 1 3 0 + 3 + 2 + 5 + 3 13 quit それぞれの結果はプログラムが指定している数値に当てはまるので 正しく動いているといえる。 選択肢の選び方をどうするとエンディングが異なることが分かった。 B-a i.考えた設定 遊んだ結果を記録し、エンディングに最高点を越えたかを知らせるプログラムを 考えた。 ii.作成したプログラム def_rollplaying_a.rb #!/usr/koeki/bin/ruby #coding: euc-jp def uchu(name) #メソットを何度も表示させる # name はその時々によって異なる STDERR.printf("%s を世話する。何をする?\n", name) STDERR.printf("1.うどんを食べる\n") STDERR.printf("2.お風呂に入る\n") STDERR.printf("3.なでる\n") end # def に対する終わり def maru(day_a,ans) #メソットを何度も表示される a = 3 + day_a - ans printf("%d日目\n",day_a) a.to_i # a の値を繰り返す end # def に対する終わり print("丸い顔の宇宙人を見つけた!!\n") STDERR.print("名前は何にしようかな?\n") name = gets.chomp #改行の入力されたものを切り取る if name =="" #仮に name が何も入力されなければ name = "よしつね" # name によしつね を代入する end # def に対する終わり day = 0 #0日目から始めるので0を代入する weight = 0 #weight は0 から始めるので0 を代入 print("どういう風に成長するかな?\n") while true # break するまで繰り返す uchu(name) # uchu メソットを呼び出す ans = gets.chomp.to_i #改行に入力されたものを切り取る #整数に直して変数 ans に代入 weight += maru(day,ans) # maru メソットを呼び出して体重を増やす printf("体重は %d\n",weight) if weight >7 # weight が7 以上なら break # 抜く end # if に対するend day += 1 #次の日にするために1を足す end # while に対する終わり printf("%s は",name) if weight > 12 # weight が 12以上ならば print("丸いまんじゅう") elsif weight <=8 # weight が 12以下で 8以上であれば print("健康的な宇宙人くん!") else #それ以外であれば print("ナイスバディな宇宙人!") end # if に対する終わり print("になりました。\n") open("def_rollplaying.dat" , "a") do |roy| # rollplaying.dat のファイルをroyに # 置き換え roy.printf("%s\t%d\n",name,weight) #ファイルの中に end # open に対する終わり game = Hash.new # game という新しい Hash をつくる open("def_rollplaying.dat" , "r") do |roi| # rollplaying.dat のファイルを # 読み込みで開き roi名前に while maru = roi.gets # ファイルの中身がなくなるまで繰り返し if /(\S+)\s(\d+)/ =~ maru # 仮に文字列、空白、数字と変数maruが同じなら game[$1] = $2.to_i # Hash の中に代入 end # if に対する終わり end # while に対する終わり end # open に対する終わり o = 1 # o に 1 を代入する print("\n順位\t名前\t体重\n") for rank in game.keys.sort {|r,t| game[t] <=> game[r]} # Hash の value を大きい順で並びかえ変数 rank にいれ、Hashの中にあり繰り返す printf("%2d位\t%s\t%2dkg\n",o,rank,game[rank]) o += 1 # 次の順位にするため 1 を足す end # for に対する終わり iii.もとにしたプログラムからの変更点 前問で作ったプログラムに最高得点が表示されるように変更した。 iv.プログラムを実行した結果画面 pan{c111022}% ./def_rollplaying_a.rb [~/Ruby] 丸い顔の宇宙人を見つけた!! 名前は何にしようかな? よしむね どういう風に成長するかな? よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 1 0日目 体重は 2 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 2 1日目 体重は 4 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 2日目 体重は 6 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 2 3日目 体重は 10 よしむね はナイスバディな宇宙人!になりました。 順位 名前 体重[kg] 1位 よしむね 11kg 2位 よしつね 10kg 3位 キテ− 9kg 4位 チップ 8kg 5位 マリー 7kg 6位 ぷりん 5kg v.導き出された結果の考察 順位 名前 体重[kg] 1位 よしむね 11kg 2位 よしつね 10kg 3位 キテ− 9kg 4位 チップ 8kg 5位 マリー 7kg 6位 ぷりん 5kg と実行結果が表示された。降順に表示されたので正しく表示されたと言える。 B-b i.考えた設定 自作の絵が飛び出るようにするプログラムを考えた。 ii.作成したプログラム def_rollolaying_b.rb #!/usr/koeki/bin/ruby #coding: euc-jp def uchu(name) #メソットを何度も表示させる # name はその時々によって異なる STDERR.printf("%s を世話する。何をする?\n", name) STDERR.printf("1.うどんを食べる\n") STDERR.printf("2.お風呂に入る\n") STDERR.printf("3.なでる\n") end # def に対する終わり def maru(day_a,ans) #メソットを何度も表示される a = 3 + day_a - ans printf("%d日目\n",day_a) a.to_i # a の値を繰り返す end # def に対する終わり print("丸い顔の宇宙人を見つけた!!\n") STDERR.print("名前は何にしようかな?\n") name = gets.chomp #改行の入力されたものを切り取る if name =="" #仮に name が何も入力されなければ name = "よしつね" # name によしつね を代入する end # def に対する終わり day = 0 #0日目から始めるので0を代入する weight = 0 #weight は0 から始めるので0 を代入 print("どういう風に成長するかな?\n") gazo('display http://roy/~c111022/yositsune.png&') #絵を表示させる while true # break するまで繰り返す uchu(name) # uchu メソットを呼び出す ans = gets.chomp.to_i #改行に入力されたものを切り取る #整数に直して変数 ans に代入 weight += maru(day,ans) # maru メソットを呼び出して体重を増やす printf("体重は %d\n",weight) if weight >7 # weight が7 以上なら break # 抜く end # if に対するend day += 1 #次の日にするために1を足す end # while に対する終わり printf("%s は",name) if weight > 12 # weight が 12以上ならば print("丸いまんじゅう") elsif weight <=8 # weight が 12以下で 8以上であれば print("健康的な宇宙人くん!") else #それ以外であれば print("ナイスバディな宇宙人!") end # if に対する終わり print("になりました。\n") open("def_rollplaying.dat" , "a") do |roy| # rollplaying.dat のファイルをroyに # 置き換え roy.printf("%s\t%d\n",name,weight) #ファイルの中に end # open に対する終わり game = Hash.new # game という新しい Hash をつくる open("def_rollplaying.dat" , "r") do |roi| # rollplaying.dat のファイルを # 読み込みで開き roi名前に while maru = roi.gets # ファイルの中身がなくなるまで繰り返し if /(\S+)\s(\d+)/ =~ maru # 仮に文字列、空白、数字と変数maruが同じなら game[$1] = $2.to_i # Hash の中に代入 end # if に対する終わり end # while に対する終わり end # open に対する終わり o = 1 # o に 1 を代入する print("\n順位\t名前\t体重\n") for rank in game.keys.sort {|r,t| game[t] <=> game[r]} # Hash の value を大きい順で並びかえ変数 rank にいれ、Hashの中にあり繰り返す printf("%2d位\t%s\t%2dkg\n",o,rank,game[rank]) o += 1 # 次の順位にするため 1 を足す end # for に対する終わり iii.もとにしたプログラムからの変更点 絵を飛びだすようにgazoを挿入した。 どういう風に変化するかを画像をいれることで分かりやすくした。 iv.プログラムを実行した結果画面 pan{c111022}% ./def_rollplaying_b.rb [~/Ruby] 丸い顔の宇宙人を見つけた!! 名前は何にしようかな? よしむね どういう風に成長するかな? よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 1 0日目 体重は 2 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 2 1日目 体重は 4 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 3 2日目 体重は 6 よしむね を世話する。何をする? 1.うどんを食べる 2.お風呂に入る 3.なでる 2 3日目 体重は 10 よしむね はナイスバディな宇宙人!になりました。 順位 名前 体重 1位 よしむね 11kg 2位 よしつね 10kg 3位 キテ− 9kg 4位 チップ 8kg 5位 マリー 7kg 6位 ぷりん 5kg v.導き出された結果の考察 B-aのプログラムを用いて実行した。 絵は実行画面には表示されていないが、正常に表示されたのでこのプログラムは 正しく表示されていると言える。 3.感想 ネットのゲームなどが相当する。たとえば、選択肢を変えると次に進むステージ が変わる。すると、その次に進むステージを変わって来るのでワンパターンだけ ではない楽しいゲームが成り立っているのだと思った。 4.参考文献など http://roy/~madoka/2012/r2/06/r2_06_02_theme_01_telephone.html 西村まどか先生 第 6 回 (目的に応じて使ってみよう) 「電話番号サービス」 http://roy/~madoka/2012/r2/06/r2_06_04_theme_03_gauss.html 西村まどか先生 第 6 回 (目的に応じて使ってみよう) 「ガウスくんとルビ緒」 http://roy/~madoka/2012/r2/06/r2_06_05_theme_04_for.html 西村まどか先生 第 6 回 (目的に応じて使ってみよう) 「数値を指定して何度も 計算させるには」 http://roy/~madoka/2012/r2/06/r2_06_07_theme_06_ary.html 西村まどか先生 第 6 回 (目的に応じて使ってみよう) 「なわとびの数」 http://roy/~madoka/2012/r1/12/lec/resume.html 西村まどか先生 (前期)第 12 回 「自由課題コンペティション / 画像作成」 http://roy/~naoya/rubyII/2.html 神田直弥先生 第2回 繰り返し表現の復習