< 実施した課題の番号 > 1番



< 作成したプログラム >

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

total = 0
number = 0
a = 0
score = []

print"出席回数を入力してください。\n"
syusseki= gets.chomp!.to_i

while true
  printf("%d回目の得点は?(終了時exitと入力)\n", number+1)
  score[a] = gets.chomp!
  if score[a] == "exit"
    break
  end

  if score[a].to_f < 0
    print"マイナスはないよ!もう一度入力してください。\n"
    redo
  end

  if score[a].to_f > 8
    print"8点を超えました。これで良い場合ははいを、違う場合はいいえを入力してください。\n"
    answer = gets.chomp!
    
    if answer=="はい"
      print"すごいですね!\n"
    end
    if answer=="いいえ"
      print"もう一度入力してください。\n"
      redo
    end
  end

  total += score[a].to_f

  if number >= 7
    number += 1
    break
  end

  number += 1
  a += 1

end


printf("+ - - - - - - - - - - - - - - - +\n")
tensu = syusseki * 2
printf("出席点%17d点\n",tensu)
printf("+ - - - - - - - - - - - - - - - +\n")

printf("レポート\n")

a=0
total=0

while a < score.length
  if score[a] == "exit"
    break
  end
  printf("%d回目  %17.1f点\n",a+1,score[a])
  total += score[a].to_f
  a += 1   
end
printf("+ - - - - - - - - - - - - - - - +\n")
tensu += total
heikin = total / number
printf("合計得点 %15.1f点\n",tensu)
printf("平均得点 %15.1f点\n",heikin)

if tensu>=90
  
  print"評価                  秀\n"
elsif tensu>=80 
  print"評価                  優\n"
elsif tensu>=70
  print"評価                  良\n"
elsif tensu>=60
  print"評価                  可\n"
else 
  print"評価                  不可\n"
end

printf("+ - - - - - - - - - - - - - - - +\n")





< プログラムの実行結果 >


sime{xxxxxxx}% ./report4a.rb                                        [~/program]
出席回数を入力してください。
12
1回目の得点は?(終了時exitと入力)
8
2回目の得点は?(終了時exitと入力)
8
3回目の得点は?(終了時exitと入力)
8
4回目の得点は?(終了時exitと入力)
8
5回目の得点は?(終了時exitと入力)
8
6回目の得点は?(終了時exitと入力)
8
7回目の得点は?(終了時exitと入力)
8
8回目の得点は?(終了時exitと入力)
8
+ - - - - - - - - - - - - - - - +
出席点               24点
+ - - - - - - - - - - - - - - - +
レポート
1回目                8.0点
2回目                8.0点
3回目                8.0点
4回目                8.0点
5回目                8.0点
6回目                8.0点
7回目                8.0点
8回目                8.0点
+ - - - - - - - - - - - - - - - +
合計得点            88.0点
平均得点             8.0点
評価                  優
+ - - - - - - - - - - - - - - - +



sime{xxxxxxx}% ./report4a.rb                               [~/program]
出席回数を入力してください。
12
1回目の得点は?(終了時exitと入力)
8
2回目の得点は?(終了時exitと入力)
7.5
3回目の得点は?(終了時exitと入力)
10
8点を超えました。これで良い場合ははいを、違う場合はいいえを入力してください。
はい
すごいですね!
4回目の得点は?(終了時exitと入力)
80
8点を超えました。これで良い場合ははいを、違う場合はいいえを入力してください。
いいえ
もう一度入力してください。
4回目の得点は?(終了時exitと入力)
8
5回目の得点は?(終了時exitと入力)
-8
マイナスはないよ!もう一度入力してください。
5回目の得点は?(終了時exitと入力)
8
6回目の得点は?(終了時exitと入力)
exit
+ - - - - - - - - - - - - - - - +
出席点               24点
+ - - - - - - - - - - - - - - - +
レポート
1回目                8.0点
2回目                7.5点
3回目               10.0点
4回目                8.0点
5回目                8.0点
+ - - - - - - - - - - - - - - - +
合計得点            65.5点
平均得点             8.3点
評価                  可
+ - - - - - - - - - - - - - - - +




