ループのトレースは変数の変化を1周ずつ左から右へ追うのが効果的。
表を開いて確認する前に、まず自分で予測してみよう。
問1. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i = 0, sum = 0;
while (i < 3) {
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}
| 変数 | 初期 | 1周目 | 2周目 | 3周目 | 終了 |
|---|---|---|---|---|---|
| i(条件判定時) | 0(真) | 1(真) | 2(真) | 3(偽) | — |
| sum | 0 | 0 | 1 | 3 | 3 |
sum += i:0+0=0 → 0+1=1 → 1+2=3。i=3 で条件偽 → 終了。
正解:イ(3)
i=0,1,2 の3回ループ。sum = 0+1+2 = 3。i=3 で条件偽→終了。
問2. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i, result = 1;
for (i = 1; i <= 3; i++) {
result *= i;
}
printf("%d\n", result);
return 0;
}
| 変数 | 初期 | i=1 | i=2 | i=3 | 終了 |
|---|---|---|---|---|---|
| i(条件) | — | 1(真) | 2(真) | 3(真) | 4(偽) |
| result | 1 | 1 | 2 | 6 | 6 |
result *= i:1×1=1 → 1×2=2 → 2×3=6(3の階乗)
正解:イ(6)
1×1×2×3 = 6。3の階乗(3!)の計算になっている。
問3. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i;
for (i = 5; i > 0; i -= 2) {
printf("%d ", i);
}
return 0;
}
| 変数 | 初期 | 1周目 | 2周目 | 3周目 | 終了 |
|---|---|---|---|---|---|
| i(条件) | 5(真) | 3(真) | 1(真) | -1(偽) | — |
| 出力 | — | 5 | 3 | 1 | — |
i -= 2 で2ずつ減少。i=1 は条件 i>0 を満たすので出力される。
正解:ア(5 3 1)
i=1 は i>0 を満たすので出力される。i=-1 で終了。
問4. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i, cnt = 0;
for (i = 1; i <= 10; i++) {
if (i % 3 == 0) {
cnt++;
}
}
printf("%d\n", cnt);
return 0;
}
| 変数 | 初期 | i=1 | i=2 | i=3 | i=4 | i=5 | i=6 | i=7 | i=8 | i=9 | i=10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| i%3==0 | — | 偽 | 偽 | 真 | 偽 | 偽 | 真 | 偽 | 偽 | 真 | 偽 |
| cnt | 0 | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 3 | 3 |
1〜10 の中で3の倍数:3, 6, 9 の3つ。
正解:ウ(3)
3の倍数は 3, 6, 9 の3つ。cnt が3回インクリメントされる。