氏名 : 謎のH 学籍番号 : c104SSS クラス : A 選択した番号: 3番 1.どういうプログラムを作るか(何番を選択したか) 3番を選択。めちゃイケメンバーの国語と数学の取得点と科目ごとの平均点の差 を計算して表示するプログラム。 2.作成したデータファイルとプログラム array.rb 作成したデータファイル 岡村隆史 53 64 矢部浩之 98 27 濱口 優 12 6 有野晋哉 60 75 山本圭壱 57 54 加藤浩次 45 90 雛形あきこ 23 33 鈴木紗理奈 70 46 光浦靖子 85 95 大久保佳代子 39 80 武田真治 90 19 プログラム array.rb #!/usr/koeki/bin/ruby score=[] score2=[] name =[] n = 0 sum = 0 sum2 = 0 while line=gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ line 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/n average2 = sum2/n i = 0 print "--氏名--------------+-国語取得点-+-平均との差--+-数学取得点-+-平均との差--\n" while i < n printf "%-20s %11d %5.1f %18d %5.1f\n", name[i], score[i], score[i]-average, score2[i], score2[i]-average2 i += 1 end 3 .プログラムを動かした結果(画面) irsv{c104135}% ./array.rb score.txt [~/Ruby] --氏名--------------+-国語取得点-+-平均との差--+-数学取得点-+-平均との差-- 岡村隆史 53 -4.0 64 11.0 矢部浩之 98 41.0 27 -26.0 濱口 優 12 -45.0 6 -47.0 有野晋哉 60 3.0 75 22.0 山本圭壱 57 0.0 54 1.0 加藤浩次 45 -12.0 90 37.0 雛形あきこ 23 -34.0 33 -20.0 鈴木紗理奈 70 13.0 46 -7.0 光浦靖子 85 28.0 95 42.0 大久保佳代子 39 -18.0 80 27.0 武田真治 90 33.0 19 -34.0 4 .プログラムの説明 授業で使った score.rb プログラムに少し手を加えれば課題の array.rb を作ることができる。 まず、もとのプログラムの先頭では score=[] name =[] n = 0 sum = 0 とある。 score=[] は得点が入る場所をあらかじめ確保しておくという意味で、 name=[] は名前が入る場所、 nは人数、sumは全員の点数の合計点をそれぞれ表 している。そこで、今回は国語と数学の2科目の点数を扱うので、 score2=[] 、sum2=0 ともう1科目分の点数を入れる場所をつけ足しておく必要がある。 次の /(\S+)\s+(\d+)\s+(\d+)/ は、score.txt の一行の構成と対応させなければならない。 岡村隆史 53 64 (\S+) \s+ (\d+) \s+ (\d+) \S は空白文字以外の文字にマッチするので名前に、 \s は空白文字に、 \d は数字に それぞれマッチするという正規表現なので、上の順番どおりに書 く。ちなみに + は直前のパターンが一回以上くり返す、という正規表現である。 次の name[n], score[n], score2[n] = $1, $2.to_i,$3.to_i も行と対応しており、上の () でくくった要素に名前をつけたり、変数 $ で番号を付けたりしている。 (\S+)は name[n] で $1。(\d+)は score[n] で $2。 その次の(\d+)は score2[n] で $3 と、一番目と二番目の(\d+)は別のものが入るということをコンピューターに認識させる必要がある。さらに $2、$3 には整数としての数字を入れて計算しなければならないので、.to_i で整数化させる。 sum += score[n] sum2 += score2[n] n += 1 では、国語の合計点である sum には 国語の点数とマッチしている score[n] を、 sum2 には数学の点数 score2[n] 、n にはその人数をそれぞれ足していく、とい うことを表している。 average = sum/n は、国語の平均点= 国語の合計点÷合計人数 を表している。 average2は数学の平均点。 printでkterm に表示させる "--氏名--------------+-国語取得点-+-平均との差--+-数学取得点-+-平 均との差--\n" と、プログラムで計算した結果の表示間隔を合わせなければならないので、 printf "%-20s %7d %12.1f %11d %12.1f\n" と、数字を調節し、 name[i], score[i], score[i]-average, score2[i], score2[i]-average2 と、表示させる順番を指定すればプログラム完成。 5 .考察 科目がひとつ増えたのに合わせて、sum や score を それぞれ、sum2、 score2 と増やせばいい、ということに気が付けばこの課題は簡単でした。 6 .感想 3番は簡単だったけど、4番は難しくて出来ませんでした。残念。