参考として、良かったレポートを示す。
Subject: #6 array.rb 3
From: c106007@f.koeki-u.ac.jp
To: ruby-05-30@e.koeki-u.ac.jp
Date: Thu, 31 May 2007 23:17:14 +0900 (JST)
氏名: AAAAAA
学籍番号: c106007A
クラス: C
選択した番号: 3
1.選択した番号
3
二科目の各得点、平均点との差を処理し表示出来るプログラムを作りました。
2.制作したデータファイルとプログラム
プログラム
#!/usr/koeki/bin/ruby
score=[]
score2=[]
name =[]
n = 0
sum = 0
sum2 = 0
while yomikomi = gets
if /(\S+)\s+(\d+)\s+(\d+)/ =~ yomikomi
name[n], score[n], score2[n] = $1, $2.to_i, $3.to_i
sum += score[n]
sum2 += score2[n]
n += 1
end
end
average = sum.to_f/n
average2 = sum2.to_f/n
i = 0
print "--氏名--------------+-国語得点-+-平均との差--+数学得点-+-平均との差\n"
while i < n
printf("%-20s %9d %10.1f %9d %10.1f\n", name[i], score[i], score[i]-average, score2[i], score2[i]-average2)
i += 1
end
データファイル
毒島 50 57
佐世保 90 48
阿部 91 35
二岡 60 55
松坂 52 66
城島 12 77
3.プログラムを動かした結果
irsv{c106007}% ./score.rb score.txt [~/Ruby]
--氏名--------------+-国語得点-+-平均との差--+数学得点-+-平均との差
毒島 50 -9.2 57 0.7
佐世保 90 30.8 48 -8.3
阿部 91 31.8 35 -21.3
二岡 60 0.8 55 -1.3
松坂 52 -7.2 66 9.7
城島 12 -47.2 77 20.7
4.プログラムの説明
・score=[],score2=[],name =[],n = 0,sum = 0,sum2 = 0は各文字列と数値
の受け皿の役割を果たす。
・while yomikomi = gets
〜〜
end
は、データファイルから読み込み、読み込むものが無くなったら終了する。
・ if /(\S+)\s+(\d+)\s+(\d+)/ =~ yomikomi
name[n], score[n], score2[n] = $1, $2.to_i, $3.to_i
sum += score[n]
sum2 += score2[n]
n += 1
end
は名前と二科目の点数を分けて変数に入れ、配列に溜めて行く。
細かく考えて行くと、/ (\S+)\s+(\d+)\s+(\d+)/は正規表限で
(\S+)非空白文字の連続 \s+空白 (\d+)数字 \s+空白 (\d+)数字
に、yomikomi がデータファイルから得た文字列が合った時、括弧()に
括られたものが$1, $2.to_i, $3.to_iに順に入り数字は整数になおされ、
受け皿であるscore=[]score2=[]name =[]に入り配列に溜められる。
またsum += score[n]は教科1の合計、
sum2 += score2[n]は教科2の合計を計算する。
n += 1は変数が1ずつ足されて行くことを示す。
average = sum.to_f/n
average2 = sum2.to_f/n
は二教科のそれぞれの平均点を計算する。
sum.to_f/nは、合計(sum)割る(n)人数。
while i < n
printf("%-20s %9d %10.1f %9d %10.1f\n", name[i], score[i], score[i]-average, score2[i], score2[i]-average2)
i += 1
end
は、n(変数)がi(変数その2)がなくなるまでそれぞれの値を表示する。
・ %-20s %9d %10.1fの
%s は対応する値を文字列に置き換える。
%d は対応する値を10進整数の文字列に置き換える。
%f は対応する値を10進浮動小数点数の文字列に置き換える
%の後ろの20 9 10はおそらく文字数と桁数で、 .1fは小数点第一位まで表示。
5.考察
まず考えたのが 教科の数が二教科に増えたので数値が入るscore[n]や、合計の
計算をするsum+=score[n]、平均値を出すaverage = sum.to_f/n、そしてその受
け皿となるsum = 0やscore=[]などの名前を変えて増やすことでした。
ただ忘れていたのが \s+ (空白)の正規表現の追加でこれに気が付き成功しまし
た。
また、文字の表示でも理解に少し苦しみました。 %は 後ろにある対応する文字
列を表示することは以前にしたので理解していましたが、 %9dの9は桁で空白の
幅を変えることも今回気が付き、好に変えることが出来ました。
%10.1f\の .1f は小数点第一位まで表示だとも気が付きました。
6.感想
今回は正規表現のつけ忘れで少し時間を費やしてしまいました。落ち着いて考え
ることの大切さを知った課題でした。