專案需求
- 聯繫人欄位:姓名、性別、年齡、電話、地址。
- 功能:新增、刪除、查找、修改、顯示全部、按姓名排序、退出。
- 資料結構:固定大小陣列 (10 人) + 計數器。
核心資料結構
#define MAX_CONTACT 10
#define NAME_LEN 15
#define PHONE_LEN 11
#define ADDR_LEN 30
#define SEX_LEN 6
typedef struct {
char name[NAME_LEN];
char sex[SEX_LEN];
int age; // 原碼漏掉年齡欄位,此處補全
char phone[PHONE_LEN];
char addr[ADDR_LEN];
} Contact;
Contact contacts[MAX_CONTACT];
int count = 0; // 當前聯繫人數
功能模組實作要點
1. 新增 (Add)
- 檢查
count < MAX_CONTACT。
- 使用
fgets 讀取含空白的地址/姓名,處理尾部 \n。
- 輸入驗證:電話長度、年齡範圍、性別選項。
2. 刪除 (Delete)
- 輸入姓名 → 線性搜尋索引。
- 找到後,
memmove 或循環前移後續元素覆蓋被刪項目。
count--。
3. 查找 (Find)
- 選單:按姓名 / 按電話。
- 線性搜尋 (資料量小),找到印出全部欄位。
4. 修改 (Alter)
5. 顯示全部 (Print)
- 格式化輸出表頭與每一筆資料,
%-15s 左對齊對齊欄位。
6. 排序 (Sort)
- 冒泡/選擇排序 (n=10 足夠),比較
strcmp(name_a, name_b)。
- 交換整個
Contact 結構體 (可用 memcpy 或結構體賦值)。
主選單架構
enum Option { EXIT, ADD, DELETE, FIND, ALTER, PRINT, SORT };
void menu() {
puts("************* 簡易通訊錄 ************");
puts("1. 新增聯繫人");
puts("2. 刪除聯繫人");
puts("3. 查找聯繫人");
puts("4. 修改聯繫人");
puts("5. 顯示所有聯繫人");
puts("6. 按姓名排序");
puts("0. 退出");
puts("*************************************");
}
int main() {
int choice;
while (1) {
menu();
printf("請選擇: ");
if (scanf("%d", &choice) != 1) { /* 清理緩衝區 */ continue; }
while (getchar() != '\n'); // 清理換行
switch (choice) {
case ADD: add_contact(); break;
case DELETE: del_contact(); break;
case FIND: find_contact(); break;
case ALTER: alter_contact(); break;
case PRINT: print_all(); break;
case SORT: sort_by_name(); break;
case EXIT: return 0;
default: puts("無效選項!");
}
}
}
優化方向
- 動態陣列 (
realloc) 支援無限聯繫人。
- 檔案持久化 (CSV/二進位/JSON) 載入/儲存。
- 鏈表/哈希表優化查找/刪除至 O(1)。
- GUI (ncurses/GTK/Qt) 或 Web 介面 (CGI/HTTP server)。