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

C語言進階實戰:結構體指標陣列實現薪資統計系統

     編輯:關於C語言

專案目標

設計公司職員資料結構,使用結構體指標陣列儲存員工資訊,實現薪資總額與平均薪資統計,支援全員與特定年齡區間查詢。核心知識點:struct、指標陣列、enum、動態記憶體、選單驅動架構。

資料結構定義

#define EMP_NUM 10

typedef struct employee {
    int age;
    char name[20];
    unsigned salary;
} *PEMP;  // PEMP 為結構體指標類型別名

typedef enum { TOTAL, AVERAGE } sel_c;  // 統計模式枚舉

系統架構

  • PEMP company[EMP_NUM]:結構體指標陣列,每個元素指向一個動態分配的員工節點
  • 主選單迴圈:更新資訊 / 薪資求和 / 薪資平均 / 顯示資訊 / 退出
  • 模組化函式:update_msg、salary_analysis、display_msg

核心模組實現

員工資訊錄入(含驗證)

void update_msg(PEMP company[]) {
    while (1) {
        PEMP new_emp = (PEMP)malloc(sizeof(*new_emp));
        int id;
        printf("請輸入員工資訊 (ID=-1 退出):\nID: ");
        scanf("%d", &id);
        while (id < -1 || id >= EMP_NUM) {
            printf("ID 範圍 0~%d,重新輸入: ", EMP_NUM-1);
            scanf("%d", &id);
        }
        if (id == -1) { free(new_emp); return; }

        printf("姓名: "); scanf("%s", new_emp->name);
        printf("年齡: "); scanf("%d", &new_emp->age);
        while (new_emp->age < 0 || new_emp->age > 60) {
            printf("年齡 0~60,重新輸入: "); scanf("%d", &new_emp->age);
        }
        printf("薪水: "); scanf("%u", &new_emp->salary);
        while (new_emp->salary > 20000) {
            printf("薪水 0~20000,重新輸入: "); scanf("%u", &new_emp->salary);
        }
        company[id] = new_emp;  // 指定位置存入指標
    }
}

薪資統計核心邏輯

void salary_analysis(PEMP company[], sel_c which) {
    char sel;
    int age1, age2, low, high, i, count = 0;
    unsigned long sum = 0;

    while (1) {
        if (which == TOTAL)
            printf("1:區間薪資總和  2:全員薪資總和\n");
        else
            printf("1:區間薪資平均  2:全員薪資平均\n");
        printf("0:返回\n選擇: ");
        sel = getchar(); while (getchar()!='\n');  // 清緩衝區
        if (sel == '0') return;
        if (sel != '1' && sel != '2') continue;

        if (sel == '1') {
            printf("起始年齡: "); scanf("%d", &age1);
            printf("結束年齡: "); scanf("%d", &age2);
            low = (age1 < age2) ? age1 : age2;
            high = (age1 < age2) ? age2 : age1;
        }

        for (i = 0; i < EMP_NUM; i++) {
            if (company[i] &&
                (sel == '2' || (company[i]->age >= low && company[i]->age <= high))) {
                sum += company[i]->salary;
                count++;
            }
        }

        if (count == 0) printf("無符合員工!\n");
        else if (which == TOTAL)
            printf("薪資總和: %lu\n", sum);
        else
            printf("薪資平均: %lu\n", sum / count);
        return;  // 統計一次即返回主選單
    }
}

資訊顯示

void display_msg(PEMP company[]) {
    for (int i = 0; i < EMP_NUM; i++)
        if (company[i])
            printf("ID:%d  姓名:%s  年齡:%d  薪水:%u\n",
                   i, company[i]->name, company[i]->age, company[i]->salary);
}

主程式入口

int main() {
    PEMP company[EMP_NUM];
    memset(company, 0, sizeof(company));
    char select; sel_c which;

    do {
        printf("\n<-----薪資統計系統----->\n");
        printf("1:更新資訊  2:薪資求和  3:薪資平均  4:顯示資訊  0:退出\n選擇: ");
        select = getchar(); while (getchar()!='\n');
        switch (select) {
            case '1': update_msg(company); break;
            case '2': salary_analysis(company, TOTAL); break;
            case '3': salary_analysis(company, AVERAGE); break;
            case '4': display_msg(company); break;
        }
    } while (select != '0');
    return 0;
}

設計亮點與避坑指南

技術點應用細節注意事項
結構體指標陣列PEMP company[10] 存指標而非實體須 malloc 分配節點,用完 free
枚舉類型sel_c 替代魔術數字增強可讀性,編譯器可檢查
輸入驗證年齡/薪水/ID 範圍檢查防止非法資料破壞統計
靜態區域變數主選單中 static PEMP *list_head保持鏈表頭指標生命週期

擴展建議

  1. 加入員工編號唯一性檢查
  2. 實現薪資區間統計(如 5k-10k 人數)
  3. 引入檔案 I/O 持久化資料
  4. 使用鏈表替代固定大小陣列,支援動態擴容
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved