👉博__主👈:米碼收割機
👉技__能👈:C++/Python語言
👉專__注👈:專注主流機器人、人工智能等相關領域的開發、測試技術。
【C語言】C語言 食堂自動化管理系統(源碼+數據文件)【獨一無二】
目錄
- 【C語言】C語言 食堂自動化管理系統(源碼+數據文件)【獨一無二】
- 一、設計要求
- 二、設計思路
- 1. 系統概述
- 2. 數據結構設計
- 3. 文件操作模塊
- 4. 輔助函數設計
- 5. 管理員模塊設計
- 6. 學生模塊設計
- 7. 主函數流程
- 8. 總結
- 三、可視化分析
一、設計要求
編寫一份食堂自動化管理系統,實現學生就餐卡管理和菜品管理以及消費記錄統計等相關功能。所有數據包括學生就餐卡信息,菜品信息等都要利用文件系統保存,以備系統下次運行時使用。通過此課題,熟練掌握文件、數組、指針的各種操作,以及一些基本算法的應用。
(1)學生就餐卡和菜品數據是由多條數據記錄構成,其信息包括:學生就餐卡:卡號,姓名,余額,狀態(正常和掛失。)食堂菜品數據:編號 名稱 金額 消費次數
(2)數據保存形式:所有就餐卡信息,菜品信息數據要以文本或二進制文件保存。
(3)需要實現的功能代碼要能提供以下兩個基本模塊。
管理員模塊:管理員以密碼登錄系統,可以完成以下功能
A. 注冊學生就餐卡
B.就餐卡的充值掛失模塊
C.食堂菜單管理功能,包括對菜單的增刪修改查等功能。
D.統計功能:統計菜品銷售情況(銷售排行),以及學生卡的使用情況(選做)
學生模塊:以就餐卡號登錄系統(說明:卡處于掛失,則拒絕登錄。)
可以查詢卡中余額。
可以查詢本卡的消費記錄(選做)
可以瀏覽菜品并按照金額購買
(4)界面功能要求
- 采用友好的字符界面,實現一個功能控制菜單。
- 每次操作都從該菜單選擇,利用循環結構使得一次運行程序可進行多次操作。
選做要求:
(1)數據完整性保證。例如:就餐卡號和菜單編號不得重復。
(2)學生每次消費可以自動生成消費記錄(卡號,購買時間,購買菜品編號,購買金額)。
該消費記錄表永久保存,用于事后查詢和統計。具體請學生自己構思、設計。
二、設計思路
1. 系統概述
本系統為食堂自動化管理系統,主要涉及兩個角色:
- 管理員模塊:負責管理學生就餐卡、食堂菜品(增、刪、改、查)以及統計菜品銷售情況。
- 學生模塊:學生通過就餐卡登錄后可以查詢余額、瀏覽菜品、進行菜品購買以及查詢自己的消費記錄。
所有數據(學生就餐卡、菜品、消費記錄)均存儲于文本文件中,以保證程序退出后數據的持久性。
2. 數據結構設計
系統采用結構體來表示學生、菜品和消費記錄,定義了三個主要數據結構:
-
學生結構體 Student
存放就餐卡號、學生姓名、卡內余額以及卡片狀態(正常/掛失)。typedef struct {char cardNumber[20]; // 就餐卡號(唯一標識)char name[50]; // 學生姓名double balance; // 卡內余額int status; // 狀態:0 正常,1 掛失 } Student;
-
菜品結構體 Dish
保存菜品編號、名稱、價格和銷售次數。typedef struct {char id[20]; // 菜品編號(唯一標識)char name[50]; // 菜品名稱double price; // 菜品價格int sales; // 銷售次數 } Dish;
-
消費記錄結構體 Record
用于記錄每次消費的就餐卡號、購買菜品編號、消費金額及時間記錄。typedef struct {char cardNumber[20]; // 消費卡號char dishId[20]; // 菜品編號double price; // 消費金額char timeStr[30]; // 購買時間,格式:YYYY-MM-DD_HH:MM:SS } Record;
同時全局定義數組存儲這些數據,并用計數變量記錄當前數量,這樣在內存中可以進行查找和操作。
3. 文件操作模塊
為了保證數據持久化,每種數據都對應一個文本文件,分別為:
- 學生就餐卡 ——
student_cards.txt
- 菜品信息 ——
dishes.txt
- 消費記錄 ——
records.txt
加載函數(例如 loadStudents()
、loadDishes()
、loadRecords()
)在程序啟動時讀取文件內容到全局數組;保存函數(例如 saveStudents()
、saveDishes()
、saveRecords()
)在數據發生修改后寫回文件。
例如,加載學生數據的代碼塊如下:
void loadStudents(void)
{FILE *fp = fopen(STUDENT_FILE, "r");if (fp == NULL){studentCount = 0;return;}studentCount = 0;while (fscanf(fp, "%s %s %lf %d", students[studentCount].cardNumber,students[studentCount].name,&students[studentCount].balance,&students[studentCount].status) == 4){studentCount++;if (studentCount >= MAX_STUDENTS)break;}fclose(fp);
}
4. 輔助函數設計
為了提高代碼的模塊化和可復用性,還設計了一些輔助函數,例如:
clearInputBuffer()
:用于清除輸入緩沖區,避免由于換行符等殘留字符導致輸入錯誤。getCurrentTimeString()
:獲取當前系統時間,并將時間格式化為YYYY-MM-DD_HH:MM:SS
字符串,便于記錄消費時間。
5. 管理員模塊設計
管理員模塊需要輸入密碼驗證后才能進入,常用的功能有:
-
注冊學生就餐卡
檢查卡號是否重復,若不重復則新建卡片并初始化余額、狀態(正常)。void registerStudent(void) {//// 代碼太多了,只講講思路吧!!!//// 輸入卡號、姓名和初始余額// 調用 findStudentIndexByCard() 檢查卡號唯一性...// 將數據存入 students 數組,并保存到文件 }
-
就餐卡充值/掛失
根據操作類型,能夠對指定卡號進行充值或掛失,充值時增加余額,掛失時設置狀態為掛失。void rechargeOrReport(void) {//// 代碼太多了,只講講思路吧!!!//// 根據用戶選擇判斷充值或掛失操作// 對輸入的卡號進行查找,若存在則進行相應處理,再保存數據 }
-
菜品管理
包括菜品增加、刪除、修改和查詢功能:- 增加菜品:要求菜品編號不重復,銷售次數初始化為0。
- 刪除菜品:根據菜品編號查找并刪除,采用“用最后一項覆蓋刪除項”的方法。
- 修改菜品:修改指定菜品的名稱和價格。
- 查詢菜品:遍歷并打印當前所有菜品信息。
void addDish(void) {// 檢查菜品編號,輸入名稱、價格后存儲菜品信息 }
-
統計功能
統計菜品銷售情況,并按照銷售次數從高到低排序后打印銷售排行榜。void statistics(void) {//// 代碼太多了,只講講思路吧!!!//// 拷貝菜品數據到臨時數組,使用冒泡排序算法對銷售次數降序排序// 打印排行數據 }
管理員模塊的主界面函數 adminMenu()
集成了以上所有操作,用戶在驗證管理員密碼后可選擇對應的功能。
6. 學生模塊設計
學生模塊主要通過就餐卡號登錄,允許的操作包括:
-
查詢余額
每個學生可以查詢自己卡中余額,直接讀取全局數組中對應學生的數據即可。void studentQueryBalance(int studentIndex) {//// 代碼太多了,只講講思路吧!!!//printf("當前余額為:%.2lf\n", students[studentIndex].balance); }
-
瀏覽菜品
遍歷全局菜品數組,將菜品編號、名稱、價格和銷售次數顯示,方便學生選擇。void studentBrowseDishes(void) {//// 代碼太多了,只講講思路吧!!!//// 打印所有菜品詳細信息 }
-
購買菜品
根據學生輸入的菜品編號,檢查菜品是否存在及余額是否足夠,若滿足條件則:- 扣除學生余額
- 增加對應菜品的銷售次數
- 生成消費記錄(記錄時間,通過
getCurrentTimeString()
獲取當前時間) - 保存相關數據到文本文件
void studentPurchase(int studentIndex) {// 查詢菜品,檢查余額,扣費,增加銷售次數并記錄消費時間 }
-
查詢消費記錄
通過卡號遍歷消費記錄數組,篩選出屬于當前就餐卡的記錄并打印出來。void studentQueryRecords(const char *cardNumber) {//// 代碼太多了,只講講思路吧!!!//// 遍歷 records 數組,匹配卡號后打印消費記錄 }
學生模塊的主界面函數 studentMenu()
封裝了上述操作,使得學生在登錄后可以方便地通過菜單選項進行操作。
7. 主函數流程
主函數 main()
作為程序入口主要完成以下工作:
-
數據加載
調用loadStudents()
、loadDishes()
、loadRecords()
從文本文件加載數據到內存。 -
主菜單顯示
用戶可選擇進入管理員模塊或學生模塊,或退出系統:- 當選擇學生模塊時,根據輸入的就餐卡號查找對應學生,并判斷卡是否處于掛失狀態。
- 根據用戶操作進入相應的子模塊。
-
保存數據
在程序退出前,再次調用保存函數確保所有數據更新寫入文件。int main(void) {// 加載數據loadStudents();loadDishes();loadRecords();// 主菜單循環do {// 顯示菜單、獲取用戶選擇// 根據選擇調用 adminMenu() 或 studentMenu()} while(choice != 0);// 退出前保存各數據文件saveStudents();saveDishes();saveRecords();return 0; }
8. 總結
該系統通過模塊化設計將不同功能進行分離,采用結構體和全局數組存儲實體數據,并利用文本文件實現數據的持久化,使得數據在程序退出后仍能保留。管理員模塊和學生模塊的劃分清晰,通過輔助函數(如輸入緩沖區清理、當前時間獲取)提高了代碼的健壯性。同時,代碼中通過查找函數(如 findStudentIndexByCard()
和 findDishIndexById()
)實現了數據項的快速定位,從而支持各項操作的快速響應。
三、可視化分析