
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-else | 4段階の判定が必要 |
【練習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 回 実行される。
