C言語入門|5章の練習問題

5章では、C言語の 分岐処理(if / if-else / if-else if-else)
繰り返し処理(while / do-while / for) に加えて、
break や continue を使った制御 も学びました。

特にこの章の特徴は、
「プログラム全体の流れを、条件や繰り返しによって自在に制御できるようになる」ことです。
組み合わせが複雑になるほど、
“どの if を使うか”“どのループが適切か” といった判断が重要になります。

if 文の種類と使いどころ

if 文の違い

【単独の if 文】
if (条件式) {
    実行;
}

→ 条件が真なら実行、偽なら何もしない。
【if-else 構文】
if (条件式) {
    実行A;
} else {
    実行B;
}

→ どちらか必ず一方が実行される。
【if-else if-else 構文】
if (条件A) {
    実行A;
} else if (条件B) {
    実行B;
} else {
    実行C;
}

→ 複数の条件を順番にチェック。

ループ文の違い

種類特徴
while条件を先にチェック。0 回実行の可能性あり。
do-while先に1回実行してから条件判定。最低1回は動く。
for回数が決まっている、または変数を小刻みに変化させたい場合に最適。

break の意味

break;

「ループの途中でも即座に抜けられる」命令です。
条件の組み合わせ次第で複雑なロジックをシンプルにできます。

サンプルプログラム

プロジェクト名:5-12-1 ソースファイル名: sample5-12-1.c

#include <stdio.h>

int main(void) {
    int value = 3;

    printf("判定を行います。\n");

    if (value > 5) {
        printf("値は大きめです。\n");
    } else {
        printf("値は小さめです。\n");
    }

    return 0;
}

メッセージも内容も5章本来のものとは異なるように変更しています。

ここまで理解できれば、
5章の練習問題に挑戦する準備はばっちり です。

5章の練習問題

【練習5-1】

次の分岐を実現するには、どの構文を用いればよいか。
if / if-else / if-else if-else のいずれかを答えてください。

(1) 変数 ok が true ならメッセージを表示し、それ以外は何もしない。
(2) 合計値が目標値と一致するなら成功、一致しないなら失敗と表示する。
(3) 点数 score に応じて、
  90 以上は「優秀」、70 以上は「良」、40 以上は「可」、それ以外は「不可」を表示する。

【解答例】

番号構文解説
(1)if 文条件が真のときだけ処理する。
(2)if-elseどちらか一方を必ず実行 -->
(3)if-else if-else4段階の判定が必要

【練習5-2】

次の処理は合計で何回ループを実行するでしょうか。

(1)

int i = 0;
while (i <= 5) {
    i++;
}

(2)

int j = 3;
do {
    j--;
} while (j > 3);

(3)

for (int k = 5; k >= -2; k--) {
    printf("%d ", k);
}

【解答と解説】

(1)
i = 0 → 1 → 2 → 3 → 4 → 5 → 6
6 回

(2)
最初に1回実行(3→2)
その後 2 > 3 ではないので終了
→ 1 回

(3)
5,4,3,2,1,0,-1,-2
→ 8 回

【練習5-3】

次の要件を満たすプログラムを作成せよ。
ただし break を使って条件分岐をスッキリ書くこと。

要件

  • 「0〜4の数字を入力してください」と表示
  • 入力に応じて次の表示をする。
    ・0 → 「北」
    ・1,2 → 「中央」
    ・3,4 → 「南」
    ・それ以外 → 「入力範囲外」

【解答例(break を使った構成)】

プロジェクト名:5-12-2 ソースファイル名: sample5-12-2.c

#include <stdio.h>

int main(void) {
    int num;
    printf("0〜4の数字を入力してください\n");
    scanf("%d", &num);

    switch (num) {
        case 0:
            printf("北\n");
            break;
        case 1:
        case 2:
            printf("中央\n");
            break;
        case 3:
        case 4:
            printf("南\n");
            break;
        default:
            printf("入力範囲外\n");
            break;
    }

    return 0;
}

【練習5-4】

5000円を使って、

  • 1本 150円のジュース
  • 1袋 5個入り 450円のミカン
    を買うとしたら、それぞれ最大いくつ買えるか計算し、
    余る金額も表示しなさい(割り算は禁止)。

【解答例と解説】

プロジェクト名:5-12-3 ソースファイル名: sample5-12-3.c

#include <stdio.h>

int main(void) {
    int moneyJuice = 5000;
    int moneyMikan = 5000;

    int juice = 0;
    int mikan = 0;

    // ジュース(150円)
    while (moneyJuice >= 150) {
        moneyJuice -= 150;
        juice++;
    }

    // ミカン(450円)
    while (moneyMikan >= 450) {
        moneyMikan -= 450;
        mikan++;
    }

    // ジュース表示
    printf("ジュース ");
    for (int i = 0; i < juice; i++) {
        printf("*");
    }
    printf("(%d個) 余りは %d 円\n", juice, moneyJuice);

    // ミカン表示
    printf("ミカン  ");
    for (int i = 0; i < mikan; i++) {
        printf("*");
    }
    printf("(%d袋) 余りは %d 円\n", mikan, moneyMikan);

    return 0;
}

【表示例】

ジュース **************(14個) 余りは 110 円
ミカン  ********(8袋) 余りは 40 円

【練習5-5】

次の要件で数当てゲーム(レベル1)を作成せよ。

(1) 「ミニ数当てゲーム」と表示
(2) 0〜9 の乱数を answer に格納
(3) 最大4回まで入力を受け付ける
(4) 正解なら何回目で当たったか表示して終了
(5) 不正解ならヒント「もっと大きい」「もっと小さい」を表示
(6) 4回外れたら正解を表示して終了

【解答例】

プロジェクト名:5-12-4 ソースファイル名: sample5-12-4.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand((unsigned)time(NULL));
    int answer = rand() % 10;
    int guess;

    printf("***ミニ数当てゲーム***\n");

    for (int i = 1; i <= 4; i++) {
        printf("%d回目:0〜9の数を入力してください\n", i);
        scanf("%d", &guess);

        if (guess == answer) {
            printf("正解!%d回目で当たりました!\n", i);
            return 0;
        } else if (guess < answer) {
            printf("ヒント:もっと大きいです\n");
        } else {
            printf("ヒント:もっと小さいです\n");
        }
    }

    printf("残念!正解は %d でした\n", answer);
    return 0;
}

【練習5-6】

次の条件を満たす「降下カウント」プログラムを作成してください。

  • 10 から 1 まで 1 ずつ減らして表示
  • 途中で値が 4 になったらメッセージ「点検ポイント!」を表示
  • 値が 2 になったら break でループ終了
  • 最後に「カウント終了」と表示

【解答例】

プロジェクト名:5-12-5 ソースファイル名: sample5-12-5.c

#include <stdio.h>

int main(void) {

    for (int i = 10; i >= 1; i--) {
        if (i == 4) {
            printf("点検ポイント!\n");
        }

        if (i == 2) {
            break;
        }

        printf("%d\n", i);
    }

    printf("カウント終了\n");
    return 0;
}

【練習5-7】

次の処理は何回ループが実行されるでしょうか。

int x = 0;
while (x < 20) {
    x += 3;
}

【解答例と解説】

x の変化
0 → 3 → 6 → 9 → 12 → 15 → 18 → 21

最後に 21 で終了するので、
7 回 実行される。