第6回のレポートより

参考として、良かったレポートを示す。

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.感想

今回は正規表現のつけ忘れで少し時間を費やしてしまいました。落ち着いて考え
ることの大切さを知った課題でした。

本日の目次