需求拆解
- 數據實體:宿舍 (樓號、房間號、面積、住學生班級、人數)
- 功能模塊:文件管理、增刪改查、統計、排序
數據結構設計
#define MAX_DORM 1000
#define MAX_CLASS 50
typedef struct {
int building; // 樓號
int room; // 房間號
float area; // 面積
char class_name[30]; // 學生班級
int count; // 人數
} Dormitory;
Dormitory dorms[MAX_DORM];
int dorm_cnt = 0;
核心功能實現骨架
1. 文件持久化
void load_data() { FILE *fp=fopen("dorm.dat","rb"); if(fp){ fread(&dorm_cnt,4,1,fp); fread(dorms,sizeof(Dormitory),dorm_cnt,fp); fclose(fp); } }
void save_data() { FILE *fp=fopen("dorm.dat","wb"); if(fp){ fwrite(&dorm_cnt,4,1,fp); fwrite(dorms,sizeof(Dormitory),dorm_cnt,fp); fclose(fp); } }
2. 菜單驅動主循環
void menu() {
printf("\n1.添加 2.顯示 3.查詢 4.修改 5.刪除 6.統計 7.排序 0.退出\n選擇: ");
int opt; scanf("%d",&opt);
switch(opt){
case 1: add(); break;
case 2: show_all(); break;
case 3: query(); break;
case 4: modify(); break;
case 5: delete(); break;
case 6: statistics(); break;
case 7: sort(); break;
case 0: save_data(); exit(0);
}
}
3. 關鍵操作示例
- 添加:檢查房間號唯一性 → 讀取字段 →
dorms[dorm_cnt++] = new_dorm;
- 查詢:按樓號/房間號/班級/人數範圍篩選輸出。
- 統計:遍歷累加總人數、平均面積;按班級分組統計人數分布(可用鏈表/動態數組存儲分組結果)。
- 排序:
qsort(dorms, dorm_cnt, sizeof(Dormitory), cmp_by_count) 或按面積、樓號排序。
進階建議
- 鏈表替換數組:支持動態擴容、插入刪除 O(1)。
- 索引優化:建立樓號→宿舍列表映射 (哈希表/多級數組) 加速查詢。
- 界面:ncurses 實現文本界面 (TUI),或導出 CSV 供 Excel 分析。
- 測試:邊界值 (空文件、滿容量、重複鍵)、持久化斷電恢復。