配列を利用して、試験の得点の処理をするプログラムを作成してみよう。 国語の試験の結果ファイルとして以下のようなデータを作成しよう。
score.txt
山田太郎 50 中町太郎 90 飯森花子 91 鶴岡一人 60 酒田三吉 52 三川一二三 12
このデータを読み込み、全員の平均点を計算したうえで、個人個人の 平均点との得点差も合わせて出力するようなプログラムを作ってみよう。
平均点を計算するためには、まず全員のデータを読み込んで、得点と人数を 求める必要がある。さらに、個人個人の平均点との差を出力するためには、全員 の得点を記憶しておく必要があるので、配列に、 名前・得点を入れておかなければならない。
まず最初に、データファイルを全部読み、名前と得点を配列に記憶しよう。 データを全部読むループは次のように書ける。
while yomikomi=gets : end
この中に、名前と得点を切り出して変数に入れる部分を入れる。 名前と得点の切り出しには正規表現のグルーピングを利用する。
/(\S+)\s+(\d+)/ =~ yomikomi
括弧で括った
N個目の文字列は、変数 $N
で取り出すことができる。yomikomi
の持つ文字列が正規表現に
マッチした場合、
(\S+)
つまり非空白文字の連続が、$1
に入り、
(\d+)
つまり数字の連続が、$2
に入る。これを利用して
配列への格納を以下のようにする。
while yomikomi=gets if /(\S+)\s+(\d+)/ =~ yomikomi N人目の名前 = $1 N人目の得点 = $2.to_i end end
「N人目の名前」は、配列にする必要がある。 合計得点を記録するものを加えるようにした上で、 これをRubyプログラムに直すと以下のようになる。
name = [] score = [] n = 0 sum = 0 while yomikomi=gets if /(\S+)\s+(\d+)/ =~ yomikomi name[n] = $1 score[n] = $2.to_i sum += score[n] n += 1 # 人数nを1追加 end end
これで合計点(sum)と、人数(n)が分かるので平均点が計算できる。
average = sum.to_f/n
割り算をする場合は整数をto_f
メソッドで
浮動小数点数に変換することを忘れないようにしよう。
最後に、全員の、氏名、得点、平均点との差、をループで出力する。
i = 0 print "--氏名--------------+-得点-+-平均との差--\n" while i < n printf("%-20s %5d %5.1f\n", name[i], score[i], score[i]-average) i += 1 end
以上を組み合わせてプログラムは完成する。
#!/usr/koeki/bin/ruby score=[] name =[] n = 0 sum = 0 while yomikomi = gets if /(\S+)\s+(\d+)/ =~ yomikomi name[n], score[n] = $1, $2.to_i sum += score[n] n += 1 end end average = sum.to_f/n i = 0 print "--氏名--------------+-得点-+-平均との差--\n" while i < n printf("%-20s %5d %5.1f\n", name[i], score[i], score[i]-average) i += 1 end
実行してみよう。
% ./score.rb score.txt
--氏名--------------+-得点-+-平均との差--
山田太郎 50 -9.2
中町太郎 90 30.8
飯森花子 91 31.8
鶴岡一人 60 0.8
酒田三吉 52 -7.2
三川一二三 12 -47.2