氏名: よ 学籍番号: c105よよよ 選択した番号: 3番 ------------------------------------------------------------ 1. 3番のプログラムを作成 地学と化学のそれぞれの得点と平均との差を出したい。 2. 作成したデータファイルとプログラム(array.rb) ○ データファイル 北海みち子 48 61 青森林檎 82 67 岩手賢治 98 54 秋田こまち 63 75 山形桜 57 48 宮城リョータ 78 32 福島ももこ 49 88 新潟雪夫 87 93 熊谷本夫 34 53 沖縄シーサー 64 23 ○ プログラム(array.rb) #!/usr/koeki/bin/ruby chigaku = [] kagaku = [] name = [] n = 0 sum = 0 rum = 0 while yomikomi = gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ yomikomi name[n], chigaku[n], kagaku[n] = $1, $2.to_i, $3.to_i sum += chigaku[n] rum += kagaku[n] n += 1 end end average1 = sum.to_f/n average2 = rum.to_f/n i = 0 print "--氏名----------+-地学得点-+-平均との差--+-化学得点-+-平均との差--\n" while i < n printf("%-20s %5d %5.1f %5d %5.1f\n", name[i], chigaku[i], chigaku[i]-average1,kagaku[i], kagaku[i]-average2) i += 1 end 3. プログラムを動かした結果(画面) irsv{c105111}% ./array.rb array.txt [~/Ruby] --氏名----------+-地学得点-+-平均との差--+-化学得点-+-平均との差-- 北海みち子 48 -18.0 61 1.6 青森林檎 82 16.0 67 7.6 岩手賢治 98 32.0 54 -5.4 秋田こまち 63 -3.0 75 15.6 山形桜 57 -9.0 48 -11.4 宮城リョータ 78 12.0 32 -27.4 福島ももこ 49 -17.0 88 28.6 新潟雪夫 87 21.0 93 33.6 熊谷本夫 34 -32.0 53 -6.4 沖縄シーサー 64 -2.0 23 -36.4 4. プログラムの説明 ●平均点を計算するプログラム ○ kagaku = [] … ここでは、地学と化学の2科目の平均データを それぞれ出したいので、化学を示すchigaku = []の他に、 化学分のkagakagaku = []をつけた。 ○ name = [] … 氏名のデータを示す。 ○ n = 0 … nは添字を示し、0から始まることを示す。 ○ sum = 0 … これは、地学と化学のそれぞれの合計点をいれたいので示した rum = 0 もの。地学をsum = 0、化学をrum = 0と示す。 ○ /(\S+)\s+(\d+)\s+(\d+)/ =~ yomikomi … これはデータファイルのデータ部分を示している。 (\S+)は氏名の部分、\s+はスペース、(\d+)は地学の点数 \s+はスペース、(\d+)は化学の点数を示す。 yomikomiの持つ文字列が正規表現に一致した場合、 (\S+)である氏名の部分(非空白部分)の連続が、$1に入る。 (\d+)である数字(地学、化学それぞれの点数)の連続が、 $2に入ることを示す。 ○ name[n], chigaku[n], kagaku[n] = $1, $2.to_i, $3.to_i … [n]は、添字を示す。 $1は、n人目の氏名を表す。 $2.to_iと$3.to_iは、 $2.to_i→地学のn人目の得点、 $3.to_i→化学のn人目の得点 を示す。 それぞれに付いているto_iは、$2、$3を数字に直すことを 示す。 ○ sum += chigaku[n] … sum += chigaku[n]は、地学の合計を示す。 rum += kagaku[n] rum += kagaku[n]は、化学の合計を示す。 ○ n += 1 … 添字(n)が1ずつ増えていくことを示す。 ○ average1 = sum.to_f/n … これで、それぞれの合計点(sumとrum)と、人数(n) average2 = rum.to_f/n が分かるので平均点を計算することができる。 割り算をするので、to_fは小数点にするため に変換することを示している。 --------------------------------------------------------------------- ●全員の氏名・地学または化学の得点・ それぞれの平均点との差 を出力するプログラム ○ i = 0 … iは添字を示し、0から始まることを示す。 ○ while i < n … i < nは、この場合添字が0〜10あることを示す。 ○ printf("%-20s %5d %5.1f %5d %5.1f\n", name[i], chigaku[i], chigaku[i]-average1,kagaku[i], kagaku[i]-average2) … %-20sは氏名の部分を示す。-20sの-は氏名を左詰めにすることを 示す。-を付けなければ、右詰めとなる。 20は20行表示できることを示す。sは文字列を示している。 %5dは、%dで数字を文字列に置き換えることを示す。 %5.1fは、%fで数字を小数点の文字列に置き換えることを示す。 %5dの5は、整数用の空白を示す。%5.1fの5.1は平均点が小数のため、 小数の値を入れられる空白を示す。 name[i]は氏名、chigaku[i]は地学の得点、 chigaku[i]-average1は、その得点と平均点との差を示す。 kagaku[i]とkagaku[i]-average2は、化学の得点とその平均点 を示す。 [i]は、添字が変化していくことを示す。 ○ i += 1 … 添字(i)が1ずつ増えていくことを示す。 5. 考察 2つのプログラムの組み合わせなので、添字は別々の記号(nとi)を使う。 2科目の得点と平均点を示したいので、化学分のkagakagaku = [] 、 合計を示すrum +=〜、得点を示すための$3.to_i、平均点を計算するための average2 = rum.to_f/n、数字を文字列にする%5d %5.1f、得点と平均点の差を示す kagaku[i], kagaku[i]-average2を付け足した。 6. 感想 最初、4番の問題を解いていたが、分からなかったので3番に 変更しました。 実際に、プログラムを実行してみて、 科目をもっと増やしてやってみたいと思った。