17 トレース問題3(複合)

二重ループ・ループ+条件分岐・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=1i=1,j=2i=2,j=1i=2,j=2i=3,j=1i=3,j=2
i × j122436
sum013591218

外側 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 代入出力
a2
b3
c4
a<b && b<c真(2<3 かつ 3<4)
result09(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=1i=2i=3i=4i=5
i%2==0
動作sum+=1continuesum+=3continuesum+=5
sum011449

偶数のとき 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;
}
▶ トレース表を見る
ij の初期値j の範囲出力(1行)
111, 2, 31 2 3
222, 32 3
3333

内側ループの初期値が j = i なので、i が大きくなるほど出力が短くなる。

解説を表示

正解:イ

内側の初期値が j = i なので i=1 のとき j=1〜3、i=2 のとき j=2〜3、i=3 のとき j=3 のみ。