第 6 回 目的に応じて使ってみよう レポート課題 堀 拓朗 c1111317 英語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"] ◯alphabet[22] alphabet[22]は[]内の22番目の文字ということである。 0番目から始まっているので18番目の文字は「w」である。 ◯alphabet[-1] alphabet[-1]は[]内の-1番目の文字を示しているが、アルファベット に40番目の文字はないのでどうなるのかわからなかった。 そこで実際にプログラムを作って確かめてみた。 ●作成したプログラム alphabet.rb #!/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("22番目は\n") printf("%s\n", alphabet[22]) print("-1番目は\n") printf("%s\n", alphabet[-1]) ●実行結果 pan{c111131}% ./alphabet.rb [~/Ruby] 22番目は w -1番目は z となったため、alphabet[-1]は z ということがわかった。 [-1]は逆から数えた時の1番目だと仮定し、[-5]に変更し もう一度プログラムを実行してみたところ pan{c111131}% ./alphabet.rb [~/Ruby] 22番目は w -5番目は v となったのでやはり逆から数えているといえる。 そのため alphabet[-1] は正しい。 B. ◯平均 ・方法 合計 / 足した個数 ・式 ( a1 + a2 + a3 ... ax ) / x ・具体例 重さが違うりんごが3つありました。 りんごAは100g、Bは150g、Cは200gです。 3つのりんごの重さの平均を求めなさい。 pan{c111131}% bc -l [~/Ruby] ( 100 + 150 + 200 ) / 3 150.00000000000000000000 ◯標準偏差 ・方法 合計 / 足した個数 = 平均 → (それぞれの数 - 平均) の2乗 → 2乗した値の合計 / 足した個数 = 平均2 → 平均2 の 平方根 (√) = 標準偏差 ・式 ( S1 + S2 + S3 ... Sx ) / x = m _______________________________________________________ √((S1-m)**2 + (S2-m)**2 + (S3-m)**2 + ...(Sx-m)**2) / x ・具体例 重さが違うりんごが5つありました。 りんごAは2g、Bは4g、Cは6g、Dは8g、Eは10gです。 5つのりんごの標準偏差を求めなさい。 pan{HORI Takuro}% bc -l [~/Ruby] ( 2 + 4 + 6 + 8 + 10 ) / 5 6.00000000000000000000 (2 - 6)^2 + (4 - 6)^2 + (6 - 6)^2 + (8 - 6)^2 + (10 - 6)^2 40 40 / 5 8.00000000000000000000 =√8 [2] A. ●考えた設定 数字を入力させていきその後で平均、分散の答えを 出力させるプログラム。 ●作成したプログラム def_statistic.rb #!/usr/koeki/bin/ruby # coding: euc-jp def average(suji) sum = 0 # 平均の値を足して行く為の変数 for kazu in suji # kosuuの要素をkazuに代入 sum += kazu # 合計 end # for に対する end sum / suji.length # 平均 = 合計/個数 end # def に対する end def bunsan(suji) goukei = 0 for kosu in suji sum = 0 # 初期値が0 sum += kosu # sum に加算 sum -= average(suji) # 数字 - 平均 sum **= 2 # 差を2乗 goukei += sum # 繰り返しの度2乗した値をひとつづつ足していく end # for に対する end goukei / suji.length # 合計 / 個数 end # def に対する end print"なんでもいいので数を入力していってください。。\n" print"その数の平均、分散を出してさしあげます。\n" suji = Array.new # suji を配列として扱う print"-"*50 print"\n次へは Return を、入力終了は ctrl-d です。\n" print"それではどうぞ!\n" print"-"*50 print"\n" bangou = 1 while true STDERR.printf("[%d]数を入力してください:",bangou) number = gets if number == nil # nil = ctrl-d break # while を抜ける end # if-end suji << number.to_i # number要素を追加 # 整数変換 bangou += 1 # 数を数える end # while に対する end bangou -= 1 # ctrl-d の分の -1 while true # 繰り返し選ばせる print"\n\n何を調べますか?\n" print"1 平均\n" print"2 分散\n" print"3 終了\n" print"番号を入力してください : " choose = gets.to_i # choose に代入 if choose == 1 # もし1(平均なら) printf("\n「%dつの数の平均は %d です」\n",bangou,average(suji)) #average(suji)…averageメソッドに売り上げ個数配列の要素を代入 end #if に対する end if choose == 2 # もし2なら(分散) printf("\n「分散は %d です」\n",bunsan(suji)) #bunsan(suji)…bunsanメソッドに売り上げ個数配列の要素を代入 end # if に 対する end if choose == 3 # もし3なら(終了) print"\n「終了します」\n" exit end # if に対する end end # whlie に対する end ●実行結果 pan{c111131}% ./def_statistic.rb [~/Ruby] なんでもいいので数を入力していってください。 その数の平均、分散を出してさしあげます。 -------------------------------------------------- 次へは Return を、入力終了は ctrl-d です。 それではどうぞ! -------------------------------------------------- [1]数を入力してください:2 [2]数を入力してください:4 [3]数を入力してください:6 [4]数を入力してください:8 [5]数を入力してください:10 [6]数を入力してください:^D 何を調べますか? 1 平均 2 分散 3 終了 番号を入力してください : 1 「5つの数の平均は 6 です」 何を調べますか? 1 平均 2 分散 3 終了 番号を入力してください : 2 「分散は 8 です」 何を調べますか? 1 平均 2 分散 3 終了 番号を入力してください : 3 「終了します」 ●もとのプログラムからの変更点 今回の授業で作成した def_aty_movie.rb を参考にした。 if を追加し選択したものの結果を表示できるように プログラムを付け加えた。 ●考察 ・平均を bc -l で確かめてみた。 pan{c111131}% bc -l [~/Ruby] ( 2 + 4 + 6 + 8 + 10 ) / 5 6.00000000000000000000 ・分散を bc -l で確かめてみた。 pan{HORI Takuro}% bc -l [~/Ruby] (2 - 6)^2 + (4 - 6)^2 + (6 - 6)^2 + (8 - 6)^2 + (10 - 6)^2 40 40 / 5 8.00000000000000000000 と実行結果と同じになったのでこのプログラムは 正常に動作しているといえる。 B. ●考えた設定 method を 3 つ以上使用した、カブトムシの育成ゲーム。 ●作成したプログラム def_rollplaying.rb #!/usr/koeki/bin/ruby #coding euc-jp def plant(kabuto) #成長量表示 method kabuto.times do print("\t+") end print("\n") print("\n") end def message(name) # 文章 method STDERR.printf("%sを育てよう: \n", name) STDERR.print("1\tたたく\n") STDERR.print("2\tエサをやる\n") STDERR.print("3\tなでる\n") end def raise(perday,choice) #日数と成長量計算 method x = 2 * choice - perday printf("%d日目\n",perday) printf("成長量 %d\n", x) #増加量表示 x end print("\n") print("カブトムシを飼うぞ!\n") print("\n") print("まずは名前を決めよう。\n") print("\n") STDERR.printf("名前を入力してください: ") name = gets.chomp # 名前入力 if name == "" # 名前が入力されなかった場合、 name = "カブトムシ" # 自動的にカブトムシになる。 end printf("%sだね! 強く育ててムシキングにしよう!\n",name) happy = 1 # 愛情 strong = 1 # 成長量 day = 0 # 育てた日数 print("\n") print("※ 強さは「+」でわかるぞ!\n") print("\n") print("-" * 50 + "\n") print("\n") while true message(name) # 文章 method 内容表示 grow = gets.chomp.to_i # 番号を選び入力 strong += raise(day,grow) # 成長量計算メソッドの計算式で day と grow を使って計算 printf("強さ strong=%d\n", strong) happy += day * grow + 1 # 日数と番号をかけ、合計を愛情に代入 printf(" 愛情 happy=%d\n", happy) if happy > 7 # 愛情が7より大きい場合、 break # 繰り返しから抜ける。 end plant(grow) day += 1 #一日ずつ増える。 end plant(strong) # 繰り返しが終わったあとの成長量の数だけ↑が表示される。 printf("%sは", name) if strong > 13 # strong が 14 以上だった場合表示 print("ムシキングになれたぞ! やったね!") elsif strong > 8 # strong が 13 以下 8 以上だった場合表示 print("立派に育ったね") else # strong が 8 以下だった場合表示 print("死んでしまいそうだぞ...") end print("\n") print("\n") ●実行結果 ・strong > 13 だった場合 pan{c111131}% ./def_rollplaying.rb [~/Ruby] カブトムシを飼うぞ! まずは名前を決めよう。 名前を入力してください: カブトムシだね! 強く育ててムシキングにしよう! ※ 強さは「+」でわかるぞ! -------------------------------------------------- カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 3 0日目 成長量 6 強さ strong=7 愛情 happy=2 + + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 1日目 成長量 3 強さ strong=10 愛情 happy=5 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 3 2日目 成長量 4 強さ strong=14 愛情 happy=12 + + + + + + + + + ++ + + + カブトムシはムシキングになれたぞ! やったね! ・13 > strong > 8 だった場合 pan{c111131}% ./def_rollplaying.rb [~/Ruby] カブトムシを飼うぞ! まずは名前を決めよう。 名前を入力してください: カブトムシだね! 強く育ててムシキングにしよう! ※ 強さは「+」でわかるぞ! -------------------------------------------------- カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 0日目 成長量 4 強さ strong=5 愛情 happy=2 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 1日目 成長量 3 強さ strong=8 愛情 happy=5 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 3 2日目 成長量 4 強さ strong=12 愛情 happy=12 + + + + + + + + + ++ + カブトムシは立派に育ったね ・strong < 8 だった場合 pan{c111131}% ./def_rollplaying.rb [~/Ruby] カブトムシを飼うぞ! まずは名前を決めよう。 名前を入力してください: カブトムシだね! 強く育ててムシキングにしよう! ※ 強さは「+」でわかるぞ! -------------------------------------------------- カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 1 0日目 成長量 2 強さ strong=3 愛情 happy=2 + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 1日目 成長量 3 強さ strong=6 愛情 happy=5 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 1 2日目 成長量 0 強さ strong=6 愛情 happy=8 + + + + + + カブトムシは死んでしまいそうだぞ... ●もとのプログラムからの変更点 今回の授業で作成した def_rubiocci.rb を参考にした。 計算式と if の範囲を変更した。 ●考察 bc -l でそれぞれの結果を確かめてみた ◯strong > 13 だった場合 ・強さ pan{c111131}% bc -l [~/Ruby] 2 * 3 - 0 + 1 7 2 * 2 - 1 + 7 10 2 * 3 - 2 + 10 14 ・愛情 pan{HORI Takuro}% bc -l [~/Ruby] 0 * 3 + 1 + 1 2 1 * 2 + 1 + 2 5 2 * 3 + 1 + 5 12 ◯13 > strong > 8 だった場合 ・強さ pan{HORI Takuro}% bc -l [~/Ruby] 2 * 2 - 0 + 1 5 2 * 2 - 1 + 5 8 2 * 3 - 2 + 8 12 ・愛情 pan{HORI Takuro}% bc -l [~/Ruby] 0 * 2 + 1 + 1 2 1 * 2 + 1 + 2 5 2 * 3 + 1 + 5 12 ◯strong < 8 だった場合 ・強さ pan{HORI Takuro}% bc -l [~/Ruby] 2 * 1 - 0 + 1 3 2 * 2 - 1 + 3 6 2 * 1 - 2 + 6 6 ・愛情 pan{HORI Takuro}% bc -l [~/Ruby] 0 * 1 + 1 + 1 2 1 * 2 + 1 + 2 5 2 * 1 + 1 + 5 8 というふうに実行結果と同じようになったので このプログラムは正常に動作しているといえる。 B.b. ●考えた設定 前問のプログラムに画像を表示させる機能を追加した プログラム。 ●作成したプログラム def_rollplaying_b.rb #!/usr/koeki/bin/ruby #coding euc-jp def plant(kabuto) #成長量表示 method kabuto.times do print("\t+") end print("\n") print("\n") end def message(name) # 文章 method STDERR.printf("%sを育てよう: \n", name) STDERR.print("1\tたたく\n") STDERR.print("2\tエサをやる\n") STDERR.print("3\tなでる\n") end def raise(perday,choice) #日数と成長量計算 method x = 2 * choice - perday printf("%d日目\n",perday) printf("成長量 %d\n", x) #増加量表示 x end print("\n") print("カブトムシを飼うぞ!\n") print("\n") print("まずは名前を決めよう。\n") print("\n") STDERR.printf("名前を入力してください: ") name = gets.chomp # 名前入力 if name == "" # 名前が入力されなかった場合、 name = "カブトムシ" # 自動的にカブトムシになる。 end printf("%sだね! 強く育ててムシキングにしよう!\n",name) happy = 1 # 愛情 strong = 1 # 成長量 day = 0 # 育てた日数 print("\n") print("※ 強さは「+」でわかるぞ!\n") print("\n") print("-" * 50 + "\n") print("\n") while true message(name) # 文章 method 内容表示 grow = gets.chomp.to_i # 番号を選び入力 strong += raise(day,grow) # 成長量計算メソッドの計算式で day と grow を使って計算 printf("強さ strong=%d\n", strong) happy += day * grow + 1 # 日数と番号をかけ、合計を愛情に代入 printf(" 愛情 happy=%d\n", happy) if happy > 7 # 愛情が7より大きい場合、 break # 繰り返しから抜ける。 end plant(grow) day += 1 #一日ずつ増える。 end plant(strong) # 繰り返しが終わったあとの成長量の数だけ↑が表示される。 printf("%sは", name) if strong > 13 # strong が 14 以上だった場合表示 print("ムシキングになれたぞ! やったね!") system("display kabuto.png&") # kabuto.png を表示させる elsif strong > 8 # strong が 13 以下 8 以上だった場合表示 print("立派に育ったね") else # strong が 8 以下だった場合表示 print("死んでしまいそうだぞ...") end print("\n") print("\n") ●実行結果 ・strong > 13 だった場合 pan{c111131}% ./def_rollplaying.rb [~/Ruby] カブトムシを飼うぞ! まずは名前を決めよう。 名前を入力してください: カブトムシだね! 強く育ててムシキングにしよう! ※ 強さは「+」でわかるぞ! -------------------------------------------------- カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 3 0日目 成長量 6 強さ strong=7 愛情 happy=2 + + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 1日目 成長量 3 強さ strong=10 愛情 happy=5 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 3 2日目 成長量 4 強さ strong=14 愛情 happy=12 + + + + + + + + + ++ + + + カブトムシはムシキングになれたぞ! やったね! # 画像が表示された ・13 > strong > 8 だった場合 pan{c111131}% ./def_rollplaying.rb [~/Ruby] カブトムシを飼うぞ! まずは名前を決めよう。 名前を入力してください: カブトムシだね! 強く育ててムシキングにしよう! ※ 強さは「+」でわかるぞ! -------------------------------------------------- カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 0日目 成長量 4 強さ strong=5 愛情 happy=2 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 1日目 成長量 3 強さ strong=8 愛情 happy=5 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 3 2日目 成長量 4 強さ strong=12 愛情 happy=12 + + + + + + + + + ++ + カブトムシは立派に育ったね ・strong < 8 だった場合 pan{c111131}% ./def_rollplaying.rb [~/Ruby] カブトムシを飼うぞ! まずは名前を決めよう。 名前を入力してください: カブトムシだね! 強く育ててムシキングにしよう! ※ 強さは「+」でわかるぞ! -------------------------------------------------- カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 1 0日目 成長量 2 強さ strong=3 愛情 happy=2 + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 2 1日目 成長量 3 強さ strong=6 愛情 happy=5 + + カブトムシを育てよう: 1 たたく 2 エサをやる 3 なでる 1 2日目 成長量 0 強さ strong=6 愛情 happy=8 + + + + + + カブトムシは死んでしまいそうだぞ... ●もとのプログラムからの変更点 前問で作成した def_rollplaying.rb を参考にした。 system 文を使用し、画像が表示されるようにした。 ●考察 system 文以外は手を加えていないので前問のとおりである。 strong > 13 だった場合に画像が表示されたので このプログラムは正常に動作しているといえる。 [3]感想 今回の課題ではまた数学の要素に苦しめられた。 しかし復習から始めたためそちらの学力も 付いたのではないかと思う。標準偏差については 習ってこなかったと思うのだが、私が忘れているだけ なのかもしれない。 プログラムに関してはゲーム的な要素があったので 考えるのが楽しくできた。B. の b. の問題のも 挑戦してみて画像を作成したが、自分にはやはり 絵のセンスはないようだ。もう2パターンも時間が あるとき作成したいと思う。 method を使用した仕組みについては人生ゲームや心理テストが考えられる。 人生ゲームはルーレットを回して出た数だけ進み、着いたマスで課せられた 条件を果たす。そしてまたルーレットを回す動作を繰り返す。ifメソッド やwhileメソッドが使えると思うので人生ゲームがあてはまると考えた。 心理テストは質問に答えていき、入力されたデータによって結果が変わる ので今回のようにdefメソッド、ifメソッド、whileメソッドが使えると考える。 [4] ●参考文献 ・基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「数値を指定して何度も計算させるには」 http://roy/~madoka/2012/r2/06/r2_06_05_theme_04_for.html 西村まどか ・基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「なわとびの数」 http://roy/~madoka/2012/r2/06/r2_06_07_theme_06_ary.html 西村まどか ・基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「映画の星づけランキング」 http://roy/~madoka/2012/r2/06/r2_06_08_theme_07_aryavg.html 西村まどか ・基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) 「るびおっち」 http://roy/~madoka/2012/r2/06/r2_06_11_theme_09_rubiocci.html 西村まどか ・  ■ 標準偏差 ■  【3】計算練習自由自在 http://www.bekkoame.ne.jp/~mathebit/0f22i76/s_deviation3.html Takanao Nakagawa ●共同学習者 加藤 岳大