AIZU ONLINE JUDGE ITP1_7_Aをpythonで解いてみた

python

本サイトAIZU ONLINE JUDGE ITP1_7_A へはこちらから

目次

問題:成績

あなたの課題は、あるクラスの数学の成績を付けるプログラムを作成することです。
プログラムは複数の学生のテストの点数を読み込みます。
テストの点数は、中間試験の点数 m、期末試験の点数 f、再試験の点数 r で構成されています。
中間試験と期末試験は 50 点満点(mf ≤ 50)、再試験は 100 点満点 (r ≤ 100)です。
試験を受けていない場合は点数を -1 とします。

以下の手順で成績が付けられます:

  • 中間試験、期末試験のいずれかを欠席した場合成績は F。
  • 中間試験と期末試験の合計点数が 80 以上ならば成績は A 。
  • 中間試験と期末試験の合計点数が 65 以上 80 未満ならば成績は B。
  • 中間試験と期末試験の合計点数が 50 以上 65 未満ならば成績は C。
  • 中間試験と期末試験の合計点数が 30 以上 50 未満ならば成績は D。 ただし、再試験の点数が 50 以上ならば成績は C。
  • 中間試験と期末試験の合計点数が 30 未満ならば成績は F。

Input

複数のデータセットが入力として与えられます。各データセットでは、空白で区切られた mfr が 1 行に与えられます。

mfr がすべて -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

解説

以下のように解いていきます。

  1. while文を使用し、入力処理を行う
  2. 点数に応じて条件分岐、処理結果の表示

ある条件まで入力を続ける場合は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
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

■保有資格
Salesforce 認定 Platform アプリケーションビルダー
Salesforce 認定 Platform デベロッパー

コメント

コメントする

目次