首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言通訊錄系統完整實作:模組化設計、檔案操作與選單驅動

     編輯:關於C

系統架構設計

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;
}

執行畫面示例

主選單 新增聯繫人 顯示所有 查詢聯繫人 修改聯繫人

關鍵設計亮點

進階擴充方向

  1. 檔案持久化:fwrite/fread 二進位存取或 CSV 文字格式
  2. 動態記憶體:realloc 突破 MAX_PEO 限制
  3. 多欄位查詢:電話/地址模糊搜尋
  4. 排序功能:按姓名/年齡排序顯示 (qsort)
  5. 資料驗證:電話格式、年齡範圍、Email 正則

結語

這個通訊錄系統展示了 C 語言模組化程式設計的教科書級範例:介面與實作分離、常數集中管理、安全輸入處理、核心邏輯複用、選單驅動架構。掌握此架構模式,即能快速建構各類資料管理類控制台應用,並為後續學習資料結構 (鏈結串列、樹、雜湊表) 替換底層儲存奠定堅實基礎。

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