1、何番を実施したか 問題2 2、作成したプログラム #!/usr/koeki/bin/ruby # coding: utf-8 attendance = 0 score = [] x = 0 total = 0 assessment = 0 print"基礎プログラミングIVでのAさんのレポート点と出席点から評価をつけます。\n" while line=gets if /\S\d+\S\s+(\S+)\s+(\S+)/ =~ line if $1 == "出席" attendance += 2 elsif $1 == "遅刻" attendance += 1 else $1 attendance += 0 end if $2 == "なし" score[x] = 0 elsif $2 == "未提出" score[x] = 0 else score[x] = $2 end x += 1 end end print"+----------------------+\n" printf(" 出席点 %12.1f点\n",attendance) print"+----------------------+\n" print" レポート\n" x = 0 while x < score.length printf(" %2d回目 %3.1f点\n",x+1,score[x]) total += score[x].to_f x += 1 end print"+----------------------+\n" printf("レポート合計 %7.1f点\n", total) assessment = total + attendance printf(" 合計得点 %5.1f点\n",assessment) if assessment >= 90 print" 評 価 秀\n" elsif assessment >= 80 print" 評 価 優\n" elsif assessment >= 70 print" 評 価 良\n" elsif assessment >= 60 print" 評 価 可\n" else print" 評 価 不可\n" end print"+----------------------+\n" 3、プログラムの実行結果 基礎プログラミングIVでのAさんのレポート点と出席点から評価をつけます。 +----------------------+ 出席点 21.0点 +----------------------+ レポート 1回目 0.0点 2回目 0.0点 3回目 6.5点 4回目 7.0点 5回目 8.0点 6回目 6.0点 7回目 7.5点 8回目 0.0点 9回目 7.0点 10回目 6.0点 11回目 0.0点 12回目 0.0点 13回目 0.0点 14回目 0.0点 15回目 0.0点 +----------------------+ レポート合計 48.0点 合計得点 69.0点 評 価 可 +----------------------+ 4、プログラムの説明 正規表現と後方参照の部分を重点的に説明し、前回までの範囲の説明は省きます。 ・while line=gets まず、result2.txtから情報を読みこむ。 ・ if /\S\d+\S\s+(\S+)\s+(\S+)/ =~ line if/正規表現 / =~lineで読みこんだ行が正規表現にマッチしているか確かめる。 =~は正規表現にマッチすると言うことを表す。 今回の正規表現は、\S\d+\S\s+(\S+)\s+(\S+)である。 \Sは、空白以外を表す。\dは、一桁の整数とマッチする。\sは空白文字を表す。 +は直前の文字の1回以上繰り返しにマッチすることを表す。 ()は、複数の文字列の繰り返しにマッチすることを表す。そして、()を付けてお くことによりあとで、()内のメタ文字にマッチしたところを後で取り出せる後 方参照という機能を持つ。 今回はこれらを使い正規表現をつくった。 \S\d+\Sは、第◯回を表す。 \s+(\S+)は、回数と出欠の間の空白と空白以外が1文字以上あることを表し()で 囲むことにより、後で取り出せる様にしておく。 \s+(\S+)は、出席とレポートの間の空白とを表し、空白以外が1文字以上あるこ とを表し、こちらも後で取り出せるように()を使う。 ・ if $1 == "出席" attendance += 2 elsif $1 == "遅刻" attendance += 1 else $1 attendance += 0 end if $2 == "なし" score[x] = 0 elsif $2 == "未提出" score[x] = 0 else score[x] = $2 end 後方参照を持ち入いた。()の順番に応じて$1、$2のように$数字で取り出せる。 正規表現の際に、出欠の文字列に()を付けていたので$1で取り出す。 $1には、出席、欠席、遅刻がマッチする。その際に、各々得点はいくらなのかを 設定しておく必要がある。 なので、 if $1 == "出席" attendance += 2を記している。 もし$1が出席であれば、attendanceに2が加算されることを表す。 他の、 elsif $1 == "遅刻" attendance += 1 else $1 attendance += 0も 同じ仕組みである。 同じく正規表現の際に、レポートの文字列に()を付けていたので$2で取り出す。 $2には、数字となし、未提出がマッチする。 こちらも先ほどと同じように$2がなし、未提出の場合は0で数字の場合はそのま ま読みこまれることを表す。 他は、前回の範囲と被るため説明を省きます。 5、感想 配列に続き私には難易度が高いと感じた。しかし、前回までの範囲がなんとな くではあるが、理解出来て来たような気がする。苦手な分野でも、諦めずに試 行錯誤してみたい。 6、参考文献 ・2016年度授業用ページ(担当:神田直弥)(6)配列、(7)正規表現 http://roy/~naoya/ruby/6.html http://roy/~naoya/ruby/7.html ・よくできたレポート(配列) http://roy/~naoya/ruby/rep/kadai04-1.htm 7、添付ファイル(report5.rb)