コードを実行前に手元で追って出力を予測してから答えを選ぼう。
「トレース表を見る」を開くと変数の変化を確認できる。
問1. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int x = 10, y = 3, z = 0;
if (x > y) {
z += x;
if (x < 15) {
z -= y;
} else {
z += y;
}
}
printf("%d\n", z);
return 0;
}
| 変数 | 初期値 | z += x | z -= y | 出力 |
|---|---|---|---|---|
| x | 10 | 10 | 10 | — |
| y | 3 | 3 | 3 | — |
| z | 0 | 10 | 7 | 7 |
x > y(10>3)→ 真 → z += x → z=10
x < 15(10<15)→ 真 → z -= y → z=10-3=7
正解:ウ(7)
x > y が真なので z += x(z=10)。次に x < 15 が真なので z -= y(z=7)。
問2. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int a = 4, b = 6, r = 0;
if (a < b) {
r += b;
a++;
if (a == 5) {
r -= 2;
} else {
r += 3;
}
}
printf("%d\n", r);
return 0;
}
| 変数 | 初期値 | r += b | a++ | r -= 2 | 出力 |
|---|---|---|---|---|---|
| a | 4 | 4 | 5 | 5 | — |
| b | 6 | 6 | 6 | 6 | — |
| r | 0 | 6 | 6 | 4 | 4 |
a < b(4<6)→ 真 → r+=b → r=6
a++(a=5)→ a==5 → 真 → r-=2 → r=4
正解:ア(4)
r+=b で r=6。a++ で a=5 になり a==5 が真 → r-=2 → r=4。
問3. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int i = 1, j = 2, k = 0;
if (i < j) {
k = i + j;
}
if (k > 2) {
k = k * 2;
}
printf("%d\n", k);
return 0;
}
| 変数 | 初期値 | k = i + j | k = k * 2 | 出力 |
|---|---|---|---|---|
| i | 1 | 1 | 1 | — |
| j | 2 | 2 | 2 | — |
| k | 0 | 3 | 6 | 6 |
i < j(1<2)→ 真 → k = 1+2 = 3
k > 2(3>2)→ 真 → k = 3×2 = 6
正解:ウ(6)
2つの if が独立している点に注意。k=3 になった後、2つ目の if(k>2)も評価される。
問4. 次のプログラムの出力として正しいものはどれか。
#include <stdio.h>
int main(void)
{
int x = 5, y = 5, z = 0;
if (x == y) {
z = x + y;
} else {
z = x - y;
}
if (z >= 10) {
z *= 2;
}
printf("%d\n", z);
return 0;
}
| 変数 | 初期値 | z = x + y | z *= 2 | 出力 |
|---|---|---|---|---|
| x | 5 | 5 | 5 | — |
| y | 5 | 5 | 5 | — |
| z | 0 | 10 | 20 | 20 |
x == y(5==5)→ 真 → z = 5+5 = 10
z >= 10(10>=10)→ 真 → z *= 2 → z = 20
正解:エ(20)
x == y が真 → z=10。次の if で z>=10 も真 → z*=2 → z=20。