< プログラムの説明 >

今回のポイント 配列
配列とは、通常1つの値しか代入しておくことができない変数を拡張し、複数の
値を入れられるようにしたもの。



total = 0
number = 0
a = 0
score = []  # scoreは配列

x = []で、xが配列であることを宣言できる。つまり、ここではscoreが配列
であることを宣言している。インデックスはa。



while true
  printf("%d回目の得点は?(終了時exitと入力)\n", number+1)
  score[a] = gets.chomp!
  if score[a] == "exit"
    break
  end

  if score[a].to_f < 0
    print"マイナスはないよ!もう一度入力してください。\n"
    redo
  end

  if score[a].to_f > 8
    print"8点を超えました。これで良い場合ははいを、違う場合はいいえを入力してください。\n"
    answer = gets.chomp!
    
    if answer=="はい"
      print"すごいですね!\n"
    end
    if answer=="いいえ"
      print"もう一度入力してください。\n"
      redo
    end
  end

  total += score[a].to_f

  if number >= 7
    number += 1
    break
  end

  number += 1
  a += 1

end

配列を用いることで、入力したすべての値を保持することができ、最後にすべて
表示することができる。ただし配列に値を代入するにはインデックスを指定しな
ければならない。
そこで、インデックスに具体的な値を指定するかわりに、インデックスをaとい
う変数にし、while trueを用いて、キーボードを終えた場合に繰り返しから抜け
るように指示をしている。

冒頭でa = 0として初期値に0を代入しているため、1回目のscore[a]はscore[0]
と同じ意味である。繰り返しを行う中でa += 1として1ずつ増加しているため、
繰り返しを継続するたびにaの値が1増加するので、キーボードから入力された値
はインデックスを1ずつ増加させながら配列内に代入されることになる。

前回のレポートと同じく、while trueの中でif-endやredoなどを使って、キーボー
ド入力された数字の判別をしながら代入していく。



tensu = syusseki * 2
printf("出席点%17d点\n",tensu)

1回出席するごとに2点の出席点が与えられるので、出席点の合計(tensu)=最初
に入力される出席回数(syusseki)×(*)2点でこのような式になる。



while a < score.length
  if score[a] == "exit"
    break
  end
  printf("%d回目  %17.1f点\n",a+1,score[a])
  total += score[a].to_f
  a += 1   
end

このプログラムではインデックスにaという変数を使用し、aの初期値を0とし、
while-endの中でaの値を1ずつ増加させながらscore内の値を1つずつ順番に読み
出している。

ここで、while-endを用いて配列内の値を取り出すために、lengthメソッドを使
用する。lengthメソッドとは、その配列の中に代入されている値の数を返してく
れるメソッドのことである。
条件を満たさなくなった時点で繰り返しが終了となり、endの下にあるprintfの
行が実行され、合計得点や平均得点が表示される。



tensu += total
heikin = total / number
printf("合計得点 %15.1f点\n",tensu)
printf("平均得点 %15.1f点\n",heikin)

合計点は出席点(tensu)とレポートの合計点(total)を合算(+=)した数。
レポートの平均点は、レポートの合計(total)をレポートの回数(number)で割っ
た(/)数になる。



if tensu>=90
  
  print"評価                  秀\n"
elsif tensu>=80 
  print"評価                  優\n"
elsif tensu>=70
  print"評価                  良\n"
elsif tensu>=60
  print"評価                  可\n"
else 
  print"評価                  不可\n"
end

条件判断のif-endを使って、秀から不可まで判断する。ifの横に具体的に条
件を書く。
「正解している場合」という意味が「if tensu>=90」となる。それゆえ、ここ
では「点数が90点以上の場合」は秀。「そうでない場合かつ、80点以上ならば」
優。つまり「elseif tensu>=80」と表現する。それを、良の場合、可の場合とこ
なしていき、最後に「どれにもあてはまらない、そうでない場合」は「else」と
表現し、不可となる。終わりには必ずendをつける。



< 感想 >
先輩に助けてもらいながら、なんとかできた。
説明を書いていくと、どういう意味で使われているか確認できるので良い。



< 参考文献 > TAの先輩