觀念題
以 C 語言命題
出題方式:
程式填空
int a, b;
int p[] = ____;
a = b = p[0];
for (int i = 0; i < 10; i++) {
if (p[i] > a) {
b = a;
a = p[i];
} else if (p[i] > b) {
b = p[i];
}
}
printf("%d\n", b);
_ _ _ _ 填入哪個輸入會錯 ?
{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
{5, 4, 7, 6, 1, 3, 2, 9, 0, 8}
{0, 8, 7, 6, 5, 4, 3, 2, 1, 9}
程式除錯
int sum(int n) {
if (n == 1)
return 1;
return n * (n - 1) + sum(n - 1);
}
int main() {
sum(10);
}
想要計算 1 * 2 + 2 * 3 + 3 * 4 + … + 9 * 10 如何除錯?
第 2 行要改成 return 0
第 3 行要改成 return (n - 1) * n + sum(n - 1);
第 1 行要改成 if (n == 2)
出題內容:
資料型態
int a = 7, b = 3;
float w = a / 2 / b * 1.0;
float x = a / b / 2.0;
float y = a / 2 / b;
float z = 1.0 * a / 2 / b
w, x, y, z 哪個不同?
w
x
y
z
視域
int a = 30;
void b() {
int a = 20;
}
int main() {
int a = 10;
b();
printf ("%d ", a);
}
printf ("%d", a) 輸出什麼?
30
10
20
if-else
int f(char s[], int n) {
char t[1000];
int j = 0;
for (int i = 0; i < n; i++, j += 2) {
if (s[i] == '0') {
t[j] = 'w';
t[j + 1] = 'a';
} else if ( __A__ || __B__ ){
t[j] = 't';
t[j + 1] = 'e';
} else if (s[i] == '3' || s[i] == '5') {
t[j] = 'd';
t[j + 1] = 'o';
} else if (s[i] == '4' || s[i] == '6') {
t[j] = 'p';
t[j + 1] = 'u';
} else {
t[j] = ' ';
j = j - 1;
}
}
t[j] = '\0';
printf("%s ", t);
}
int main() {
char s[] = "0328675";
f(s, 8);
}
輸出結果為 "wadote putedo __A__ __B__ 分別是什麼?
0 7
2 7
3 6
8 5
switch
int main(){
char c = 'a';
switch(c){
case 'a':
printf("a");
case 'b':
printf("b");
case 'c':
printf("c");
default:
printf("d");
}
}
輸出什麼?
a
d
abc
abcd
for
for (int i = 0; i < 8; i++) {
for (int j = 0; ____; j++)
printf("%d ", (i + j) % 2);
printf("\n");
}
結果:
1
0 1
1 0 1
0 1 0 1
1 0 1 0 1
0 1 0 1 0 1
1 0 1 0 1 0 1
____ 應該要填入 ?
j <= i
j < i
j >= i
j > i
while
int f(int n) {
if (n > 10)
n = n + 5;
while (n < 12)
n = n + 1;
if (n == 14)
n = 5;
return n;
}
詢問 f(n) 不可能會回傳什麼數值
15
16
17
18
陣列
int a[3][3] = {};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j)
a[i][j] = i + j;
else
a[i][j] = 0;
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
printf("%d ", a[j][i]);
printf("\n");
}
輸出結果 ?
0 0 0 0 2 0 0 0 4
0 1 2 3 0 0 0 0 4
1 0 0 0 2 0 0 0 4
ASCII
void f(char *s) {
char mp[] = "IEFGHDJKLMNOPCRSTUVWXYZABQ";
int len = strlen(s);
for (int i = 0; i < len; i++) {
int c = s[i] - 'A';
printf("%c", mp[c]);
}
}
輸出結果為 FIHVIU ,請問 s 應該是什麼?
CAERAQ
AEIURQ
FHIJRA
BCAQAD
指標
int f(int *a, int *b);
int g(int *a, int *b);
int main(){
int a = 2, b = 5;
int x = f(&a, &b);
printf("%d %d %d", x, a, b);
}
int f(int *a, int *b){
int c = 10;
*a = *a + *b / 5;
int p = g(b, a) % 2;
if (p % 2 == 0){
return *b - p;
} else {
return *b + p;
}
}
int g(int *a, int *b){
return (*a - *b) * 5 + 2;
}
輸出 ?
5 3 5
10 2 5
3 5 5
遞迴
int p(int n, int k) {
if (k == 0)
return 1;
else if (k == 1)
return n;
else
return n * p(n - 1, k - 1);
}
p(5,4) = ?
50
18
20
120
數學
int x = 0;
for (int i = 1; i <= 8; i++)
for (int j = 1; j <= i; j++)
for (int k = 1; k <= j; k++)
x += 1;
printf("%d", x)
輸出 ?
88
60
120
240
資料結構
int level = 1;
for (int i=0; i<6; i++){
if (empty()){
push(level);
level = level + 1;
} else if (rand() % 2 == 0){
printf("%d ", top());
pop();
level = level - 1;
} else {
push(level);
level = level + 1;
}
}
while (!empty()){
printf("%d ", top());
pop();
}
找出不可能的輸出結果
1 2 3 4 5 6
1 2 3
1 2 5
2 3 4
演算法
void f(int x) {
int a[] = {0, 2, 15, 20, 25, 30}, i = 0, j = 6;
do {
int m = (i + j) / 2;
if (a[m] == x)
break;
if (a[m] < x)
i = m;
else
j = m;
} while (i + 1 < j);
}
問 func(3), func(15), func(4) int m = (i + j) / 2 執行了幾次 ?
7
9
10
12
複雜度
// 程式1
double f(int n) { // O(n)
double acc = 1, ret = 0;
for (int i = 1; i <= n; i++) {
acc = acc * i;
ret += 1 / acc;
}
return ret;
}
// 程式2
double q(int n) { // O(n)
double ret = 1;
for (int i = 1; i <= n; i++)
ret = ret * i;
return ret;
}
double g(int n) { // O(n2)
double ret = 0;;
for (int i = 1; i <= n; i++) {
ret += q(i); // O(n)
}
return ret;
}
哪個跑得快
f()
g()
Last updated
Was this helpful?