標準骨架
/* 1. 頭文件區:聲明外部依賴 */
#include
#include
#include
/* 2. 常量/類型/全局變量區(盡量少用全局) */
#define MAX_N 100
typedef struct { int x, y; } Point;
/* 3. 函數聲明區(模塊化關鍵) */
int read_data(Point* arr, int max_n);
void process_data(Point* arr, int n);
void print_result(const Point* arr, int n);
/* 4. 主函數:程序入口,只負責編排流程 */
int main(void) {
Point data[MAX_N];
int n = read_data(data, MAX_N); // 輸入
if (n <= 0) return 1;
process_data(data, n); // 處理
print_result(data, n); // 輸出
return 0;
}
/* 5. 函數定義區:各司其職 */
int read_data(Point* arr, int max_n) { ... }
void process_data(Point* arr, int n) { ... }
void print_result(const Point* arr, int n) { ... }
三階段詳細展開
階段一:數據錄入 (Input)
- 交互式:
scanf / fgets + 解析,務必檢查返回值;
- 文件讀取:
fopen / fread / fscanf,檢查 NULL;
- 命令行參數:
argc/argv,使用 getopt 解析;
- 網絡/管道:
read / recv,處理短讀/斷開。
階段二:解決問題 (Processing)
- 演算法核心:排序、查找、圖遍歷、動態規劃、位運算技巧;
- 數據結構選型:數組/鏈表/哈希表/堆/紅黑樹/Trie,按訪問模式選;
- 邊界與錯誤處理:空輸入、溢出、無解、資源耗盡,失敗要早、要快、要響亮。
階段三:結果輸出 (Output)
- 控制台:
printf 格式化,對齊、精度控制;
- 文件:
fprintf / fwrite,注意刷新 fflush;
- 返回碼:
return 0 成功,非零碼區分錯誤類型;
- 日誌:分級輸出 (DEBUG/INFO/WARN/ERROR) 到 stderr/syslog。
進階習慣
- 每個
.c 對應一個 .h,.h 只放聲明;
- 靜態函數用
static 限制作用域;
- 編譯旗標
-Wall -Wextra -Werror -fsanitize=address,undefined 養成肌肉記憶;
- 提交前跑
clang-format + cppcheck + 單元測試。