第6回 目的に応じて使ってみよう レポート課題 氏名: 村上茉奈美 学籍番号: C1111352 語学クラス: 英語3 コース: 社会福祉 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"] 配列の先頭のデータは 0 番目となり、 その後のデータが 1 番目、 2 番目と続く。 それに従って、データに番号をふる。 a = 0 f = 5 k = 10 p = 15 u = 20 z = 25 b = 1 g = 6 l = 11 q = 16 v = 21 c = 2 h = 7 m = 12 r = 17 w = 22 d = 3 i = 8 n = 13 s = 18 x = 23 e = 4 j = 9 o = 14 t = 19 y = 24 この方法で問題を考える。 alphabet[22] データを 1 から数えると 22 番目は v だが、今回は配列であるため、 上の方法で考えると、alphabet[22]は w である。 alphabet[-1] 前問と同様の理由から考えると、alphabet[-1]は「空の情報」という意味を 表す nil である。 (データを 0 番目から数えるため、負の数は存在しない。) A の参考文献 ・ http://roy/~madoka/2012/r1/05/r1_05_03_theme_02_array.html 2012年度 基礎プログラミングI 第5回 (配列の構造) 「配列Array」 作者: 西村まどか B. 平均と標準偏差を求める方法・式を分かりやすくするために、 具体例を挙げる。 例: Aさん、Bさん、Cさん、Dさん、Eさん の5人がいる。 5人の身長は Aさん = 154 cm Bさん = 169 cm Cさん = 178 cm Dさん = 172 cm Eさん = 163 cm である。 この5人の平均身長と標準偏差(ずれの平均)を求めよ。 平均の求め方: それぞれの数値を足して、その合計を個数で割る。 (例の場合、5人の身長を合計し、人数で割る。) 平均を求める式: f + g + h + i + j / 個数 この式を例に当てはめると ( 154 + 169 + 178 + 172 + 163 ) / 5 となる。 計算すると 836 / 5 = 167.2 。 計算が一致しているか bc -l で確認する。 pan{c111135}% bc -l [~] (154+169+178+172+163)/5 167.20000000000000000000 quit 上の式と同様の計算をした。 その結果、計算が一致していることが分かった。 よって、5人の平均身長は 167.2 cm である。 標準偏差を求める手順: 1. 数値の平均とそれぞれの数値の間の差を求める。 (例の場合、数値の平均は 167 である。 (計算を分かりやすくするため、小数点以下は省く。) それぞれの差は Aさん = -13 Bさん = 2 Cさん = 11 Dさん = 5 Eさん = - 4 になる。) 2. 求めた「平均との差」をそれぞれ2乗する。 (例の場合、Aさんから順に、169・4・121・25・16 である。) 3. 2乗したものを足し、合計を求める。 (例の場合、169 + 4 + 121 + 25 + 16 = 335 になる。) 4. それを個数で割る。 (例の場合、335 / 5 = 67 になる。) 5. これを√(ルート)でくくる。 例の答えは √67 。 よって、例の解答は 平均身長: 167.2 cm 標準偏差: √67 B の参考文献 ・ http://www.bekkoame.ne.jp/~mathebit/0f22i76/s_deviation2.html 「標準偏差」 (式の説明) ・ http://www.bekkoame.ne.jp/~mathebit/0f22i76/s_deviation3.html 「標準偏差」 (計算) どちらも 作者: インターナショナルマスアカデミー 2. A. 1. 考えた設定 1つの学期に履修した科目の試験の点数を入力することによって、 平均点、分散、標準偏差を求めるプログラム(def_statistic.rb)を作成。 2. 作成したプログラム(def_statistic.rb) #!/usr/koeki/bin/ruby #coding: euc-jp if ARGV[0] == nil #もし、数値が入力されないときは nil を返す STDERR.puts("8科目分までの点数の平均や分散、標準偏差を求めます。") STDERR.puts("./def_statistic.rb の後に点数を入力して下さい。") exit(1) #異常終了である end #if に対するend(終わり) def average(score) #average という関数を定義、score は仮引数 sum = 0.0 #割り算をするので、浮動小数点数にしておく for ten in score #score の中の ten について sum += ten #値を sum に入れる end #for に対するend(終わり) sum / score.length #配列 score の要素数を数え、sum で割る end #def に対するend(終わり) exam =[ARGV[0].to_i, ARGV[1].to_i, ARGV[2].to_i, ARGV[3].to_i, ARGV[4].to_i, ARGV[5].to_i, ARGV[6].to_i, ARGV[7].to_i] #配列 exam に、[ ]内の要素を整数にして入れる print("\n") printf("平均は %3.2f 点です。 \n",average(exam)) def bunsan(score) #bunsan という関数を定義、score は仮引数 sum = 0.0 #割り算をするので、浮動小数点数にしておく for ten in score #score の中の ten について sum += (ten - average(score))**2 #(コマンドラインに入力された数値 - 平均点)の2乗の合計が sum end #for に対するend(終わり) sum / score.length #配列 score の要素数を数え、sum を割る end #def に対するend(終わり) exam =[ARGV[0].to_i, ARGV[1].to_i, ARGV[2].to_i, ARGV[3].to_i, ARGV[4].to_i, ARGV[5].to_i, ARGV[6].to_i, ARGV[7].to_i] #配列 exam に、[ ]内の要素を整数にして入れる print("\n") printf("分散は %5.3f です。\n", bunsan(exam)) def hyoujyun(score) #hyoujyun という関数を定義、score は仮引数 Math.sqrt(bunsan(score)) #bunsan(score) の値を Math.sqrt(√(ルート)にする end #def に対するend(終わり) exam =[ARGV[0].to_i, ARGV[1].to_i, ARGV[2].to_i, ARGV[3].to_i, ARGV[4].to_i, ARGV[5].to_i, ARGV[6].to_i, ARGV[7].to_i] #配列 exam に、[ ]内の要素を整数にして入れる print("\n") printf("標準偏差は %5.3f です。\n", hyoujyun(exam)) print("\n") 3. もとにしたプログラムからの変更点 プログラムの先頭の if ARGV[0] == nil ~ end の部分と コマンドラインに入力された値をしまう ARGV[ ] の部分は 前期の授業で作成した argv_ticket.rb をもとにした。 また、平均を求める def 関数の部分は def_ary_movie.rb をもとにした。 自分で考えた設定に沿うように、関数や仮引数、配列名などを変更した。 平均を求める式に加え、分散・標準偏差を求める式を追加した。 4. 実行結果 ・ 実行結果 1 pan{c111135}% ./def_statistic.rb 78 57 48 79 93 81 62 95 [~/Ruby] 平均は 74.12 点です。 分散は 250.109 です。 標準偏差は 15.815 です。 ・ 実行結果 2 pan{c111135}% ./def_statistic.rb 51 45 37 78 59 61 82 75 [~/Ruby] 平均は 61.00 点です。 分散は 232.750 です。 標準偏差は 15.256 です。 ・ 実行結果 3 pan{c111135}% ./def_statistic.rb [~/Ruby] 8科目分までの点数の平均や分散、標準偏差を求めます。 ./def_statistic.rb の後に点数を入力して下さい。 実行結果 3 は、入力されなかった場合にきちんと文章が表示されるのか を確認するために行った。 5. 考察 きちんと計算が合っているか確認するため、2通り実行した。 計算が一致しているか bc -l で確認する。 「平均を求めるために必要な、合計を求める」 ・ 実行結果 1 pan{c111135}% bc -l [~/Ruby] 78+57+48+79+93+81+62+95 593 ・ 実行結果 2 pan{c111135}% bc -l [~/Ruby] 51+45+37+78+59+61+82+75 488 「合計を科目数で割って、平均を求める」 ・ 実行結果 1 593/8 74.12500000000000000000 ・ 実行結果 2 488/8 61.00000000000000000000 「分散を求めるために必要な、(コマンドラインに入力された数値 - 平均 点)の2乗を求め、合計する」 ・ 実行結果 1 (78-74.125)^2 15.015625 (57-74.125)^2 293.265625 (48-74.125)^2 682.515625 (79-74.125)^2 23.765625 (93-74.125)^2 356.265625 (81-74.125)^2 47.265625 (62-74.125)^2 147.015625 (95-74.125)^2 435.765625 15.015625+293.265625+682.515625+23.765625+356.265625+47.265625+147.015625+435.765625 2000.875000 ・ 実行結果 2 (51-61)^2 100 (45-61)^2 256 (37-61)^2 576 (78-61)^2 289 (59-61)^2 4 (61-61)^2 0 (82-61)^2 441 (75-61)^2 196 100+256+576+289+4+0+441+196 1862 「2乗の合計を科目数で割って、分散を求める」 ・ 実行結果 1 2000.875000/8 250.10937500000000000000 ・ 実行結果 2 1862/8 232.75000000000000000000 「分散の値は標準偏差の2乗なので、標準偏差を2乗して分散の値になる かを計算する」 ・ 実行結果 1 15.815^2 250.114225 quit ・ 実行結果 2 15.256^2 232.745536 quit 確認したところ、計算が一致していることが分かった。 よって、このプログラムは正しいということができる。 (分散、標準偏差の計算では四捨五入しているため、多少の誤差が 出ている。) 当初、コマンドラインに入力された値の個数を数え上げて計算を したかったのだが、上手く実行されなかったので、入力する個数の 上限を固定して計算を行なった。 今後改善できるようにどのようにすれば良いかを考え、修正したい。 6. 参考文献 ・ http://roy/~madoka/2012/r1/06/r1_06_15_theme_10_commandline.html 2012年度 基礎プログラミングI 第6回 (正規表現と検索) 「コマンドライン入力で結果を得る」 ・ http://roy/~madoka/2012/r1/06/r1_06_16_theme_11_argv_ticket.html 2012年度 基礎プログラミングI 第6回 (正規表現と検索) 「特急券発券」 どちらも、作者: 西村まどか B. 1. 考えた設定 method を3つ使用し、犬のダイエットをする、るびおっち的ゲーム (プログラム: def_rollplaying.rb)を作成。 2. 作成したプログラム(def_rollplaying.rb) #!/usr/koeki/bin/ruby #coding: euc-jp def message(name, day) #message という関数を定義、name,day は仮引数 print("\n") #改行文字 STDERR.printf("☆☆ %d 日目 ☆☆\n", day) #何日目か表示 STDERR.printf("%s のダイエットを始めましょう!\n", name) #名前を表示 #以下、選択肢 STDERR.print("[1]エサを食べる\n") STDERR.print("[2]寝る\n") STDERR.print("[3]散歩をする\n") STDERR.print("[4]ドッグランに行って走る\n") #選択肢ここまで end #def に対するend(終わり) def thin(exercise) #thin という関数を定義、exercise は仮引数 exercise * 200 #必要な式 end #def に対するend(終わり) def kibun(exercise) #kibun という関数を定義、exercise は仮引数 exercise * 2 #必要な式 end #def に対するend(終わり) #以下、実行画面の先頭に表示する説明文 STDERR.print("これは、太ってしまった犬のダイエットをするゲームです。\n") print("\n") STDERR.print("ダイエットする前(現在)は体重が 7kg あります。\n") print("\n") STDERR.print("ダイエットの目標は「5.5kgになるまで」です。\n") print("\n") STDERR.print("できるだけ運動をして、メタボを卒業させましょう!\n") print("\n") STDERR.print("でも、この犬はごろごろすることが好きなようです。\n") print("\n") STDERR.print("なので、運動するとイライラが溜ってきます。\n") print("\n") STDERR.print("幸福度をキープしながら、上手く痩せられるようにしましょう!\n") print("\n") STDERR.print("幸福度が 0 になると、ゲームオーバーです。\n") print("\n") #説明文ここまで STDERR.print("まずは、犬に名前をつけましょう。\n") STDERR.print("何も入力しなければ 「ココ」 になります。\n") print("\n") STDERR.printf("どんな名前にしますか?: \n") #名前の入力を促す name = gets.chomp #入力された文字列を name に取り込む if name == "" #もし入力されなかったら name = "ココ" #名前は ココ にする end #if に対するend(終わり) printf("%s という名前になりました。\n",name) day = 1 #day の初期値は 1 (1日目から) taijyu = 7000 #taijyu の初期値は 7000 g (ダイエット前の体重は 7kg だから) kouhuku = 30 #kouhuku の初期値は 30 while true #繰り返す message(name, day) #message(name, day)に入っているものを表示 answer = gets.to_i #選択肢の数字を整数にして、変数 answer に取り込む if answer >= 3 #もし answer が 3以上だったら taijyu -= thin(answer) #taijyu から thin(answer)の値を引く else #そうでなければ taijyu += thin(answer) #taijyu に thin(answer)の値を足す end #if に対するend(終わり) print("-------------------------\n") #選択肢との境目 printf("%s の今日の体重 %d g\n", name, taijyu) if answer >= 3 #もし answer が 3 以上だったら kouhuku -= kibun(answer) #kouhuku から kibun(answer)の値を引く else #そうでなければ kouhuku += kibun(answer) #kouhuku に kibun(answer)の値を足す end #if に対するend(終わり) printf("%s の現在の幸福度 %d\n", name, kouhuku) print("-------------------------\n") if 0 >= kouhuku #もし kouhuku が 0 を下回ったら printf("%s の幸福度が 0 になってしまいました。\n", name) printf("%s 「もうダイエットなんてしたくない…」\n", name) printf("%s は元気をなくしてしまいました。\n", name) print("残念ながらゲームオーバーです。\n") exit #メッセージを出して強制終了 end #if に対するend(終わり) if taijyu <= 5500 #もし taijyu が 5500 g以下になったら break #終了 end #if に対するend(終わり) day += 1 # day は 1 ずつ増える end #while に対するend(終わり) print("目標の 5500 g を下回りました。\n") print("\n") if day < 4 #もし day が 4より下だったら print("この短期間でよく頑張ったね!\n") print("\n") elsif day > 7 #そうではなく、7より下だったら print("少し時間がかかったけど、ちゃんと痩せたね。\n") print("\n") else #そうでなければ print("まあまあ頑張ったね。\n") print("\n") end #if に対するend(終わり) print("ダイエット成功です!\n") print("\n") print("リバウンドしないように気をつけてあげましょう!\n") 3. もとにしたプログラムからの変更点 def_rubiocci.rb をもとにした。 変数や関数、仮引数の名前を変更した。 説明文をつけ足し、より詳しくした。 幸福度が 0 になると、強制的にゲームオーバーにするようにした。 4. 実行結果 ・ 実行結果 1 何も入力しなければ 「ココ」 になります。 どんな名前にしますか?: ポチ ポチ という名前になりました。 ☆☆ 1 日目 ☆☆ ポチ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 1 ------------------------- ポチ の今日の体重 7200 g ポチ の現在の幸福度 32 ------------------------- ☆☆ 2 日目 ☆☆ ポチ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 3 ------------------------- ポチ の今日の体重 6600 g ポチ の現在の幸福度 26 ------------------------- ☆☆ 3 日目 ☆☆ ポチ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 2 ------------------------- ポチ の今日の体重 7000 g ポチ の現在の幸福度 30 ------------------------- ☆☆ 4 日目 ☆☆ ポチ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 4 ------------------------- ポチ の今日の体重 6200 g ポチ の現在の幸福度 22 ------------------------- ☆☆ 5 日目 ☆☆ ポチ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 4 ------------------------- ポチ の今日の体重 5400 g ポチ の現在の幸福度 14 ------------------------- 目標の 5500 g を下回りました。 まあまあ頑張ったね。 ダイエット成功です! リバウンドしないように気をつけてあげましょう! ・ 実行結果 2 pan{c111135}% ./def_rollplaying.rb [~/Ruby] これは、太ってしまった犬のダイエットをするゲームです。 ダイエットする前(現在)は体重が 7kg あります。 ダイエットの目標は「5.5kgになるまで」です。 できるだけ運動をして、メタボを卒業させましょう! でも、この犬はごろごろすることが好きなようです。 なので、運動するとイライラが溜ってきます。 幸福度をキープしながら、上手く痩せられるようにしましょう! 幸福度が 0 になると、ゲームオーバーです。 まずは、犬に名前をつけましょう。 何も入力しなければ 「ココ」 になります。 どんな名前にしますか?: ナナ ナナ という名前になりました。 ☆☆ 1 日目 ☆☆ ナナ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 3 ------------------------- ナナ の今日の体重 6400 g ナナ の現在の幸福度 24 ------------------------- ☆☆ 2 日目 ☆☆ ナナ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 4 ------------------------- ナナ の今日の体重 5600 g ナナ の現在の幸福度 16 ------------------------- ☆☆ 3 日目 ☆☆ ナナ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 1 ------------------------- ナナ の今日の体重 5800 g ナナ の現在の幸福度 18 ------------------------- ☆☆ 4 日目 ☆☆ ナナ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 4 ------------------------- ナナ の今日の体重 5000 g ナナ の現在の幸福度 10 ------------------------- 目標の 5500 g を下回りました。 まあまあ頑張ったね。 ダイエット成功です! リバウンドしないように気をつけてあげましょう! ・ 実行結果 3 pan{c111135}% ./def_rollplaying.rb [~/Ruby] これは、太ってしまった犬のダイエットをするゲームです。 ダイエットする前(現在)は体重が 7kg あります。 ダイエットの目標は「5.5kgになるまで」です。 できるだけ運動をして、メタボを卒業させましょう! でも、この犬はごろごろすることが好きなようです。 なので、運動するとイライラが溜ってきます。 幸福度をキープしながら、上手く痩せられるようにしましょう! 幸福度が 0 になると、ゲームオーバーです。 まずは、犬に名前をつけましょう。 何も入力しなければ 「ココ」 になります。 どんな名前にしますか?: ココ という名前になりました。 ☆☆ 1 日目 ☆☆ ココ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 4 ------------------------- ココ の今日の体重 6200 g ココ の現在の幸福度 22 ------------------------- ☆☆ 2 日目 ☆☆ ココ のダイエットを始めましょう! [1]エサを食べる [2]寝る [3]散歩をする [4]ドッグランに行って走る 4 ------------------------- ココ の今日の体重 5400 g ココ の現在の幸福度 14 ------------------------- 目標の 5500 g を下回りました。 この短期間でよく頑張ったね! ダイエット成功です! リバウンドしないように気をつけてあげましょう! 5. 考察 入力した名前がきちんと表示されるか、数値が正しいか、 幸福度が 0 になった場合にきちんと終了されるかを確認するため、 3通り実行した。 計算が合っているか bc -l で確認する。 ・ 実行結果 1 体重 pan{c111135}% bc -l [~/Ruby] 7000+(1*200)-(3*200)+(2*200)-(4*200)-(4*200) 5400 quit 幸福度 pan{c111135}% bc -l [~/Ruby] 30+(1*2)-(3*2)+(2*2)-(4*2)-(4*2) 14 quit ・ 実行結果 2 体重 pan{c111135}% bc -l [~/Ruby] 7000-(3*200)-(4*200)+(1*200)-(4*200) 5000 quit 幸福度 pan{c111135}% bc -l [~/Ruby] 30-(3*2)-(4*2)+(1*2)-(4*2) 10 quit ・ 実行結果 3 体重 pan{c111135}% bc -l [~/Ruby] 7000-(4*200)-(4*200) 5400 quit 幸福度 pan{c111135}% bc -l [~/Ruby] 30-(4*2)-(4*2) 14 quit ここでは、体重と幸福度の変化を確かめた。 def関数に入っている式をもとに、計算をした。 その結果、計算が一致していることが分かった。 よって、このプログラムは正しいということができる。 6. 参考文献 ・ http://roy/~madoka/2012/r2/06/r2_06_11_theme_09_rubiocci.html 2012年度 基礎プログラミングII 第6回 (目的に応じて使ってみよう) 「るびおっち」 作者: 西村まどか 3. スーパーのレジが method の考え方を取り入れていると、私は考える。 その理由は、合計はお客さんが買った商品の値段、個数に応じて変化し、 また、1つの商品を何個買うのかによっても違うからである。 例えば 100円のものを x 個買うとすると、100 * x 円となるから、この 部分で関数が使われていると考える。 共同学習者: 浅沼佑香 ・ 伊藤詩野