本サイトAIZU ONLINE JUDGE ITP1_7_A へはこちらから
問題:成績
あなたの課題は、あるクラスの数学の成績を付けるプログラムを作成することです。
プログラムは複数の学生のテストの点数を読み込みます。
テストの点数は、中間試験の点数 m、期末試験の点数 f、再試験の点数 r で構成されています。
中間試験と期末試験は 50 点満点(m, f ≤ 50)、再試験は 100 点満点 (r ≤ 100)です。
試験を受けていない場合は点数を -1 とします。
以下の手順で成績が付けられます:
- 中間試験、期末試験のいずれかを欠席した場合成績は F。
- 中間試験と期末試験の合計点数が 80 以上ならば成績は A 。
- 中間試験と期末試験の合計点数が 65 以上 80 未満ならば成績は B。
- 中間試験と期末試験の合計点数が 50 以上 65 未満ならば成績は C。
- 中間試験と期末試験の合計点数が 30 以上 50 未満ならば成績は D。 ただし、再試験の点数が 50 以上ならば成績は C。
- 中間試験と期末試験の合計点数が 30 未満ならば成績は F。
Input
複数のデータセットが入力として与えられます。各データセットでは、空白で区切られた m、f、r が 1 行に与えられます。
m、f、r がすべて -1 のとき入力の終わりとします。
データセットの数(生徒の数)は 50 を超えません。
Output
各データセットについて、成績(A、B、C、D、または F)を1行に出力して下さい。
解答例
while True:
m, f, r = map(int, input().split())
if m == f == r == -1:
break
if m == -1 or f == -1 or m + f < 30:
print("F")
elif m + f >= 80:
print("A")
elif m + f >= 65:
print("B")
elif m + f >= 50:
print("C")
elif m + f >= 30:
if r >= 50:
print("C")
else:
print("D")
else:
pass
解説
以下のように解いていきます。
while文を使用し、入力処理を行う
ある条件まで入力を続ける場合はwhile文とif文を組み合わせて、入力処理を行います。
# if文の条件式に当てはまるまでループ処理を続ける
while True:
処理
# この条件式に当てはまる場合、break文でループ処理を終了する
if 条件式:
break
今回は、whileループ内でmap関数でm、f、r に3つの整数を設定し、m、f、r が全て -1の場合にbreak文で処理を終了します。
# 終了条件に当てはまるまで処理を続ける
while True:
# input().split()で複数個の文字列を取得 → int関数に当てはめint型に変換 → m, f, rに設定
m, f, r = map(int, input().split())
# m, f, rが全て0の場合にbreak文で処理を終了
if m == f == r == -1:
break
※サイト内「AIZU ONLINE JUDGE ITP1_1_Cをpythonで解いてみた」の、map関数とはにmap関数の使用方法が書かれておりますのでぜひご覧ください。
点数に応じて条件分岐、処理結果の表示
if文を使用し、点数に応じた成績を表示します。通常、値の大きい順または小さい順に記述しますが、成績Fの条件が特異であるためはじめに記述します。
# 中間試験、期末試験のいずれかを欠席した場合、合計点数(m + f)が30未満の場合
if m == -1 or f == -1 or m + f < 30:
# Fを表示
print("F")
# 合計点数(m + f)が80以上の場合
elif m + f >= 80:
# Aを表示
print("A")
# 合計点数(m + f)が65以上の場合
elif m + f >= 65:
# Bを表示
print("B")
# 合計点数(m + f)が50以上の場合
elif m + f >= 50:
# Cを表示
print("C")
# 合計点数(m + f)が30以上の場合
elif m + f >= 30:
# 合計点数(m + f)が30以上 かつ 再試験の点数(r)が50以上の場合
if r >= 50:
# Cを表示
print("C")
# 合計点数(m + f)が30以上 かつ 再試験の点数(r)が50未満の場合
else:
# Dを表示
print("D")
# それ以外の場合何もしない
else:
pass
最後に、もう一度プログラムを確認してみましょう。
# 終了条件に当てはまるまで処理を続ける
while True:
# input().split()で複数個の文字列を取得 → int関数に当てはめint型に変換 → m, f, rに設定
m, f, r = map(int, input().split())
# m, f, rが全て0の場合にbreak文で処理を終了
if m == f == r == -1:
break
# 中間試験、期末試験のいずれかを欠席した場合、合計点数(m + f)が30未満の場合
if m == -1 or f == -1 or m + f < 30:
# Fを表示
print("F")
# 合計点数(m + f)が80以上の場合
elif m + f >= 80:
# Aを表示
print("A")
# 合計点数(m + f)が65以上の場合
elif m + f >= 65:
# Bを表示
print("B")
# 合計点数(m + f)が50以上の場合
elif m + f >= 50:
# Cを表示
print("C")
# 合計点数(m + f)が30以上の場合
elif m + f >= 30:
# 合計点数(m + f)が30以上 かつ 再試験の点数(r)が50以上の場合
if r >= 50:
# Cを表示
print("C")
# 合計点数(m + f)が30以上 かつ 再試験の点数(r)が50未満の場合
else:
# Dを表示
print("D")
# それ以外の場合何もしない
else:
pass
コメント