5番まで実施
プログラム本文
#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-
print"レポートの合計得点、平均点を求めます。\n"
count = 1
sum = 0
while true
printf("%2d回目の点数 (exit入力で終了) : ",count)
ten = gets.chomp!
if ten.to_f <= -1
print"得点がマイナスになることはありません。\n\n"
redo
elsif ten.to_f >= 9
print"レポートの最高得点は8点です。\n"
printf("本当に%2d点をつけますか?\n",ten)
print"yes か no を入力して下さい。\n"
yn = gets.chomp!
if yn == "yes"
print"優秀ですね\n\n"
elsif yn == "no"
print"再入力をお願いします。\n\n"
redo
end
end
if ten == "exit"
count -= 1
break
elsif count == 8
sum += ten.to_f
break
end
sum += ten.to_i
count += 1
end
ave = sum / count
printf("あなたの%3d回分の合計得点は%5.1f点です。\n",count ,sum)
printf("平均点は%5.2f点です。\n",ave)
実行結果
sime{c118xxx}% ./report3.rb [~/program]
レポートの合計得点、平均点を求めます。
1回目の点数 (exit入力で終了) : 8
2回目の点数 (exit入力で終了) : 8
3回目の点数 (exit入力で終了) : 8
4回目の点数 (exit入力で終了) : 8
5回目の点数 (exit入力で終了) : 8
6回目の点数 (exit入力で終了) : 8
7回目の点数 (exit入力で終了) : 8
8回目の点数 (exit入力で終了) : -1
得点がマイナスになることはありません。
8回目の点数 (exit入力で終了) : 10
レポートの最高得点は8点です。
本当に10点をつけますか?
yes か no を入力して下さい。
no
再入力をお願いします。
8回目の点数 (exit入力で終了) : 10
レポートの最高得点は8点です。
本当に10点をつけますか?
yes か no を入力して下さい。
yes
優秀ですね
あなたの 8回分の合計得点は 66.0点です。
平均点は 8.25点です。
説明
今回のプログラムは所謂∞ループと言うものに終了条件を任意で設定し、実行
すると言うものである。∞ループを用いる際には"while true"文を使用する。
条件分岐"if-end"を幾つかに分けて記述しているため、処理の流れを追いつつ
説明していく。
まず、ユーザーには点数を入力してもらう必要がある。ここで注意したいのが
終了条件の一つに文字を入力するものがあると言うことだ。したがって、ここ
では入力されたものを数には変換せずそのままにしておく。
一つ目のif文は課題で言うところの4、5番にあたる処理だ。入力された点数が
規定の値を超えているか判断し、確認や再入力の指示を行う。分岐の条件には
直前で入力をしたtenを用いているわけだが、これ以降数字として扱っていくた
めに実数変換を行っている。整数ではなく実数に変換しているのは仮に実数を
入力されたときでも細かな誤差を極力生まないようにするためだ。
処理の内容は、負の数が入力されたら再入力(redoで繰り返しの最初へ)、8より大
きい値が入力されたらユーザーに確認後yesかnoを入力してもらうものである。
二つ目のif文は一つ目の中で行う。yesかnoを入力してもらった後、それに対応
した処理を各々設定している。条件には文字列を用いているため""(ダブルクオー
テーション)を忘れてはいけない。
三つ目のif文は終了に関する処理が行われている。exitで終了する場合は、カ
ウントを1減らすことで正しく平均を出せるようにしている。最大回数に達して
終了する場合は最後の値が合計に加算されなくなってしまうため、ここでも合
計の加算代入を行えるようにしている。
感想
前回課題を元にした応用の内容と言うことで、考え方は分かりやすいと感じま
した。完成したものをぱっと見るとどこか複雑であるような印象も多少ありま
すが、?簡単なif文の組み合わせだと考えるとやりやすい部分もあったと思いま
す。