2.B.の問題のa.とb.も解答したので、再度メールを送ります。 第 6 回 目的に応じて使ってみよう レポート課題 氏名:高橋岬 学籍番号:c1110973 語学クラス:英語5 コース:環境サイエンスコース 1.A.配列 alphabet について 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"] 私の考え alphabet[22] → 配列は 0 から始まるので、23個目の w alphabet[-1] → 配列は 0 から始まるので、 -1 は nil 確かめるためにプログラムを実行した。 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp 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"] print("アルファベットを配列から引っ張ってきます\n") print("数字を入力してください(qで終了)\n") while true STDERR.print("数字 : ") num = gets.chomp if num == "q" break else printf("alphabet[%d] → %s\n", num.to_i, alphabet[num.to_i]) end end 実行結果 pan{c111097}% ./alphabet.rb [~/Ruby] アルファベットを配列から引っ張ってきます 数字を入力してください(qで終了) 数字 : 0 alphabet[0] → a 数字 : 26 alphabet[26] → 数字 : 22 alphabet[22] → w 数字 : -1 alphabet[-1] → z 数字 : -26 alphabet[-26] → a 数字 : q 考察 alphabet[22] → w alphabet[-1] → z 0 は 配列の一番最初なので a となり、 26 は 1つずれているので nil 。 -1 は配列の後ろから1つ目になるようだ。 -26 が a になるので、 - を付けると後ろから数えることがわかった。 B.生徒10人の数学のテストの点数で考える 生徒 | 得点(x) ------+---------- A | 92 B | 79 C | 83 D | 56 E | 21 F | 97 G | 61 H | 80 I | 53 J | 47 ------+---------- 合計 | 669 まず、平均(μ)は μ = ( 合計 ) / ( 人数 ) であるため μ = 669 / 10 = 66.9 となる。 次に、標準偏差(σ)は σ = √( 分散 ) なので、先に分散(σ^2)を求める。 分散は σ^2 = { ( x - μ ) の合計 }^2 / 人数 となるので 生徒 | 得点(x) | x-μ | (x-μ)^2 ------+---------+-------+----------- A | 92 | 25.1 | 630.01 B | 79 | 12.1 | 146.41 C | 83 | 16.1 | 259.21 D | 56 | -10.9 | 118.81 E | 21 | -45.9 | 2106.81 F | 97 | 30.1 | 906.01 G | 61 | - 5.9 | 34.81 H | 80 | 13.1 | 171.61 I | 53 | -13.9 | 193.21 J | 47 | -19.9 | 396.01 ------+---------+-------+----------- 合計 | 669 | 0.0 | 4962.90 σ^2 = 4962.90 / 10 = 496.29 となる。 よって、標準偏差は σ = √496.29 = 22.27756719213298658432 となる。 2.A.def_statistic.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp i = 0 # 変数 i if ARGV[i] == nil # 数値の指定がない場合 # ARGV プログラム名わきの文字 STDERR.print("入力した数値の 平均/分散/標準偏差 を求めます\n") STDERR.print("例 : ./def_statistic.rb 自然数 自然数 ... 自然数\n") exit # プログラム終了 end num = Array.new # 配列 num を準備する sum = 0 # 変数 sum while 0 < ARGV[i].to_f # ARGV[i] が0より大きい限り計算 # (数値が無くなり次第終了) num << ARGV[i].to_f # ARGV[i] を小数値にして num に入れる sum += num[i] # sum に num[i] を足す i += 1 # i に 1 を足す end ave = sum / i # 変数 ave は sum 割る i (平均)とする printf(" 平均 : %3.2f\n", ave) j = 0 # 変数 j sig = 0 # 変数 sig num2 = Array.new # 配列 num2 を準備する while j < i # j が i より大きくなるまで計算 num2 << (num[j] - ave)**2 # ( num[j] 引く ave )の2乗を num2 に入れる sig += num2[j] # sig に num2[j] を足す j += 1 # j に 1 を足す end var = sig / j # 変数 var は sig 割る j (分散)とする sd = Math::sqrt(var) # 変数 sd は var の平方根(標準偏差)とする # Math::sqrt( ) は ( ) 内の数値の平方根を求める printf(" 分散 : %3.2f\n", var) printf("標準偏差 : %3.2f\n", sd) 実行結果 a.数値を入力しなかった場合 pan{c111097}% ./def_statistic.rb [~/Ruby] 入力した数値の 平均/分散/標準偏差 を求めます 例 : ./def_statistic.rb 自然数 自然数 ... 自然数 b.数値を入力した場合 pan{c111097}% ./def_statistic.rb 6 7 2 [~/Ruby] 平均 : 5.00 分散 : 4.67 標準偏差 : 2.16 c.数値を入力した場合(途中に0が含まれる) pan{c111097}% ./def_statistic.rb 6 7 2 0 4 8 1 [~/Ruby] 平均 : 5.00 分散 : 4.67 標準偏差 : 2.16 d.数値を入力した場合( 1.B. と同じ条件) pan{c111097}% ./def_statistic.rb 92 79 83 56 21 97 61 80 53 47 [~/Ruby] 平均 : 66.90 分散 : 496.29 標準偏差 : 22.28 考察 a.数値の入力がないときの文章が表示され、プログラムが終了した。 b.この条件のとき、計算は 平均 = (6+7+2)/3 = 5 分散 = {(6-5)^2+(7-5)^2+(2-5)^2}/3 = 4.66666666666666666666 標準偏差 = √4.66666666666666666666 = 2.16024689946928674365 となる。 分散/標準偏差 はいずれも、小数第3位を四捨五入すると 4.67/2.16 になる。 c.プログラムでは while 0 < ARGV[i].to_f # ARGV[i] が0より大きい限り計算 となっているため、0は終了、0以降の数値は取り込まれない。 (このプログラムでは、0は自然数に含まれない) 計算に関しては、 考察/b. と同様の計算結果となる。 d. 1.B. の計算結果と比べてみると、計算結果が同じになっている。 標準偏差 は 小数第3位を四捨五入するため 22.28 となる。 これらの計算結果より、このプログラムは正しく起動していると言える。 参考プログラム 授業で作成した def_sumup.rb def_ary_movie.rb B.def_rollplaying.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def comment(time) # 関数 comment の仮引数を time とする printf("%s回目\n",time) STDERR.print(" 1 : 土砂をかきわける\n") STDERR.print(" 2 : 大声で助けを呼ぶ\n") STDERR.print(" 3 : 諦めてじっと待つ\n") end def physical(voice) # 関数 physical の仮引数を voice とする voice.times do # voice の数だけ print("ハァ...\t") # kterm に表示する end print("\n\n") sleep 1 end def body(move) # 関数 body の仮引数を move とする 3 - move end STDERR.print("名前 : ") name = gets.chomp # 入力された文字を name とする if name == "" # name がなかったら name = "あなた" # name を あなた とする end print("\n") sleep 1 printf("洞窟探索中突如岩が崩れて、%sは洞窟に閉じ込められました\n", name) printf("どうにかして脱出しなければ...どうする?\n\n") sleep 2 i = 0 # 変数 i について hp = 100 # 変数 hp について help = 0 # 変数 help について while i < 5 # i が5より小さい限り計算をつづける i += 1 # i に 1足す comment(i) # comment に i をいれる ans = gets.to_i # 入力されたものを ans とし、整数値として扱う physical(body(ans)) # physical に[ body に ans をいれた]関数をいれる hp -= body(ans) * 10 # hp から body に ans をいれ10かけた数値を引く help += body(ans) * 5 # help に bosy に ans をいれ5かけた数値を足す # printf("体力:%d\t助け:%d\n", hp, help) end if help >= 20 # help が20以上だったら if ans == 1 # 最後に入力された ans が1だったら print("光が見えた...\n") elsif ans == 2 # 最後に入力された ans が2だったら print("偶然通りかかった人が気付いてくれたようだ...\n") end sleep 1 print("脱出成功!!\n\n") sleep 1 if hp <= 30 # hp が30以下だったら printf("力尽きた%sは、近くにあった滝の主・河童になりました\n", name) else # それ以外だったら print("無事、家まで帰れました\n") end else #それ以外だったら print("脱出失敗...\n\n") sleep 1 printf("悟りを開いた%sは、仙人になりました\n", name) end 実行結果 a.pan{c111097}% ./def_rollplaying.rb [~/Ruby] 名前 : 洞窟探索中突如岩が崩れて、あなたは洞窟に閉じ込められました どうにかして脱出しなければ...どうする? 1回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 2回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 3回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 4回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 5回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 光が見えた... 脱出成功!! 力尽きたあなたは、近くにあった滝の主・河童になりました b.pan{c111097}% ./def_rollplaying.rb [~/Ruby] 名前 : 洞窟探索中突如岩が崩れて、あなたは洞窟に閉じ込められました どうにかして脱出しなければ...どうする? 1回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 2回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 3回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 4回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 5回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 偶然通りかかった人が気付いてくれたようだ... 脱出成功!! 無事、家まで帰れました c.pan{c111097}% ./def_rollplaying.rb [~/Ruby] 名前 : 洞窟探索中突如岩が崩れて、あなたは洞窟に閉じ込められました どうにかして脱出しなければ...どうする? 1回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 2回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 3回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 4回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 5回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 脱出失敗... 悟りを開いたあなたは、仙人になりました 考察 a.計算は以下のようになる hp : 100 - ( 2*10 + 0*10 + 1*10 + 2*10 + 2*10 ) = 30 help : 2*5 + 0*5 + 1*5 + 2*5 + 2*5 = 35 よって help が20以上なので脱出成功、 hp が30以下なので河童になった。 また、最後に入力されたのが1なので、"光が〜"と表示された。 b.計算は以下のようになる hp : 100 - ( 0*10 + 1*10 + 2*10 + 1*10 + 1*10 ) = 50 help : 0*5 + 1*5 + 2*5 + 1*5 + 1*5 = 25 よって help が20以上なので脱出成功、 hp が30より大きいので帰宅できた。 また、最後に入力されたのが2なので、"偶然〜"と表示された。 c.計算は以下のようになる hp : 100 - ( 0*10 + 1*10 + 0*10 + 0*10 + 2*10 ) = 70 help : 0*5 + 1*5 + 0*5 + 0*5 + 2*5 = 15 よって help が20未満なので脱出失敗し、仙人になった。 これらの結果より、このプログラムは正しく起動していると言える。 参考プログラム 授業で使用した def_rubiocci.rb a.def_rollplay_a.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def comment(time) # 関数 comment の仮引数を time とする printf("%s回目\n",time) STDERR.print(" 1 : 土砂をかきわける\n") STDERR.print(" 2 : 大声で助けを呼ぶ\n") STDERR.print(" 3 : 諦めてじっと待つ\n") end def physical(voice) # 関数 physical の仮引数を voice とする voice.times do # voice の数だけ print("ハァ...\t") # kterm に表示する end print("\n\n") sleep 1 end def body(move) # 関数 body の仮引数を move とする 3 - move end STDERR.printf("名前 : ") name = gets.chomp # 入力された文字を name とする if name == "" # name がなかったら name = "あなた" # name を あなた とする end print("\n") sleep 1 printf("洞窟探索中突如岩が崩れて、%sは洞窟に閉じ込められました\n", name) printf("どうにかして脱出しなければ...どうする?\n\n") sleep 2 i = 0 # 変数 i について hp = 100 # 変数 hp について help = 0 # 変数 help について while i < 5 # i が5より小さい限り計算をつづける i += 1 # i に 1足す comment(i) # comment に i をいれる ans = gets.to_i # 入力されたものを ans とし、整数値として扱う physical(body(ans)) # physical に[ body に ans をいれた]関数をいれる hp -= body(ans) * 10 # hp から body に ans をいれ10かけた数値を引く help += body(ans) * 5 # help に bosy に ans をいれ5かけた数値を足す # printf("体力:%d\t助け:%d\n", hp, help) end pt = hp + help # 変数 pt は hp に help を足す record = Hash.new # 配列 record を準備する j = 1 # 変数 j について if help >= 20 # help が20以上だったら if ans == 1 # 最後に入力された ans が1だったら print("光が見えた...\n") elsif ans == 2 # 最後に入力された ans が2だったら print("偶然通りかかった人が気付いてくれたようだ...\n") end sleep 1 print("脱出成功!!\n\n") sleep 1 if hp <= 30 # hp が30以下だったら printf("力尽きた%sは、近くにあった滝の主・河童になりました\n", name) else # それ以外だったら print("無事、家まで帰れました\n") end open("rollplaying.dat", "a") do |write| # rollplaying.dat を読みこみ書き足し( a )、 write とする write.printf("%s\t%d\n", name, pt) # write に書き足す内容 end open("rollplaying.dat", "r") do |read| # rollplaying.dat を読みこみ( r )、 read とする while line = read.gets # read のデータを line として得る if /(\S+)\s+(\d+)/ =~ line # line の内容 record[$1] = $2.to_i # $1 を record の value とし、 $2 を key とする end end end print("\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n") print("順位 : 名前 / ポイント\n") sleep 1 for juni in record.keys.sort{|x,y| record[y] <=> record[x]} # record の key を大きい順に並べ替え、 juni とする printf("\n%d位 : %s / %d\n", j, juni, record[juni]) j += 1 # j に1足す end else #それ以外だったら print("脱出失敗...\n\n") sleep 1 printf("悟りを開いた%sは、仙人になりました\n", name) end 実行結果 pan{c111097}% ./def_rollplaying_a.rb [~/Ruby] 名前 : saki 洞窟探索中突如岩が崩れて、sakiは洞窟に閉じ込められました どうにかして脱出しなければ...どうする? 1回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 2回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 3回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 4回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 5回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 偶然通りかかった人が気付いてくれたようだ... 脱出成功!! 無事、家まで帰れました =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 順位 : 名前 / ポイント 1位 : me / 80 2位 : king / 75 3位 : saki / 70 4位 : misaki / 65 5位 : あなた / 65 プログラム実行後の rollplaying.dat あなた 65 misaki 65 king 75 me 80 saki 70 考察 計算に関しては rollplaying.rb と変わりない。 順位の表示は、引っ張ってきたデータを並び替えて表示している。 よって、このプログラムは正しく起動している。 参考プログラム rollplaying.rb 参考URL 2010 西村まどか 基礎プログラミングII 第6回 目的に応じて使ってみよう 講評 5 横山広樹さん http://roy/~madoka/2010/r2/06/rpt/c109149.txt a.rollplaying_b.rb 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def comment(time) # 関数 comment の仮引数を time とする printf("%s回目\n",time) STDERR.print(" 1 : 土砂をかきわける\n") STDERR.print(" 2 : 大声で助けを呼ぶ\n") STDERR.print(" 3 : 諦めてじっと待つ\n") end def physical(voice) # 関数 physical の仮引数を voice とする voice.times do # voice の数だけ print("ハァ...\t") # kterm に表示する end print("\n\n") sleep 1 end def body(move) # 関数 body の仮引数を move とする 3 - move end STDERR.printf("名前 : ") name = gets.chomp # 入力された文字を name とする if name == "" # name がなかったら name = "あなた" # name を あなた とする end print("\n") sleep 1 system 'display doukutu.png&' # 画像表示 printf("洞窟探索中突如岩が崩れて、%sは洞窟に閉じ込められました\n", name) printf("どうにかして脱出しなければ...どうする?\n\n") sleep 2 i = 0 # 変数 i について hp = 100 # 変数 hp について help = 0 # 変数 help について while i < 5 # i が5より小さい限り計算をつづける i += 1 # i に 1足す comment(i) # comment に i をいれる ans = gets.to_i # 入力されたものを ans とし、整数値として扱う physical(body(ans)) # physical に[ body に ans をいれた]関数をいれる hp -= body(ans) * 10 # hp から body に ans をいれ10かけた数値を引く help += body(ans) * 5 # help に bosy に ans をいれ5かけた数値を足す # printf("体力:%d\t助け:%d\n", hp, help) end if help >= 20 # help が20以上だったら if ans == 1 # 最後に入力された ans が1だったら print("光が見えた...\n") elsif ans == 2 # 最後に入力された ans が2だったら print("偶然通りかかった人が気付いてくれたようだ...\n") end sleep 1 print("脱出成功!!\n\n") sleep 1 if hp <= 30 # hp が30以下だったら printf("力尽きた%sは、近くにあった滝の主・河童になりました\n", name) system 'display kappa.png&' # 画像表示 else # それ以外だったら print("無事、家まで帰れました\n") end else #それ以外だったら print("脱出失敗...\n\n") sleep 1 printf("悟りを開いた%sは、仙人になりました\n", name) system 'display sennin.png&' # 画像表示 end STDERR.print(" q を入力するととイラストが消えます。: ") pic = gets.chomp if pic == "q" system('pkill display -U `whoami`') # 表示された画像を消す end 実行結果 pan{c111097}% ./def_rollplaying_b.rb [~/Ruby] 名前 : 洞窟探索中突如岩が崩れて、あなたは洞窟に閉じ込められました どうにかして脱出しなければ...どうする? 1回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 2回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 2 ハァ... 3回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 4回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 1 ハァ... ハァ... 5回目 1 : 土砂をかきわける 2 : 大声で助けを呼ぶ 3 : 諦めてじっと待つ 3 脱出成功!! 力尽きたあなたは、近くにあった滝の主・河童になりました q を入力するととイラストが消えます。: q 考察 計算に関しては rollplaying.rb と変わりない。 画像の表示は、条件に応じて表示され、 q を入力すると消すことができた。 よって、このプログラムは正しく起動している。 参考プログラム rollplaying.rb 3.感想 ゲームでこのような仕組みを使っているのは、育成ゲーム・ロールプレイングゲームだと思う。 日常生活では占いなどでこのような仕組みが使われているのではないだろうか。 2.A. に関して、 for_jump.rb を参考にすればもっと構造が簡単なプログラムになったのではないだろうか、とあとで思った。 そのうち時間をみつけて作り直してみようと思う。 ----------------------------- 高橋 岬 東北公益文科大学 2年 c111097@g.koeki-u.ac.jp -----------------------------