問題2を実施


#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-

#初期設定
sum = 0
number = []   
report = []    
attendance = []

a = 0         
b = 1         



while line = gets
  if /(\S+)\s+(\S+)\s+(\S+)/ =~ line
    number[a] = $1
    attendance[a] = $2
    report[a] = $3
    
   if /出席/ =~ attendance[a]
      sum += 2
   
   elsif/遅刻/ =~  attendance[a]
         sum += 1
   end
  
  if/\d/ =~ report[a]
    sum += report[a].to_f
    end
  a += 1
    end
end


print"-回数----------- 出欠 ---- レポート - \n"
while b < number.length
  printf("  %-10s \ %3s \ %6.3s\n", 
  number[b],attendance[b],report[b])
  b += 1
end

if sum >= 90
   print "あなたの評価は秀です。\n"
elsif sum >= 80
   print "あなたの評価は優です。\n"
elsif sum >= 70
   print "あなたの評価は良です。\n"
elsif sum >= 60
   print "あなたの評価は可です。\n"
else 
   print "あなたの評価は不可です。\n" 
end
printf("合計得点は%d点です。\n",sum)



<実行結果>

sime{xxxxxxx}% ./report5.rb result2.txt                           [~/program]
-回数----------- 出欠 ---- レポート - 
  第1回          出席      なし
  第2回          出席      なし
  第3回          欠席     6.5
  第4回          出席       7
  第5回          出席       8
  第6回          出席       6
  第7回          遅刻     7.5
  第8回          欠席     未提出
  第9回          出席       7
  第10回         遅刻       6
  第11回         遅刻      なし
  第12回         出席      なし
  第13回         欠席      なし
  第14回         出席      なし
  第15回         出席      なし
あなたの評価は可です。
合計得点は69点です。


<説明>

・5〜11行目

sum = 0
number = []   
report = []    
attendance = []

a = 0         
b = 1

初期設定として6つの項目を作った。
sum = 0 は、後から出席点とレポート点を加えていく。
number = [] は、第何回目の授業のものなのかを代入していく。
report = [] は、レポートの得点が何点なのかデータから代入していく。
attendance = [] も、 出席点をデータから代入していく。
a = 0 は、前半の計算でインデックスに代入するときに使い、
b = 1 は、後半の表示する時にインデックスに代入して使う。+1は、
      データの1行目を表示するときに必要ないので、1を足して省いた。




・15〜19行目

while line = gets
  if /(\S+)\s+(\S+)\s+(\S+)/ =~ line
    number[a] = $1
    attendance[a] = $2
    report[a] = $3

15行目でデータを読み込む。ここで読み込まれたものが次の行の
if /(\S+)\s+(\S+)\s+(\S+)/ =~ line に当てはめていく。
最初の(\S+)は、第何回目のところがマッチし、2つめの(\S+)は、
出席の所がマッチし、最後の(\S+)は、レポートに関する所がマッチしている。
s+ のところは、列の空白の部分を示している。

number[a] = $1 の$1は、numberの値が1行目にあることを示している。
後の2行もそれぞれの値が何行目にあるかをしめしている。
[a]で1づつ配列を代入していく。




・21〜33行目

if /出席/ =~ attendance[a]
      sum += 2
   
   elsif/遅刻/ =~  attendance[a]
         sum += 1
   end
  
  if/\d/ =~ report[a]
    sum += report[a].to_f
    end
  a += 1
    end
end

上のif文は、出席点に関するもの。
出席してあれば、sum に2点をプラスにして、
欠席であれば、sum に1点をプラスする。

下のif文は、レポート点に関するもの。
/\d/でレポートの列に得点があれば、その数字を
sumに代入するこになっている。

a += 1 で1回目の作業が終わったら1を加えて次の回に移れるようにしている。




・36〜41行目

print"-回数----------- 出欠 ---- レポート - \n"
while b < number.length
  printf("  %-10s \ %3s \ %6.3s\n", 
  number[b],attendance[b],report[b])
  b += 1
end

while b < number.length で 配列にの中に代入されている値を返してもらう。
printf で それぞれの値を全てあてはめていく。





・43〜54行目

if sum >= 90
   print "あなたの評価は秀です。\n"
elsif sum >= 80
   print "あなたの評価は優です。\n"
elsif sum >= 70
   print "あなたの評価は良です。\n"
elsif sum >= 60
   print "あなたの評価は可です。\n"
else 
   print "あなたの評価は不可です。\n" 
end
printf("合計得点は%d点です。\n",sum)


ここのifでは、sum の合計であてはまる成績を表示するように
している。
最後の行に出席点とレポート点の合計得点を表示している。


<感想>
今まで授業でやってきたことをきちんとわかっていないと応用ができないので
きちんと覚えられるようにしていきたい。

<参考にした人>
本田祐希さん