寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C #ITP1_7_A C言語による成績の評価

C言語による成績の評価です。
複数のデータセットから、各データセットの成績を出力するプログラムです。

・問題
 あなたの課題は、あるクラスの数学の成績を付けるプログラムを作成することです。
 プログラムは複数の学生のテストの点数を読み込みます。
 テストの点数は、中間試験の点数 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。

・入力される値
 複数のデータセットが入力として与えられます。
 各データセットでは、空白で区切られた m、f、r が 1 行に与えられます。
 m、f、r がすべて -1 のとき入力の終わりとします。
 データセットの数(生徒の数)は 50 を超えません。

・期待する出力
 各データセットについて、成績(A、B、C、D、または F)を1行に出力して下さい。

僕が作成、提出したコードは、以下のとおりです。

/*
 ITP1_7_A : Grading
 http://judge.u-aizu.ac.jp/
 C言語による成績の評価
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int main(void){
    int m,f,r;
    while(1){
        scanf("%d %d %d",&m,&f,&r);
        if(m==-1 && f==-1 && r==-1){
            break;
        }else if(m==-1 ||f==-1){
            printf("F\n");
        }else if(m+f>=80){
            printf("A\n");
        }else if(m+f>=65 && m+f<80){
            printf("B\n");
        }else if(m+f>=50 && m+f<65){
            printf("C\n");
        }else if(m+f>=30 && m+f<50){
            if(r>=50){
                printf("C\n");
            }else{
                printf("D\n");
            }
        }else if(m+f<30){
            printf("F\n");
        }
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ITP1_7_A : Grading