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

C語言職工管理系統重構指南:從教學代碼到工程級項目

     編輯:C 語言問答

原代碼核心問題清單

  1. 結構體設計缺陷:char sex; 只能存一字符,實際需字符串 char sex[4];同理 degree、position、address、phone 均需數組;
  2. 全局變量濫用:struct employee emp[80]; 污染全局命名空間,應封裝在模塊內;
  3. 輸入處理災難:scanf("%s", &employee[i].name) 多取址、無長度限制、緩衝區殘留換行符導致死循環;
  4. 排序實現低效:冒泡排序逐字段 strcpy,應整結構體交換或建立索引數組;
  5. 刪除/查詢邏輯錯誤:使用未定義的 stud 變量,字段不匹配;
  6. 修改功能參數混亂:char s[20], s, m; 重複定義,switch(s) 應為 switch(c) 且 case 標簽缺單引號。

重構版核心架構


// employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H

typedef struct {
    char name[32];
    char sex[8];
    int birthday;      // 建議用 time_t 或 yyyymmdd int
    int work_year;
    char degree[16];
    char position[32];
    char address[64];
    char phone[16];
} Employee;

typedef struct {
    Employee* data;
    size_t size;
    size_t capacity;
} EmpSystem;

// 介面函數
EmpSystem* sys_create(size_t init_cap);
void sys_destroy(EmpSystem* sys);
bool sys_add(EmpSystem* sys, const Employee* e);
bool sys_del_by_name(EmpSystem* sys, const char* name);
Employee* sys_find_by_name(const EmpSystem* sys, const char* name);
void sys_sort_by_name(EmpSystem* sys);
void sys_print_all(const EmpSystem* sys);
bool sys_save(const EmpSystem* sys, const char* filepath);
bool sys_load(EmpSystem* sys, const char* filepath);

#endif

關鍵改進點

  • 動態數組替換定長數組:支持任意數量員工,自動擴容;
  • 整結構體交換排序:Employee tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; 一次性搞定所有字段;
  • 輸入統一用 fgets + 解析:徹底解決緩衝區殘留、長度溢出、空格處理;
  • 持久化層分離:sys_save/load 實現 CSV/二進制/JSON 多格式,業務邏輯零感知;
  • 錯誤碼統一:所有介面返回 bool,詳細錯誤輸出到 stderr。

編譯構建


# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(EmpSys C)
set(CMAKE_C_STANDARD 11)
add_executable(emp_sys main.c employee.c)
target_compile_options(emp_sys PRIVATE -Wall -Wextra -Wpedantic -Werror -fsanitize=address,undefined)

給初學者的遺囑

教學代碼的價值在於「跑通流程」,工程代碼的價值在於「可維護、可擴展、可測試」。別停在第一步,嘗試重寫、模塊化、加測試、上 CI,這才是從學生到工程師的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved