コース一覧
    C言語基礎 制御フロー編
    つくる 合否とランク判定

    C言語基礎 制御フロー編

    C言語の条件分岐と繰り返しを学び、処理の流れを組み立てるコースです。

    1
    条件分岐
    01. if文15分
    02. else ifで多分岐15分
    03. switch文15分
    04. 三項演算子15分
    05. 定番 FizzBuzz判定15分
    06. 条件の組み合わせ15分
    07. つくる 合否とランク判定15分
    08. 第3章クイズ10分
    2
    繰り返し
    01. for文15分
    02. while15分
    03. do-while15分
    04. breakとcontinue15分
    05. 二重ループ(九九)15分
    06. FizzBuzzループ版15分
    07. つくる N人分の入力15分
    08. 第4章クイズ10分

    つくる 合否とランク判定

    前回作った平均表示の続きから

    第2章の最後で、3科目の点数を読み込んで合計と平均を表示するところまで作りました。今回はその続きとして、平均から合否とランクを出すところまで仕上げます。入力と計算の部分はそのまま使えるので、書き足すのは判定だけです。

    第2章のプログラムはこうなっていました。

    c

    int total = kokugo + suugaku + eigo;
    double average = (double)total / 3;
    
    printf("国語%6d点\n", kokugo);
    printf("数学%6d点\n", suugaku);
    printf("英語%6d点\n", eigo);
    printf("合計%6d点\n", total);
    printf("平均%6.1f点\n", average);

    %6d は「6桁分の幅を取って右に寄せる」書式で、これのおかげで点数の桁がそろって見えます。(double) のキャストを忘れると、整数どうしの割り算になって小数が切り捨てられます。255 を 3 で割ると 85 なので気づきませんが、250 を 3 で割ると 83.3 が 83 になります。ここは第2章でつまずいたところなので、書き写すときにも落とさないでください。

    判定を足す

    ここから先が今回の内容です。平均を使って、ランクと合否の2行を追加します。

    ランクは範囲の判定なので else if を厳しいほうから並べます。合否は2つに分かれるだけなので if と else で十分です。判定の軸が違うので、ひとつの連なりに混ぜず、別々に書きます。ランクの連なりに合否を紛れ込ませると、A なら合格とだけ書いた枝ができ、あとで基準を変えるときに直し漏れが出ます。

    小数を条件に使うときの注意

    今回は double の average を >= で比較します。> や >= は安全ですが、小数どうしを == で比べるのは避けてください。コンピュータは小数を2進数の近似で持っているので、計算の途中で目に見えないずれが生まれ、average == 60.0 が成り立たないことがあります。等しいかどうかを判定したいときは、整数で比べられる形に持ち込むのが定石です。

    表示の桁にも気をつけます。%f をそのまま使うと 85.000000 と小数点以下が6桁出ます。%.1f と書いて1桁に丸めます。これは表示だけの丸めで、average が持っている値そのものは変わりません。表示が 60.0 に見えても、内部の値がわずかに 60 を下回っていれば判定は不合格になります。表示と判定は別物だと覚えておいてください。

    ランクと合否を混ぜない

    ここまでの部品をひとつの else if の連なりにまとめたくなるかもしれません。

    c

    if (average >= 90) {
        printf("ランクはAです\n");
        printf("判定は合格です\n");
    } else if (average >= 80) {
        printf("ランクはBです\n");
        printf("判定は合格です\n");
    }

    これでも同じ表示になりますが、合格の基準を70点に変えたくなったとき、直す場所が枝の数だけ散らばります。判定の軸が違うものは、別の if として並べておくのが安全です。今回のプログラムは、入力、計算、一覧の表示、ランクの判定、合否の判定、という5つのかたまりが上から順に並ぶ形になります。この並びは、第4章で人数分の繰り返しを足すときにもそのまま活きます。

    動かして確かめる

    書き終えたら、境界の値を入れて動かしてください。平均がちょうど60になる入力、ちょうど90になる入力を試すと、>= と > の取り違えがすぐ見つかります。

    要件

    1. scanf で国語、数学、英語の順に整数を3つ読む
    2. 第2章と同じく、バナー、各科目、合計、平均を表示する
    3. 平均が90以上はA、80以上はB、70以上はC、60以上はD、それ未満はFとし、「ランクはBです」の形で表示する
    4. 平均が60以上なら「判定は合格です」、そうでなければ「判定は不合格です」と表示する
    5. ランクの判定と合否の判定は、別々の if として並べて書く

    ヒント

    入力から平均の表示までは第2章のものをそのまま使えます。書き足すのは最後の2つの if だけです

    ランクは else if を厳しいほうから並べます。平均が90以上の枝を一番上に置きます

    平均は (double)total / 3 です。キャストを落とすと小数が消えて、境界の点数でランクがずれます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • 第3章クイズ

      第3章の理解を確認します。

    • for文

      回数を指定して繰り返せるようになります。

    • 条件の組み合わせ

      入れ子になった条件を整理して書けるようになります。

    • 定番 FizzBuzz判定

      複合条件の定石を書けるようになります。

    main.c
    エディタを読み込んでいます

    メモ

    つくる 合否とランク判定

    ⌘S で保存