第 6 回 目的に応じて使ってみよう レポート課題 氏名:高田美咲 学籍番号:C1110909 語学クラス:英語1 コース:政策マネジメント 1 A. 配列は[0]から始まるので [0]="a",[1]="b"...と考えると、 alphabet[22]="w"となる。 alphabet配列は[0]から[26]までなので alphabet[-1]はなくnilとなる。 B. < 平均を求める方法 > 全体の合計 / 人数や個数などの数 例題:5人の生徒が数学のテストを受けました。 5人の点数はそれぞれ65点、90点、88点、34点、70点でした。 数学テストの平均点数は? 解き方: 1.合計点数を求める。 pan{TAKADA Misaki}% bc -l [~] 65+90+88+34+70 347 quit 2.合計点を人数で割る。 pan{c111090}% bc -l [~] 347/5 69.40000000000000000000 quit この問題の平均点数は 69.4点 となる。 < 標準偏差を求める方法 > 平均点 69.4点 と 生徒数 5人、各点数65点、90点、88点、34点、70点を 使用して標準偏差を考える。 解き方: 1. 個々の点数と平均点との差を求める。 pan{c111090}% bc -l [~] 65 - 69.4 -4.4 90 - 69.4 20.6 88 - 69.4 18.6 34 - 69.4 -35.4 70 - 69.4 0.6 quit 2. この差を2乗する。 pan{c111090}% bc -l [~] -4.4^2 19.36 20.6^2 424.36 18.6^2 345.96 -35.4^2 1253.16 0.6^2 .36 quit 3. 2で求められた数値の和を求める。 pan{c111090}% bc -l [~] 19.36 + 424.36 + 345.96 + 1253.16 + 0.36 2043.20 quit 4. この和を人数で割る。 pan{c111090}% bc -l [~] 2043.20 / 5 408.64000000000000000000 quit 5. 最後に4で求められた数値を平方根で表す。( ルートでくくる ) (√408.64) ※ ()内はすべてルートでくくられると考える ↓ 0.1は10分の1( 1/10 )、0.01は100分の1( 1/100 )と分数にできるため、 この場合は(√40864)/(√100) となる。 ↓ そして、それぞれを因数分解をした後に約分をしてまとめる。 (√2×2×2×2×2×1277) / (√2×2×5×5) ↓ 2(√2554)/ 5 1から5の手順で標準偏差が求められる。 2. A. < 設定 > テストの点数を入力すると、平均、分散、標準偏差が表示される。 < プログラム > def_statistic.rb #!/usr/koeki/bin/ruby # coding: euc-jp def heikin(kazu) #メソット設定 平均を求めるには sum = 0.0 for ten in kazu #tenの入力はkazuに取り込まれる sum += ten #sumはtenの合計 end sum / kazu.length #合計をkazuの数で割る end def bunsan(kazu) #分散について sum = 0.0 for ten in kazu #tenの入力はkazuに取り込まれる sum += (ten - heikin(kazu)) ** 2 #tenから平均点を引く。その答えの2乗。 end #sumはそれを合計した数値 sum / kazu.length #sumをkazuの数で割る end def hyouzyun(kazu) #標準偏差について Math.sqrt(bunsan(kazu)) #分散の値をルート(平方根)でくくる end test = Array.new #配列 print("入力終了は ctrl d です。\n\n") while true #繰り返し STDERR.print("テストの点数を入力: ") #入力部分 ten = gets #取り込み if ten == nil #ctrl d で終了 break #中止、終了 end test << ten.to_i #配列に要素を付け加える end printf("\n\n" + "平均 %3.1f 点\n",heikin(test)) #結果表示 printf("分散 %6.4f \n",bunsan(test)) #結果表示 printf("標準偏差 %3.4f \n",hyouzyun(test))#結果表示 < もとにしたプログラム、変更点 > def_ary_movie.rbをもとに変数を変更し、分散と標準偏差の メソットを付け加えた。 < 実行結果 > pan{c111090}% ./def_statistic.rb [~/Ruby] 入力終了は ctrl d です。 テストの点数を入力: 79 テストの点数を入力: 82 テストの点数を入力: 98 テストの点数を入力: 60 テストの点数を入力: 61 テストの点数を入力: ^D 平均 76.0 点 分散 202.0000 標準偏差 14.2127 < 考察 > 平均点、分散、標準偏差の値が正しいか確認する。 -- 平均点 -- 入力された数(テストの点数) をすべて足し、入力回数(テストの数) で割る。 pan{c111090}% bc -l [~/Ruby] ( 79 + 82 + 98 + 60 + 61 ) / 5 76.00000000000000000000 quit -- 分散 -- 個々の点数と平均点との差を2乗する。その後、入力回数(テストの数) で割る。 pan{c111090}% bc -l [~/Ruby] (79-76)^2 + (82-76)^2 + (98-76)^2 + (60-76)^2 + (61-76)^2 1010 1010 / 5 202.00000000000000000000 quit -- 標準偏差 -- 標準偏差の値を2乗することで分散と同じ値になる。 pan{c111090}% bc -l [~/Ruby] 14.2127^2 202.00084129 quit 平均点と分散は正しい数値が表示された。 標準偏差については分散値との比較をしたところ小数第3位まで同じ数値となった。 標準偏差は平方根で表すものを数値として表示しているためこの場合、実際は 14.2127....と続くものである。そのため小数第4位以降も表示したとして2乗す るならば限りなく202.0000に近くなると考えられる。 結果、このプログラムは正しく機能しているといえる。 --------------------------------------- B. < 設定 > 入力を変化させることで異なるエンディングを表示する。 < プログラム >def_rollplaying.rb #!/usr/koeki/bin/ruby # coding: euc-jp def oto(x) #メソット 成長してる間 x.times do print("成長中。。。") end print("\n") sleep 1 end def dousa(mono) #メソット 選択部分作成 STDERR.printf("1.%sに水をあげる。\n",mono) STDERR.printf("2.日光があたる場所に移動する。\n") STDERR.printf("3.暇なので観察する。\n\n") end def sonogo(day,kotae) #メソット エンディングをどうするかの設定 w = 1 * day - kotae printf("%d日目\n",day) w.to_i end print("植物を育てます。\n") print("何の植物? :") mono = gets.chomp #植物名を入力してもらい取り込む if mono == "" #何も入力されなかったら花 mono = "花" end printf("\n" + "%sを育てよう!!\n",mono) plant = 0 #初期値は0から day = 1 #初日は1日目からスタート while true #繰り返し print("-"* 20 + "\n") dousa(mono) #メソット表示 print("どれにする?: ") kotae = gets.chomp.to_i oto(1) #メソット表示 print("-"* 30) plant += sonogo(day,kotae) #plantにメソットで計算された値が足される if day >= 5 #5日目までいったら終わり break end day += 1 #dayは1日ずつ増える end print("\n") if plant >= 7 #plantが7より上なら printf("%sは元気に育ちました!!\n",mono) elsif plant >= 3 #plantが3より上なら print("まぁまぁな育ち具合ですね。\n") elsif plant <= 2 #plantが2よりなら print("見てるばかりでは育ちませんよ^^;\n") end < もとにしたプログラム、変更点 > def_rubiocci.rbをもとにして、メソットを変更した。 < 実行結果1 > pan{TAKADA Misaki}% ./def_rollplaying.rb [~/Ruby] 植物を育てます。 何の植物? : 花を育てよう!! -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 1 成長中。。。 ------------------------------1日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 2 成長中。。。 ------------------------------2日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 1 成長中。。。 ------------------------------3日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 2 成長中。。。 ------------------------------4日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 1 成長中。。。 ------------------------------5日目 花は元気に育ちました!! < 実行結果2 > pan{c111090}% ./def_rollplaying.rb [~/Ruby] 植物を育てます。 何の植物? : 花を育てよう!! -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 2 成長中。。。 ------------------------------1日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------2日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 1 成長中。。。 ------------------------------3日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------4日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 2 成長中。。。 ------------------------------5日目 まぁまぁな育ち具合ですね。 < 実行結果3 > pan{c111090}% ./def_rollplaying.rb [~/Ruby] 植物を育てます。 何の植物? : 花を育てよう!! -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------1日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------2日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------3日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------4日目 -------------------- 1.花に水をあげる。 2.日光があたる場所に移動する。 3.暇なので観察する。 どれにする?: 3 成長中。。。 ------------------------------5日目 見てるばかりでは育ちませんよ^^; < 考察 > 選択を変えることで3つのエンディングが表示された。 しかし、本当に正しい結果か確かめるため計算を行なう。 -- 実行結果1 -- pan{c111090}% bc -l [~/Ruby] (1*1-1)+(1*2-2)+(1*3-1)+(1*4-2)+(1*5-1) 8 quit 7以上のため「花は元気に育ちました!!」が表示される。 -- 実行結果2 -- pan{c111090}% bc -l [~/Ruby] (1*1-2)+(1*2-3)+(1*3-1)+(1*4-3)+(1*5-2) 4 quit 3以上のため「まぁまぁな育ち具合ですね。」が表示される。 -- 実行結果3 -- pan{c111090}% bc -l [~/Ruby] (1*1-3)+(1*2-3)+(1*3-3)+(1*4-3)+(1*5-3) 0 quit 2以下のため「見てるばかりでは育ちませんよ^^;」が表示される。 結果、正しく機能している。 このプログラムでは4回以上3を選択しない限り「見てるばかりでは育ちませんよ ^^;」にならない設定となっている。 3. 感想 生活の中でだいたいの一連の動作が決っているものはメソットにできると思う。 例えば、掃除や洗濯などがあると考えた。 今回のプログラム作成は問題Aの方がコマンドライン入力で作成できなかったの が少し残念だった。そして、標準偏差の説明で1277を割り切る数が見つからなかっ たのでそのままの数値で説明したが本当はあるのではと思ったりした。 4. 参考資料 西村まどか 基礎プログラミングII 第6回 目的に応じて使ってみよう 「while 文で入力するとき」 http://roy/~madoka/2012/r2/06/r2_06_10_theme_08_while.html 「るびおっち」 http://roy/~madoka/2012/r2/06/r2_06_11_theme_09_rubiocci.html まつもとゆきひろ Ruby 1.9.2 リファレンスマニュアル 「Mathモジュール」 http://doc.ruby-lang.org/ja/1.9.2/class/Math.html