成績処理の例

配列を利用して、試験の得点の処理をするプログラムを作成してみよう。 国語の試験の結果ファイルとして以下のようなデータを作成しよう。
score.txt

山田太郎	50
公益太郎	90
飯森花子	91
鶴岡一人	60
酒田三吉	52
三川一二三	12

このデータを読み込み、全員の平均点を計算したうえで、個人個人の 平均点との得点差も合わせて表示するようなプログラムを作ってみよう。

平均点を計算するためには、まず全員のデータを読み込んで、得点と人数を 求める必要がある。さらに、個人個人の平均点との差を表示するためには、全員 の得点を記憶しておく必要があるので、配列変数に、名前、得点を入れておかな ければならない。

まず最初に、データファイルを全部読み、名前と得点を配列に記憶しよう。 データを全部読むループは次のように書ける。

while line=gets
  :
end

このなかに、名前と得点を切り出して変数に入れる部分を入れる。 名前得点の切り出しには正規表現のグルーピングを利用する。括弧で括ったN個 目の文字列は、変数 $N で取り出すことができる。

/(\S+)\s+(\d+)/ =~ line

とすると、lineの持つ文字列が正規表現にマッチした場合、 (\S+)(非空白文字の連続)が、$1に入り、 (\d+)(数字の連続)が、$2に入る。これを利用して 配列変数への格納は以下のようにする。

while line=gets
  if /(\S+)\s+(\d+)/ =~ line
    N人目の名前 = $1
    N人目の得点 = $2.to_i
  end
end

「N人目の名前」は、配列にする必要がある。合計得点を記録するものを加え るようにした上で、これをRubyプログラムに直すと 以下のようになる。

name  = []
score = []
n = 0
sum = 0
while line=gets
  if /(\S+)\s+(\d+)/ =~ line
    name[n] = $1
    score[n] = $2.to_i
    sum += score[n]
    n += 1			# 人数nを1追加
  end
end

これで合計点(sum)と、人数(n)が分かるので平均点が計算できる。

average = sum/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

#!/usr/koeki/bin/ruby

score=[]
name =[]
n = 0
sum = 0
while line=gets
  if /(\S+)\s+(\d+)/ =~ line
    name[n], score[n] = $1, $2.to_i
    sum += score[n]
    n += 1
  end
end
average = sum/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.0
公益太郎                90    31.0
飯森花子                91    32.0
鶴岡一人                60     1.0
酒田三吉                52    -7.0
三川一二三              12   -47.0

本日の目次