二重ループ・ループ+条件分岐・break/continue など複数の要素が絡む問題。
表は列が多くなる場合があるので横スクロールで確認しよう。
問1. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i = 1, j = 0, sum = 0;
while (i <= 3) {
j = 1;
while (j <= 2) {
sum += i * j;
j++;
}
i++;
}
printf("%d\n", sum);
return 0;
}
| 変数 | 初期 | i=1,j=1 | i=1,j=2 | i=2,j=1 | i=2,j=2 | i=3,j=1 | i=3,j=2 |
|---|---|---|---|---|---|---|---|
| i × j | — | 1 | 2 | 2 | 4 | 3 | 6 |
| sum | 0 | 1 | 3 | 5 | 9 | 12 | 18 |
外側 i=1〜3、内側 j=1〜2 の組み合わせで i×j を加算。合計6回。
正解:ウ(18)
1+2+2+4+3+6 = 18。外側ループが1周するたびに内側ループが全部回る。
問2. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int a = 2, b = 3, c = 4, result = 0;
if (a < b && b < c) {
result = a + b + c;
} else if (a > b || c < b) {
result = a * b;
} else {
result = c - a;
}
printf("%d\n", result);
return 0;
}
| 変数 | 初期値 | 条件評価 | result 代入 | 出力 |
|---|---|---|---|---|
| a | 2 | — | — | — |
| b | 3 | — | — | — |
| c | 4 | — | — | — |
| a<b && b<c | — | 真(2<3 かつ 3<4) | — | — |
| result | 0 | — | 9(2+3+4) | 9 |
最初の条件が真の時点で else if・else はスキップされる。
正解:ウ(9)
a<b(真)かつ b<c(真)→ AND 真 → result = 2+3+4 = 9。
問3. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i, sum = 0;
for (i = 1; i <= 5; i++) {
if (i % 2 == 0) {
continue;
}
sum += i;
}
printf("%d\n", sum);
return 0;
}
| 変数 | 初期 | i=1 | i=2 | i=3 | i=4 | i=5 |
|---|---|---|---|---|---|---|
| i%2==0 | — | 偽 | 真 | 偽 | 真 | 偽 |
| 動作 | — | sum+=1 | continue | sum+=3 | continue | sum+=5 |
| sum | 0 | 1 | 1 | 4 | 4 | 9 |
偶数のとき continue → sum への加算をスキップ。奇数 1+3+5=9。
正解:ア(9)
偶数は continue でスキップ。加算されるのは 1, 3, 5 のみ。1+3+5=9。
問4. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i, j;
for (i = 1; i <= 3; i++) {
for (j = i; j <= 3; j++) {
printf("%d ", j);
}
printf("\n");
}
return 0;
}
| i | j の初期値 | j の範囲 | 出力(1行) |
|---|---|---|---|
| 1 | 1 | 1, 2, 3 | 1 2 3 |
| 2 | 2 | 2, 3 | 2 3 |
| 3 | 3 | 3 | 3 |
内側ループの初期値が j = i なので、i が大きくなるほど出力が短くなる。
正解:イ
内側の初期値が j = i なので i=1 のとき j=1〜3、i=2 のとき j=2〜3、i=3 のとき j=3 のみ。