1、何番を実施したか 1番と2番を実施しました。 2、作成したプログラム 1番の課題 #!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- number = [] attendance = [] score = [] sum = 0 n = 0 i = 0 attendsum = 0 total = 0 while line = gets if /(\S+)\s+(\d+)\s+(\S+)/ =~ line number[n] = $1 attendance[n] = $2.to_i attendsum += $2.to_i score[n] = $3 sum += $3.to_f total = sum + attendsum n += 1 end end print"-回数 - - - - 出席 --- レポート - - - \n" while i < number.length printf(" %-10s \t %d \t %3.1f\n",number[i],attendance[i],score[i]) i += 1 end print"+ - - - - - - - - - - - - - - - - - +\n" print"\n" printf("合計点: %4.1f\n",total) if total >= 90 print" 評価 秀\n" elsif total >= 80 print" 評価 優\n" elsif total >= 70 print" 評価 良\n" elsif total >= 60 print" 評価 可\n" else print" 評価 不可\n" end print"\n" print"+ - - - - - - - - - - - - - - - - - +\n" 2番の課題 #!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- number = [] attendance = [] score = [] i = 0 total = 0 while line = gets if /(\S+)\s+(\S+)\s+(\S+)/ =~ line number[i] = $1 attendance[i] = $2 score[i] = $3 end if/出席/ =~ attendance[i] total += 2 elsif/遅刻/ =~ attendance[i] total += 1 end if/\d/ =~ score[i] total += score[i].to_f end i +=1 end i = 0 print"-回数- - - - - - - 出欠- - - - -レポート-\n" print"\n" while i < number.length printf(" %-10s \t %4s \t %3.3s\n",number[i],attendance[i],score[i]) i += 1 end print"\n" print"+ - - - - - - - - - - - - - - - - - - - +\n" print"\n" printf("合計点: %4.1f\n",total) if total >= 90 print" 評価 秀\n" elsif total >= 80 print" 評価 優\n" elsif total >= 70 print" 評価 良\n" elsif total >= 60 print" 評価 可\n" else print" 評価 不可\n" end print"\n" print"+ - - - - - - - - - - - - - - - - - - - +\n" 3、プログラムの実行結果 1番目の課題 sime{c11xxxx}% ./report5a.rb result1.txt [~/program] -回数 - - - - 出席 --- レポート - - - 第1回 2 0.0 第2回 2 0.0 第3回 0 6.5 第4回 2 7.0 第5回 2 8.0 第6回 2 6.0 第7回 1 7.5 第8回 0 0.0 第9回 2 7.0 第10回 1 6.0 第11回 1 0.0 第12回 2 0.0 第13回 0 0.0 第14回 2 0.0 第15回 2 0.0 + - - - - - - - - - - - - - - - - - + 合計点: 69.0 評価 可 + - - - - - - - - - - - - - - - - - + 2番目の課題 sime{c11xxxx}% ./report5b.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.0 評価 可 + - - - - - - - - - - - - - - - - - - - + 4、プログラムの説明 1番目の課題 4〜6行目で各々number(回数), attendance(出席), score(レポートの得点) を "=[]"を使って配列であることを指定しました。 7〜11行目ではそれぞれスタートが"0"であることを指定しました。 12〜22行目では "while end" と "line = gets" で指定された "result1.txt"の読みこみを繰り返しておこなってくれるようにしました。 くわしく説明すると、13行目で今回の読みこむ資料に合うように /(\S+)\s+(\d+)\s+(\S+)/ と書いて、"\S"は空白以外の文字とマッチ、"\s"は 空白とマッチ、"\d"は0〜9の数字とマッチするようになっています。また、 "\S+"などに付いている"+"は直前の文字の一回以上の繰り返しがおこなわれる ようにつけました。" /(\S+)\s+(\d+)\s+(\S+)/ =~ line" の"=~ line"で読み こんだものがここに入力されるようになっています。 "/(\S+)\s+(\d+)\s+(\S+)/ =~ line"の"()"は"$"をつかってそのカッコでくくっ た部分の文字や数値を指定して抜きだして利用できるようにしています。 16、18行目で入力された値を足していくようにしています。 24行目から27行目では、"while end"と"i < number.length"を使用して今回の 場合15回までの繰り返しを行ってくれるようにしています。 28〜47行目までは省略します。 2番目の課題 上で説明したことは省略します。 15行目〜19行目で「出席」と読みこんだときには2点を追加し、「遅刻」と読み こんだ場合には1点を追加してくれるように"if end"を使って書きました。 21〜23行目で"if/\d/ =~ score[i]"で"score"に数字が入力された場合だけ点数 が足される仕組みを作りました。 5、感想 今回は1、2番目の課題を取り組みましたが苦戦したのは2番目の課題で15回目ま での結果を表示しつつ、レポートの得点があるところだけを抜きだして足して いくことでした。上の2番目の課題の説明でも説明しましたが、 "if/\d/ =~ score[i]"と書き、"total += score[i].to_f"とすることでレポート 点が数字のときだけ足される仕組みを作れたときはとてもうれしかったです。 6、参考文献 なし