問題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 の合計であてはまる成績を表示するように している。 最後の行に出席点とレポート点の合計得点を表示している。 <感想> 今まで授業でやってきたことをきちんとわかっていないと応用ができないので きちんと覚えられるようにしていきたい。 <参考にした人> 本田祐希さん