contact.h → 介面定義 (結構體、常數、函數宣告) contact.c → 核心邏輯實作 (增刪改查) main.c → 使用者介面 (選單、輸入輸出、流程控制)
// contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define NAME_LEN 10
#define SEX_LEN 6
#define TELE_LEN 12
#define ADDR_LEN 20
#define MAX_PEO 1000
typedef struct {
char name[NAME_LEN];
int age;
char sex[SEX_LEN];
char tele[TELE_LEN];
char addr[ADDR_LEN];
} Peo;
typedef struct {
Peo nb[MAX_PEO];
int count; // 有效聯繫人數
} Contact, *PContact;
// 函數宣告
void add_peo(PContact pc);
void del_peo(PContact pc);
void search(PContact pc);
void modify(PContact pc);
void show(PContact pc);
void clear(PContact pc);
#endif
// contact.c #include#include #include "contact.h" void add_peo(PContact pc) { if (pc->count >= MAX_PEO) { printf("通訊錄已滿!\n"); return; } Peo *p = &pc->nb[pc->count]; printf("請輸入姓名:"); scanf("%9s", p->name); printf("請輸入年齡:"); scanf("%d", &p->age); printf("請輸入性別:"); scanf("%5s", p->sex); printf("請輸入電話:"); scanf("%11s", p->tele); printf("請輸入地址:"); scanf("%19s", p->addr); pc->count++; printf("新增成功!\n"); } void show(PContact pc) { printf("%-10s %4s %-6s %-12s %-20s\n", "姓名", "年齡", "性別", "電話", "地址"); for (int i = 0; i < pc->count; i++) { Peo *p = &pc->nb[i]; printf("%-10s %4d %-6s %-12s %-20s\n", p->name, p->age, p->sex, p->tele, p->addr); } } // 關鍵輔助:按姓名查找索引 static int find_by_name(const char *name, PContact pc) { for (int i = 0; i < pc->count; i++) { if (strcmp(pc->nb[i].name, name) == 0) return i; } return -1; } void del_peo(PContact pc) { char name[NAME_LEN]; printf("請輸入要刪除的姓名:"); scanf("%9s", name); int idx = find_by_name(name, pc); if (idx == -1) { printf("查無此人!\n"); return; } // 後續元素前移覆蓋 for (int i = idx; i < pc->count - 1; i++) { pc->nb[i] = pc->nb[i + 1]; } pc->count--; printf("刪除成功!\n"); } void search(PContact pc) { char name[NAME_LEN]; printf("請輸入要查詢的姓名:"); scanf("%9s", name); int idx = find_by_name(name, pc); if (idx == -1) { printf("查無此人!\n"); return; } Peo *p = &pc->nb[idx]; printf("%-10s %4d %-6s %-12s %-20s\n", p->name, p->age, p->sex, p->tele, p->addr); } void modify(PContact pc) { char name[NAME_LEN]; printf("請輸入要修改的姓名:"); scanf("%9s", name); int idx = find_by_name(name, pc); if (idx == -1) { printf("查無此人!\n"); return; } Peo *p = &pc->nb[idx]; printf("請輸入新姓名:"); scanf("%9s", p->name); printf("請輸入新年齡:"); scanf("%d", &p->age); printf("請輸入新性別:"); scanf("%5s", p->sex); printf("請輸入新電話:"); scanf("%11s", p->tele); printf("請輸入新地址:"); scanf("%19s", p->addr); printf("修改成功!\n"); } void clear(PContact pc) { pc->count = 0; printf("通訊錄已清空!\n"); }
// main.c #include#include "contact.h" void print_menu() { puts("****************************"); puts("*** 1.新增 2.刪除 ***"); puts("*** 3.顯示 4.查詢 ***"); puts("*** 5.修改 6.清空 ***"); puts("*** 0.退出 ***"); puts("****************************"); } int main() { Contact con = {0}; // 零初始化 count=0 int input = -1; while (input != 0) { print_menu(); printf("請選擇: "); if (scanf("%d", &input) != 1) { // 處理非數字輸入 scanf("%*[^\n]"); // 清空緩衝區 continue; } switch (input) { case 1: add_peo(&con); break; case 2: del_peo(&con); break; case 3: show(&con); break; case 4: search(&con); break; case 5: modify(&con); break; case 6: clear(&con); break; case 0: printf("感謝使用,再見!\n"); break; default: printf("無效選項,請重新輸入!\n"); } // system("cls"); // Windows 清屏,Linux 用 system("clear") } return 0; }

| 設計點 | 實作細節 | 優勢 |
|---|---|---|
| 模組化分層 | .h/.c 分離、主程式僅調用介面 | 低耦合、易維護、可複用 |
| 常數集中管理 | #define 長度限制、最大容量 | 單點修改、防止魔術數字 |
| 輸入長度保護 | scanf("%9s", buf) 防緩衝區溢位 | 安全性、健壯性 |
| 查找邏輯複用 | 靜態 find_by_name 供刪/查/改共用 | DRY 原則、減少錯誤 |
| 陣列前移刪除 | O(n) 移動、保持陣列緊湊 | 簡單、無碎片、記憶體效率高 |
| 選單驅動迴圈 | while(input!=0) + switch | 清晰流程、易擴充功能 |