原內容來自 2006 年南開大學上機考試題庫,涵蓋一維陣列、二維陣列、字串、指標、結構體、鏈結串列等核心考點,共 35 題,是 C 語言陣列操作與演算法思維的經典訓練集。
| 類別 | 題號 | 核心考點 | 關鍵技術 |
|---|---|---|---|
| 一維陣列統計/篩選 | 1, 2, 3, 27 | 平均值篩選、條件篩選、因數查找、7/11 整除 | 陣列遍歷、計數器、模運算 |
| 4, 29 | 字母頻率統計、奇數位大寫轉換 | ctype.h、ASCII 碼運算、字串遍歷 | |
| 20, 30 | 素數篩選、二維陣列最大值 | 試除法素數判定、巢狀迴圈 | |
| 字串操作 | 5, 17, 19, 21, 31, 32, 33, 35, 36 | 字串反轉、刪除指定字元、ASCII 碼排序、回文判斷、字串轉整數、比較長度、前導/尾部星號處理、刪除空格 | 指標遍歷、雙指標、strlen/strcpy、isalpha/isdigit |
| 24, 25 | 字串轉長整數、比較字串長度(不得用庫函數) | 手寫 atoi/strlen、指標算術 | |
| 二維陣列/矩陣 | 11, 12, 13, 14, 18, 30 | 左下三角歸零、周邊平均/求和、每列最小值、矩陣轉置、2×M 最大值 | 索引邊界控制、i,j 關係、對角線判斷 |
| 8, 9, 10, 26 | 級數求和、組合數、迭代法解方程、π 級數逼近 | 累加器、階乘遞推、牛頓迭代/定點迭代、級數收斂判斷 | |
| 進階資料結構 | 15, 16 | 緊鄰素數、保留兩位小數四捨五入 | 素數生成、定點運算技巧 |
| 22, 23, 28, 34 | 鏈結串列最大值、回文判斷、一維陣列最大值索引、結構體陣列最高分統計 | 鏈結串列遍歷、指標操作、結構體陣列 |
// 正確版:修正原答案邊界與型別
int fun(int score[], int m, int below[]) {
if (m <= 0) return 0;
long sum = 0; // 防止加總溢位
for (int i = 0; i < m; ++i) sum += score[i];
int avg = sum / m;
int k = 0;
for (int i = 0; i < m; ++i) {
if (score[i] < avg) below[k++] = score[i];
}
return k;
}
cos(x) - x = 0(數值分析經典)
#include <math.h>
float fun() {
float x1 = 0.0f, x0;
do {
x0 = x1;
x1 = cosf(x0); // 單精度版本
} while (fabsf(x0 - x1) > 1e-6f);
return x1; // 約 0.739085
}
收斂條件:|x_{n+1} - x_n| < ε,此處固定點迭代 x = cos(x) 在 [0,1] 收斂。
void transpose(int a[3][3]) {
for (int i = 0; i < 3; ++i)
for (int j = i + 1; j < 3; ++j) { // 只遍歷上三角,避免重複交換
int tmp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = tmp;
}
}
/*
π/2 = 1 + 1/3 + (1×2)/(3×5) + (1×2×3)/(3×5×7) + ...
項遞推:t_n = t_{n-1} * n/(2n+1)
*/
double compute_pi(double eps) {
double sum = 1.0, term = 1.0;
for (int n = 1; fabs(term) >= eps; ++n) {
sum += term;
term *= (double)n / (2 * n + 1);
}
return sum * 2;
}
typedef struct { int id; int score; } Student;
int top_students(Student *a, Student *b, int n) {
if (n <= 0) return 0;
int max_score = a[0].score;
for (int i = 1; i < n; ++i)
if (a[i].score > max_score) max_score = a[i].score;
int k = 0;
for (int i = 0; i < n; ++i)
if (a[i].score == max_score) b[k++] = a[i];
return k;
}
| 題號 | 原答案問題 | 修正要點 |
|---|---|---|
| 4 | case 'n': pp[12]++; 重複,漏 'm' | 完整 26 個 case,或用 pp[ch-'a']++ |
| 7 | for(i=0;i<t;i++) 應 i<t,I vs i 混淆 | 統一小寫 i,邊界 i<n |
| 11 | for(j=0;j<=I;j++) 應 j<=i(左下含對角線) | 左下三角:j <= i |
| 18 | for(j=0;j<I,j++) 逗號運算子錯誤 | j < i 只交換上三角 |
| 20 | 素數判定邏輯錯誤,j>=i 條件錯置 | 試除至 sqrt(i),旗標法 |
| 22 | 鏈結串列 do-while 缺少 q=q->next 更新 | 標準遍歷模式 |
| 24 | 字串轉整數算法效率低(重複乘 10) | 霍納法則:result = result*10 + (ch-'0') |
| 37 | 結構體 p->s[i] 但定義未見 s 陣列 | 補全結構體定義 |
void* 版。qsort、bsearch、memmove 如何解決同類問題。C programming exam)這 35 題涵蓋了 C 語言陣列操作的 遍歷、統計、篩選、排序、矩陣運算、字串處理、指標技巧、數值計算、資料結構雛形 等核心能力。系統性完成並深度理解每題的邊界條件、演算法複雜度、標準庫替代方案,可構建扎實的 C 語言工程基礎。