第 7 回 専門演習紹介 レポート課題 氏名: 土門千里 学籍番号: C1111122 語学クラス: 英語5 コース: 政策マネジメント 1. A. a. 仕様書 テスト平均点計算プログラム <企画書> テストの結果が分かった後に、自分のテストの平均点や分散などの計算をし、自 分の苦手な科目を分析したことなどがあまり無いため、このようなプログラムを 作成した。 現在のテストの平均点と過去のテストの平均点を比較したり、それを通して自分 の苦手な科目を分析したり、改善点をみつけて反省することが出来るのではない かと考え、このプログラムの作成に至った。 <今後の課題> 平均点と分散の計算をすることは出来るが、入力したデータを出力することが出 来ないため、どの科目でどれだけの点数をとったのかを出力することが出来るよ うに改良を加えていきたい。 <取り扱い説明書> A. プログラム内容 このプログラムは自分のテストの点数データを入力することにより、その時のテ ストの平均点や分散を計算し、その結果を test.txt に書きこむプログラムです。 自分の苦手な科目を分析するときや、過去の成績を振り返り改善点を見つけるこ とが出来ます。 B. ダウンロードが必要なファイル ・plan.txt(仕様書) ・test.rb(プログラム) ・test.txt(テスト結果記録表) これらのファイルは同じディレクトリに保存して下さい。 C. ダウンロードの手順 1. ダウンロードしたいプログラムの URL にマウスのカーソルをあわせ、右クリッ クをします。次に「Save Link As...」をクリックし、プルダウンメニューか ら プログラムを保存したい場所を選択します。保存したい場所を選択し、 「Save」をクリックすることによってプログラムの保存が完了します。 2. ダウンロードしたプログラムを Ruby などに移動させたい場合は、 「mv プログラム名 移動させたい場所(Ruby など)」で移動をさせることが出 来ます。 3. cd プログラムを移動させた場所 → ls でダウンロードしたプログラムを確 認することができたら、ダウンロードとプログラムの移動が正常に行われた ということになります。 D. プログラム実行の手順 (Kterm での実行) 1. プログラムを保存した場所に移動し、「ls」 でプログラムがあることを確認 した後、「chmod +x 実行させたいプログラム」でプログラムを実行すること が出来る状態に変換します。 2. もう一度「ls」を入力し、実行させたいプログラム名の後ろに 「*」 (アス タリスク)がついていればプログラムが実行可能な状態になっています。 3. プログラムを実行するには「./ 実行したいプログラム」で実行することが可 能です。 4. プログラムを実行し、プログラムの最後に「小遣い帳へ書きこみました」と いう表示がされれば、「pmoneybook.txt」に実行結果が書きこまれます。 「pmoneybook.txt」の内容を知りたい場合は、「cat pmoney.txt」で表示さ せることが出来ます。 E. 著作権について このプログラムは 東北公益文科大学 2011 年度生 土門千里が著作権を保有して います。このプログラムの入手、実行、改変、再配布はいずれも無料で自由に行 うことが出来ます。ただし、このプログラムを取り扱うことで生じるいかなる結 果に対しても著作権者は責任を負いません。 このプログラムに対する感想、意見、批判などは下記のメールアドレスへお願い します。 c111112@g.koeki-u.ac.jp (迷惑メール対策のため@は全角になっています) b. プログラム本体 1) 考えた設定 入力された点数データを元にして、テストの平均点や分散を計算し、それを他の ファイルに出力するプログラム。 2) 参考にしたプログラムからの変更点 def_statistic.rb を元にした。 変更点としては、平均点と分散を計算した結果を他のファイルに出力するという 点である。 3) 作成したプログラム #!/usr/koeki/bin/ruby # coding: euc-jp def average(test) # test - 数値をしまう配列 sum = 0.0 # 小数点以下も計算 for point in test # test の中の point について sum += point # 入力されたテストの得点を全て足す end # for の終了 sum / test.length # 入力されたテストの合計をデータ数で割る end # def の終了 def dispersion(test) # test - 数値をしまう配列 # dispersion は分散という意味 sum = 0.0 # 小数点以下も計算 for point in test # test の中の point について sum += (point - average(test)) ** 2 # 分散 = ((各々のテストの点数 - 平均) の 2 乗) の和 end # for の終了 sum / test.length # 全員のテスト合計をデータ数で割る end # def の終了 score = Array.new # からっぽの配列 score の作成 print("これからテストの平均点と分散を計算します。\n\n") print("テストを受けた期間を入力してください。\n") print("例: 2年次後期の期末テスト\n") STDERR.print("何時のテストですか?: ") day = gets if day == "" # もし何も入力されなかった場合 day = "?" # ? を表示する end # if の終了 sleep 1 print("\n") print("テストの科目名と、点数を入力してください。\n") print("Ctrl-D で入力をやめることができます。\n") while true # 何度も入力を繰り返す STDERR.print("科目名: ") # 科目名の入力 subject = gets # 入力された科目名のデータの取り込 if subject == nil # 入力をやめる場合には ctrl-D を打つ break # 入力が中断される end # if の終了 STDERR.print("点数: ") # 点数の入力 mark = gets # 入力された点数のデータの取り込み score << mark.to_i end # while true の終了 open("test.txt","a") do |test| # test.txt への書込み test.printf("▼%s\n", day) # テストを受けた期間を書込み test.printf("・テストの平均点: %3.1f 点\n", average(score)) # 平均点の書込み test.printf("・テストの分散 : %3.1f\n", dispersion(score)) # 分散の書込み test.print("\n") test.print("\n") end # open の終了 print("\n") print("\n") print("テスト結果記録表への記入が終了しました。\n") 4) プログラム実行結果 (1) Kterm での実行結果 pan{DOMON Chisato}% ./test.rb [~/public_html/adv2] これからテストの平均点と分散を計算します。 テストを受けた期間を入力してください。 例: 2年次後期の期末テスト 何時のテストですか?: 2年生後期の中間テスト テストの科目名と、点数を入力してください。 Ctrl-D で入力をやめることができます。 科目名: 国語 点数: 88 科目名: 数学 点数: 77 科目名: 英語 点数: 75 科目名: 理科 点数: 65 科目名: 社会 点数: 91 科目名: ^D テスト結果記録表への記入が終了しました。 (2) test.txt への出力結果 pan{DOMON Chisato}% cat test.txt [~/public_html/adv2] ---------- テスト結果記録表 ---------- ▼2年生後期の中間テスト ・テストの平均点: 79.2 点 ・テストの分散 : 88.2 5) 考察 ・bc -l による計算結果 pan{c111112}% bc -l [~/public_html/adv2] 88 + 77 + 75 + 65 + 91 # それぞれのテストの得点を足していく 396 396 / 5 # 合計をデータ数で割る 79.20000000000000000000 # 平均点 88 - 79.2 # それぞれのテストの得点を平均点で引く 8.8 77 - 79.2 -2.2 75 - 79.2 -4.2 65 - 79.2 -14.2 91 - 79.2 11.8 8.8 * 8.8 # それぞれのテストの得点を平均点で引いたものを2乗する 77.44 -2.2 * -2.2 4.84 -4.2 * -4.2 17.64 -14.2 * -14.2 201.64 11.8 * 11. 8 139.24 77.44 + 4.84 + 17.64 + 201.64 + 139.24 # 2 乗したものをすべて足す 440.80 440.80 / 5 # 合計をデータ数で割る 88.16000000000000000000 # 分散 quit bc -l による計算結果と、プログラムが計算して出力された計算結果が同じであっ たため、プログラムは正しく動いているといえる。 c. 広告ページ プログラム広告ページ " http://roy/~c111112/adv2/ " ホームページ " http://roy/~c111112/ " 2. 感想 今回作成したプログラムは、前回作成した平均と分散を求めることができるプロ グラムを元にして作成したが、まだまだ完全に納得のいくものを作ることは出来 なかった。特に、入力したデータ(科目名やそれぞれの得点など)を出力しようと いろいろ試してはみたが、上手くいかず結局出来なかった。そこのところが今回 のプログラム作成での一番の心残りである。 なので、もう一度配列とファイル出力について復習しようと思う。 3. 参考文献 神田直弥 2012 基礎プログラミングI より ファイルの入出力 http://roy/~naoya/ruby/8.html 西村まどか 基礎プログラミング II 第 2 回 (なになにといえばこれこれ) より 「入力したデータを取り出そう」 http://roy/~madoka/2012/r2/02/r2_02_03_theme_02_hash_input.html 西村まどか 基礎プログラミング II 第 2 回 (なになにといえばこれこれ) より 「Hash の対を入力するには」 http://roy/~madoka/2012/r2/02/r2_02_06_theme_05_hash_pair.html 西村まどか 基礎プログラミング II 第 2 回 (なになにといえばこれこれ) より 「Hash の対を表示するには」 http://roy/~madoka/2012/r2/02/r2_02_07_theme_06_forprint.html 西村まどか 基礎プログラミング II 第 3 回 (情報の構造を分析しよう) より 「Hash の作りかた」 http://roy/~madoka/2012/r2/03/r2_03_02_review_02_hash.html 西村まどか 基礎プログラミング II 第 6 回 (目的に応じて使ってみよう) より 「映画の星づけランキング」 http://roy/~madoka/2012/r2/06/r2_06_08_theme_07_aryavg.html