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

C++ 科研管理系統原始碼:以鏈表實作通訊錄為基礎擴充

     編輯:程式設計疑難解答

需求:科研專案屬性增刪改查統計。可參考「鏈表通訊錄」架構擴充:將節點結構改為科研專案欄位,並加入檔案持久化、查詢索引、統計報表。

核心結構體擴充

struct Project {
    char id[20];           // 專案編號
    char name[50];         // 專案名稱
    char leader[20];       // 負責人
    double budget;         // 經費
    int startYear, endYear; // 起訖年份
    char status[10];       // 進行中/結案/延期
    Project* next;
};

基本操作函數原型

void addProject(Project** head);
void delProject(Project** head, const char* id);
void modifyProject(Project* head, const char* id);
Project* findProject(Project* head, const char* id);
void listProjects(Project* head);
void statByYear(Project* head, int year);
void saveToFile(Project* head, const char* filename);
void loadFromFile(Project** head, const char* filename);

關鍵實作要點

  1. 唯一性檢查:新增時遍歷鏈表確認 id 不重複。
  2. 檔案存取:fwrite/fread 整個結構體,或用 CSV/JSON 方便人工閱讀。
  3. 統計功能:遍歷鏈表累加經費、計數,依 status、year 分組。
  4. 記憶體管理:程式結束前遞迴 free 所有節點,防洩漏。
  5. 介面:主選單 switch 迴圈,輸入選項呼叫對應函數。

完整可執行範例 (精簡版)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Project { ... }; // 如上

void addProject(Project** head) {
    Project* p = (Project*)malloc(sizeof(Project));
    printf("編號: "); scanf("%19s", p->id);
    // 檢查重複
    for (Project* cur = *head; cur; cur = cur->next)
        if (strcmp(cur->id, p->id) == 0) { puts("編號重複"); free(p); return; }
    printf("名稱: "); scanf("%49s", p->name);
    printf("負責人: "); scanf("%19s", p->leader);
    printf("經費: "); scanf("%lf", &p->budget);
    printf("起始年份: "); scanf("%d", &p->startYear);
    printf("結束年份: "); scanf("%d", &p->endYear);
    strcpy(p->status, "進行中");
    p->next = *head;
    *head = p;
    puts("新增成功");
}

// 其他函數同理...

int main() {
    Project* head = NULL;
    loadFromFile(&head, "projects.dat");
    int opt;
    while (1) {
        puts("\n1.新增 2.刪除 3.修改 4.查詢 5.列表 6.統計 7.存檔 0.退出");
        scanf("%d", &opt);
        if (opt == 0) break;
        switch (opt) {
            case 1: addProject(&head); break;
            case 2: { char id[20]; scanf("%19s", id); delProject(&head, id); } break;
            case 3: { char id[20]; scanf("%19s", id); modifyProject(head, id); } break;
            case 4: { char id[20]; scanf("%19s", id); Project* p=findProject(head,id); if(p) printf("找到: %s\n",p->name); else puts("不存在"); } break;
            case 5: listProjects(head); break;
            case 6: { int y; scanf("%d",&y); statByYear(head,y); } break;
            case 7: saveToFile(head,"projects.dat"); puts("已存檔"); break;
        }
    }
    saveToFile(head,"projects.dat");
    // 釋放記憶體略
    return 0;
}

進階建議

  • 改用 SQLite 替代鏈表+二進制檔,支援 SQL 查詢、索引、交易,程式碼更簡潔健壯。
  • 若需 GUI,採用 Qt + QSqlTableModel 幾百行即可完成專業介面。
  • 版本控制:Git 管理原始碼,Release 打包發行。

以鏈表通訊錄為骨架,替換資料欄位並擴充統計/持久化,即可快速產出符合需求的科研管理系統原型。

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