112年高考三級程式設計第一題
一、關於以下 C 程式碼:
請說明程式執行後,程式碼編號26~33的輸出,以及其運算邏輯。(25分) |
答:
(一)printf("%u\n", f1(6, 2))
1.輸出:0。
2.運算邏輯:
unsigned int f1(unsigned int a, unsigned int b) { return (a&&!b); }
a = 6,b = 2,!b = 0。
&& 是邏輯運算子,就是用來判斷 true 與 false 的狀態。a && b = 0,因為任何數字與0進行邏輯 && 操作結果都為0。
(二)printf("%u\n", f2(6, 2))
1.輸出:24。
2.運算邏輯:
unsigned int f2(unsigned int a, unsigned int b) { return (a<<b); }
a = 610 = 01102。
b = 210 = 00102。
a << (b = 01102) << 2 => 110002 = 2410。
(三)printf("%u\n", f3(7, 2))
1.輸出:5。
2.運算邏輯:
unsigned int f3(unsigned int a, unsigned int b) { return (a&~b); }
a = 710 = 01112。
b = 210 = 00102。
~b = 11012。
01112
AND) 11012
01012
(四)printf("%d\n", f4(3, 12))
1.輸出:27。
2.運算邏輯:
int f4(int a, int b) { return a*b+a-b; }
3×12+3-12 = 36+3-12 = 27。
(五)printf("%d\n", f5(15, 3))
1.輸出:155。
2.運算邏輯:
data:
|
0 |
1 |
2 |
0 |
4 |
3 |
2 |
1 |
3 |
4 |
2 |
2 |
2 |
3 |
3 |
f4:
int f4(int a, int b) { return a*b+a-b; } |
f5:
int f5(int a, int b) { int data[SIZE]; for (int i = 1, k = 0; i < a; i++) { if (i%3 == 0) data[k++] = f4(i, i+1); } return data[b]; } |
a = 15, b = 3。
當 i = 1 時,1%3 = 1。
當 i = 2 時,2%3 = 2。
當 i = 3 時,3%3 = 0。
data[0] = f4(1, 3+1) = f4(1, 4) = 1×4+1-4 = 4+1-4 = 1。
當 i = 4 時,4%3 = 1。
當 i = 5 時,5%3 = 2。
當 i = 6 時,6%3 = 0。
data[1] = f4(6, 6+1) = f4(6, 7) = 6×7+6-7 = 42+6-7 = 41。
當 i = 7 時,7%3 = 1。
當 i = 8 時,8%3 = 2。
當 i = 9 時,9%3 = 0。
data[2] = f4(9, 9+1) = f4(9, 10) = 9×10+9-10 = 90+9-10 = 89。
當 i = 10 時,10%3 = 1。
當 i = 11 時,11%3 = 2。
當 i = 12 時,12%3 = 0。
data[3] = f4(12, 12+1) = f4(12, 13) = 12×13+12-13 = 156-1 = 155。
當 i = 13 時,13%3 = 1。
當 i = 14 時,14%3 = 2。
(六)printf("%d\n", f5(3, 15))
1.輸出:空值。
2.運算邏輯:
f4:
int f4(int a, int b) { return a*b+a-b; } |
f5:
int f5(int a, int b) { int data[SIZE]; for (int i = 1, k = 0; i < a; i++) { if (i%3 == 0) data[k++] = f4(i, i+1); } return data[b]; } |
a = 3, b = 15。
當 i = 1 時,1%3 = 1。
當 i = 2 時,2%3 = 2。
data[15] = 空值。
(七)printf("%d\n", f6(1, 1))
1.輸出:4。
2.運算邏輯:
data:
|
0 |
1 |
2 |
0 |
4 |
3 |
2 |
1 |
3 |
4 |
2 |
2 |
2 |
3 |
3 |
f6:
int f6(int a, int b) { int data[ ][THREE] = {{4, 3, 2}, {3, 4, 2}, {2, 3, 3}}; for (int i = 0; i < THREE; i++) { for (int j = 0; j < THREE; j++) { if (i > a || j > b) data[i][j] = data[j][i]+b; } } return data[a][b]; } |
a = 1, b = 1。
當 i = 0 時:
j = 0,if (i > a || j > b) => if (0 < 1 || 0 < 1),不成立。
j = 1,if (i > a || j > b) => if (0 < 1 || 1 == 1),不成立。
j = 2,if (i > a || j > b) => if (2 > 1 || 2 > 1),成立。
data[0][2] = data[2][0]+1 = 2+1 = 3。
當 i = 1 時:
j = 0,if (i > a || j > b) => if (1 == 1 || 0 < 1),不成立。
j = 1,if (i > a || j > b) => if (1 == 1 || 1 == 1),不成立。
j = 2,if (i > a || j > b) => if (1 == 1 || 2 > 1),成立。
data[0][2] = data[1][2]+1 = 2+1 = 3。
當 i = 2 時:
j = 0,if (i > a || j > b) => if (2 > 1 || 0 < 1),成立。
data[2][0] = data[0][2]+1 = 2+1 = 3。
j = 1,if (i > a || j > b) => if (2 > 1 || 1 == 1),成立。
data[2][1] = data[1][2]+1 = 2+1 = 3。
j = 2,if (i > a || j > b) => if (2 > 1 || 2 > 1),成立。
data[2][2] = data[2][2]+1 = 3+1 = 4。
data[1][1] = 4。
(八)printf("%d\n", f6(3, 2))
1.輸出:空值。
2.運算邏輯:
data:
|
0 |
1 |
2 |
0 |
4 |
3 |
2 |
1 |
3 |
4 |
2 |
2 |
2 |
3 |
3 |
f6:
int f6(int a, int b) { int data[ ][THREE] = {{4, 3, 2}, {3, 4, 2}, {2, 3, 3}}; for (int i = 0; i < THREE; i++) { for (int j = 0; j < THREE; j++) { if (i > a || j > b) data[i][j] = data[j][i]+b; } } return data[a][b]; } |
a = 3, b = 2。
當 i = 0 時:
j = 0,if (i > a || j > b) => if (0 < 3 || 0 < 2),不成立。
j = 1,if (i > a || j > b) => if (0 < 3 || 1 < 2),不成立。
j = 2,if (i > a || j > b) => if (0 < 3 || 2 == 2),不成立。
當 i = 1 時:
j = 0,if (i > a || j > b) => if (1 < 3 || 0 < 2),不成立。
j = 1,if (i > a || j > b) => if (1 < 3 || 1 < 2),不成立。
j = 2,if (i > a || j > b) => if (1 < 3 || 2 == 2),不成立。
當 i = 2 時:
j = 0,if (i > a || j > b) => if (2 < 3 || 0 < 2),不成立。
j = 1,if (i > a || j > b) => if (2 < 3 || 1 < 2),不成立。
j = 2,if (i > a || j > b) => if (2 < 3 || 2 == 2),不成立。
data[3][2] = 空值。