第 6 回 目的に応じて使ってみよう レポート課題 氏名:森桂太 学籍番号:c110190 語学クラス:中国語 コース(系):社会福士コース 1.筆記問題 A.alphabet = ["a","b",...,"z"] と小文字が全て入っている配列 alphabet の、alphabet[18] および alphabet[40] は何か、理由をつけて答えよ。 ・alphabet = ["a","b",...,"z"] アルファベットは全部で26ある。そこで配列 数で数えると0からスタートする。よってalphabet[18]は "s" となる。 同じようにalphabet[40]も数えるが、26のアルファベットに対し、[40]もない のでalphabet[40]の答えは "なし" となる。 2.プログラム問題 A a.考えた設定 打ち込まれた値に対する合計・平均・分散を表示させ、値の大きさに沿った評価も表 示するようにしたプログラム。 3.作成したプログラム #!/usr/koeki/bin/ruby ninnzuu = [] xxx = 0 ttt = 0 def average(kazu) goukei = 0.0 for heikin in kazu goukei += heikin end goukei / kazu.size end def var(kazu1) goukei = 0 for bunsan in kazu1 goukei += (bunsan-average(kazu1))**2 # (データ-平均)^2 を計算し答えを全て足す end goukei / kazu1.size end def stdev(kazu2) Math.sqrt(var(kazu2)) end total = Array.new while true STDERR.print("倒した兵の人数を入力して下さい。(終了はq)\n") ninnzuu[xxx] = gets.chomp if ninnzuu[xxx] == "q" break end ttt += ninnzuu[xxx].to_i total << ninnzuu[xxx].to_i xxx += 1 end printf"倒した人数の合計は %d 人です。\n",ttt printf("倒した人数の平均は %3.1f 人です。\n",average(total)) printf("倒した人数の分散は %.3f 人です。\n",var(total)) sleep 1.5 print("\n") print("倒した人数によって、位が与えられる。\n") sleep 1.0 print("各々の兵の位は…\n") sleep 1.3 print("\n") xxx = 0 while ninnzuu.length > xxx + 1 if ninnzuu[xxx].to_i >= 100 print("大将軍\n") elsif ninnzuu[xxx].to_i >= 70 print("一個隊長\n") elsif ninnzuu[xxx].to_i >= 40 print("騎馬兵\n") else print("足軽\n") end xxx += 1 end 4.もとにしたプログラムからの変更点 プログラムdef_rubiocci.rb、プログラムdef_ary_movie.rbの他に 先輩方のプログラムを基にした。 変更点は合計も求められるようにし、その値に対する評価を表示する プログラム追加。 5.実行結果 倒した兵の人数を入力して下さい。(終了はq) 100 倒した兵の人数を入力して下さい。(終了はq) 70 倒した兵の人数を入力して下さい。(終了はq) 50 倒した兵の人数を入力して下さい。(終了はq) 20 倒した兵の人数を入力して下さい。(終了はq) q 倒した人数の合計は 240 人です。 倒した人数の平均は 60.0 人です。 倒した人数の分散は 850.000 人です。 倒した人数によって、位が与えられる。 各々の兵の位は… 大将軍 一個隊長 騎馬兵 足軽 となった。 確認のためデタラメに入力した場合も試してみた。 倒した兵の人数を入力して下さい。(終了はq) qqq 倒した兵の人数を入力して下さい。(終了はq) aaa 倒した兵の人数を入力して下さい。(終了はq) あああ 倒した兵の人数を入力して下さい。(終了はq) q 倒した人数の合計は 0 人です。 倒した人数の平均は 0.0 人です。 倒した人数の分散は 0.000 人です。 倒した人数によって、位が与えられる。 各々の兵の位は… 足軽 足軽 足軽 となった。 6.プログラム説明 要所要所区切って説明して行きます。 ninnzuu = [] で人数を配列にする。 xxx = 0 ttt = 0 で初期をゼロからスタート。 def average(kazu) メソッドの設定。 goukei = 0.0 合計を平均で求めるため 0.0 を代入。 for heikin in kazu kazu 配列の要素に繰り返しを指示。 goukei += heikin 合計を求めるため足す。 end for の終わり。 goukei / kazu.size 平均を求めるので個数で割る。 end def の終わり。 def var(kazu1) メソッドの設定。 goukei = 0 goukeiに 0 を代入。 for bunsan in kazu1 kazu1 内全ての要素に対し繰り返しを指示。 goukei += (bunsan-average(kazu1))**2 (-)^2 を計算し答えを全て足す。 end for の終わり。 goukei / kazu1.size 分散を求めるので個数で割る。 end def の終わり。 def stdev(kazu2) メソッドの設定。 Math.sqrt(var(kazu2)) ルートを取り、標準偏差を表示。 end def の終わり。 total = Array.new total という新しい配列を読みこませる。 while true break するまで繰り返す。 STDERR.print("(終了はq)\n") ()内に何についての入力かを指示する文を書く。 ninnzuu[xxx] = gets.chomp キーボードからの入力を取得させる。 if ninnzuu[xxx] == "q" もし 入力 が q だったら break while を抜けるよう指示。 end if の終わり。 ttt += ninnzuu[xxx].to_i 値を整数に変換する。小数点以下を含む値の場合は 小数部は切り捨てになる。 total << ninnzuu[xxx].to_i ninnzuu[xxx]を整数に直し total に追加する。 xxx += 1 end while の終わり。 printf"合計は %d 人です。\n",ttt で ttt の値を表示。 printf("平均は %3.1f 人です。\n",average(total)) 全体の平均を表示。 printf("分散は %.3f 人です。\n",var(total)) 分散を表示。 sleep 1.5 間を 1.5 秒取らせる。 print("\n") 改行文字。 xxx = 0 xxx の値ゼロから。 while ninnzuu.length > xxx + 1 xxx + 1 に繰り返し入力で値を追加。 if ninnzuu[xxx].to_i >= 100 もし値が100より上ならば、 print("\n") ("\n")内の書き込んだ評価が表示。 xxx += 1 q を打ち込み抜け出す時の入力をカウントしないようにする。 end whileの終わり。 7.考察 bc -l で確かめたところ、 pan{c110190}% bc -l [~/Ruby] 100+70+50+20 240 となった。合計は正しく計算されている事が分かった。 pan{c110190}% bc -l [~/Ruby] (100+70+50+20)/4 60.00000000000000000000 となった。表示された数は小数点第 2 位を四捨五入している。プログラム表示 は60.0という結果のため、平均も計算されている事が分かった。 pan{c110190}% bc -l [~/Ruby] (100-60.0)^2+(70-60.0)^2+(50-60.0)^2+(20-60.0)^2 3400.00 3400.00/4 850.00000000000000000000 となった。プログラム表示では 850.000 となっており、確かめ算の 850.00000000000000000000 と同じになったことから、分散も正しく計算されて いる事がわかった。 また、入力を数字以外に あああ や aaa などデタラメに入力したところ、全て 0 という値で処理されたこと、qqq と複数打ち込むと抜け出せず、 0 として処 理されることもわかった。 8.感想 今回も先輩方や先生方のページを参考に、また友達にも協力してもらったおかげ で何とかできました。さらに説明や考察の書き方や量を今までのやり方から変え てみました。ご指摘のほどよろしくお願いします。 9.参考文献 先輩のレポート http://roy/~madoka/2010/r2/06/rpt/c109149.txt http://roy/~madoka/2010/r2/06/rpt/c109130.txt 西村先生講義ページ http://roy/~madoka/2011/r2/06/r2_06_11_theme_09_rubiocci.html http://roy/~madoka/2011/r2/06/r2_06_14_theme_11_commandline.html 神田先生講義ページ http://roy/~naoya/ruby/3.html