【C語言】C語言 食堂自動化管理系統(源碼+數據文件)【獨一無二】

請添加圖片描述


👉博__主👈:米碼收割機
👉技__能👈: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)學生每次消費可以自動生成消費記錄(卡號,購買時間,購買菜品編號,購買金額)。
該消費記錄表永久保存,用于事后查詢和統計。具體請學生自己構思、設計。

在這里插入圖片描述


二、設計思路

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. 管理員模塊設計

管理員模塊需要輸入密碼驗證后才能進入,常用的功能有:

  1. 注冊學生就餐卡
    檢查卡號是否重復,若不重復則新建卡片并初始化余額、狀態(正常)。

    void registerStudent(void)
    {//// 代碼太多了,只講講思路吧!!!//// 輸入卡號、姓名和初始余額// 調用 findStudentIndexByCard() 檢查卡號唯一性...// 將數據存入 students 數組,并保存到文件
    }
    
  2. 就餐卡充值/掛失
    根據操作類型,能夠對指定卡號進行充值或掛失,充值時增加余額,掛失時設置狀態為掛失。

    void rechargeOrReport(void)
    {//// 代碼太多了,只講講思路吧!!!//// 根據用戶選擇判斷充值或掛失操作// 對輸入的卡號進行查找,若存在則進行相應處理,再保存數據
    }
    
  3. 菜品管理
    包括菜品增加、刪除、修改和查詢功能:

    • 增加菜品:要求菜品編號不重復,銷售次數初始化為0。
    • 刪除菜品:根據菜品編號查找并刪除,采用“用最后一項覆蓋刪除項”的方法。
    • 修改菜品:修改指定菜品的名稱和價格。
    • 查詢菜品:遍歷并打印當前所有菜品信息。
    void addDish(void)
    {// 檢查菜品編號,輸入名稱、價格后存儲菜品信息
    }
    
  4. 統計功能
    統計菜品銷售情況,并按照銷售次數從高到低排序后打印銷售排行榜。

    void statistics(void)
    {//// 代碼太多了,只講講思路吧!!!//// 拷貝菜品數據到臨時數組,使用冒泡排序算法對銷售次數降序排序// 打印排行數據
    }
    

管理員模塊的主界面函數 adminMenu() 集成了以上所有操作,用戶在驗證管理員密碼后可選擇對應的功能。

在這里插入圖片描述

6. 學生模塊設計

學生模塊主要通過就餐卡號登錄,允許的操作包括:

  1. 查詢余額
    每個學生可以查詢自己卡中余額,直接讀取全局數組中對應學生的數據即可。

    void studentQueryBalance(int studentIndex)
    {//// 代碼太多了,只講講思路吧!!!//printf("當前余額為:%.2lf\n", students[studentIndex].balance);
    }
    
  2. 瀏覽菜品
    遍歷全局菜品數組,將菜品編號、名稱、價格和銷售次數顯示,方便學生選擇。

    void studentBrowseDishes(void)
    {//// 代碼太多了,只講講思路吧!!!//// 打印所有菜品詳細信息
    }
    
  3. 購買菜品
    根據學生輸入的菜品編號,檢查菜品是否存在及余額是否足夠,若滿足條件則:

    • 扣除學生余額
    • 增加對應菜品的銷售次數
    • 生成消費記錄(記錄時間,通過 getCurrentTimeString() 獲取當前時間)
    • 保存相關數據到文本文件
    void studentPurchase(int studentIndex)
    {// 查詢菜品,檢查余額,扣費,增加銷售次數并記錄消費時間
    }
    
  4. 查詢消費記錄
    通過卡號遍歷消費記錄數組,篩選出屬于當前就餐卡的記錄并打印出來。

    void studentQueryRecords(const char *cardNumber)
    {//// 代碼太多了,只講講思路吧!!!//// 遍歷 records 數組,匹配卡號后打印消費記錄
    }
    

學生模塊的主界面函數 studentMenu() 封裝了上述操作,使得學生在登錄后可以方便地通過菜單選項進行操作。

7. 主函數流程

主函數 main() 作為程序入口主要完成以下工作:

  1. 數據加載
    調用 loadStudents()loadDishes()loadRecords() 從文本文件加載數據到內存。

  2. 主菜單顯示
    用戶可選擇進入管理員模塊或學生模塊,或退出系統:

    • 當選擇學生模塊時,根據輸入的就餐卡號查找對應學生,并判斷卡是否處于掛失狀態。
    • 根據用戶操作進入相應的子模塊。
  3. 保存數據
    在程序退出前,再次調用保存函數確保所有數據更新寫入文件。

    int main(void)
    {// 加載數據loadStudents();loadDishes();loadRecords();// 主菜單循環do {// 顯示菜單、獲取用戶選擇// 根據選擇調用 adminMenu() 或 studentMenu()} while(choice != 0);// 退出前保存各數據文件saveStudents();saveDishes();saveRecords();return 0;
    }
    

在這里插入圖片描述

8. 總結

該系統通過模塊化設計將不同功能進行分離,采用結構體和全局數組存儲實體數據,并利用文本文件實現數據的持久化,使得數據在程序退出后仍能保留。管理員模塊和學生模塊的劃分清晰,通過輔助函數(如輸入緩沖區清理、當前時間獲取)提高了代碼的健壯性。同時,代碼中通過查找函數(如 findStudentIndexByCard()findDishIndexById())實現了數據項的快速定位,從而支持各項操作的快速響應。


三、可視化分析

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70332.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek是什么?兩種模型的對比?

最近DeepSeek的風也是很大,它也是很火,那么DeepSeek是什么呢? 什么是DeepSeek? DeepSeek是一家專注通用人工智能(AGI)的中國科技公司,主攻大模型研發與應用。DeepSeek-R1是其開源的推理模型&a…

【架構】分層架構 (Layered Architecture)

一、分層模型基礎理論 ![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/0365cf0bfa754229bdedca6b472bffc7.png 1. 核心定義 分層架構(Layered Architecture)模型是一種常見的軟件設計架構,它將軟件系統按照功能劃分為不同的層次,每個層次都有特定的職責和功能…

基于MATLAB的均勻面陣MUSIC算法DOA估計仿真

基于MATLAB的均勻面陣MUSIC算法DOA估計仿真 文章目錄 前言一、二維MUSIC算法原理二、二維MUSIC算法MATLAB仿真三、MATLAB源代碼總結 前言 \;\;\;\;\; 在波達角估計算法中,MUSIC 算法與ESPRIT算法屬于特征結構子空間算法,是波達角估計算法中的基石。在前面…

組學數據分析實操系列 |(四) 富集氣泡圖的繪制

前言:在上一篇中,我們介紹了利用Metascape零代碼實現富集分析,但是Metascape的富集分析結果是以柱狀圖的形式展示的。文章中更常使用的富集結果可視化方式是氣泡圖。氣泡圖可以通過氣泡的坐標、形狀、顏色、大小等來展示更加豐富的富集分析結果&#xff…

實現一個專注應用-后端開發(一)-搭建

搭建后端服務 搭建服務拆分下用戶服務 增加公共庫通用模塊 運行一下接入數據庫安裝Prisma增加prisma庫 redis增加redis服務 搭建服務 使用nestjs來做 這里是nestjs的網站Nestjs 安裝 nest npm i -g nestjs/cli創建一個項目 并在開發工具打開 nest new todonest new xx 是新…

C++17并行化加速STL算法——std::execution

C17 并行化STL算法 文章目錄 C17 并行化STL算法概念環境準備工具類 并行算法 - 使用并行算法 - 執行策略總覽選擇標準詳細介紹順序執行 seq并行化順序執行 par并行化亂序執行 par_unseq 并行算法 - 異常處理可以不使用并行算法并行算法 - 限制并行算法有哪些原有算法17引入新算…

Deepseek 懟CHATGPT實況

提示詞: 用犀利的語言批評ChatGPT 深度思考(R1) 嗯,用戶讓我用犀利的語言批評ChatGPT。首先,我需要理解他們的動機。可能他們遇到了ChatGPT的某些問題,比如回答不準確或者缺乏深度,所以想表達不滿。也有…

always和assign語法區別

always語句可以帶時鐘, 也可以不帶時鐘。 一,assign和always區別 assign 語句使用時不能帶時鐘。 assign a=1; assign b=2; 在always不帶時鐘時,邏輯功能和assign完全一致,都是只產生組合邏輯。比較簡單的組合邏輯推薦使用assign語句,比較復雜的組合邏輯推薦使用 al…

解析跨域:原理、解決方案與實踐指南

解析跨域:原理、解決方案與實踐指南 🌐 在現代Web開發中,跨域問題是一個常見且重要的挑戰。隨著互聯網應用的日益復雜,前端與后端之間的交互越來越頻繁,跨域請求的需求也隨之增加。 一、跨域問題的本質與產生條件 &a…

鴻蒙開發:熟知@BuilderParam裝飾器

前言 本文代碼案例基于Api13。 在實際的開發中,我們經常會遇到自定義組件的情況,比如通用的列表組件,選項卡組件等等,由于使用方的樣式不一,子組件是動態變化的,針對這一情況,就不得不讓使用方把…

MSI微星電腦沖鋒坦克Pro Vector GP76 12UGS(MS-17K4)原廠Win11系統恢復鏡像,含還原功能,預裝OEM系統下載

適用機型:【MS-17K4】 鏈接:https://pan.baidu.com/s/1P8ZgXc6S_J9DI8RToRd0dQ?pwdqrf1 提取碼:qrf1 微星筆記本原裝出廠WINDOWS11系統自帶所有驅動、出廠主題壁紙、系統屬性專屬聯機支持標志、Office辦公軟件、MSI Center控制中心等預裝…

【面試題】杭州士騰科技-面試題匯總

歷史小劇場 歷史是一個好客的主人,卻從不容許客人取代它的位置。歷史也從來就不是一個人或事幾個人可以支配創造的。所謂時勢造英雄,實乃至理名言。 真正支配歷史的人,不是朱元璋,是稻田里辛勤勞作的老農,是官道上來往…

Go入門之map

map類型是引用類型,必須初始化才能使用,為key-value形式 var userinfo make(map[string]string)userinfo["username"] "zhangsan"var user map[string]string{"username": "張三","age": &qu…

切換鏡像源(npm)

常見的npm鏡像源 官方源 URL: https://registry.npmjs.org 淘寶鏡像源(npmmirror) URL: https://registry.npmmirror.com 其他常用鏡像源 URL: https://registry.cnpmjs.org (CNPM) 這里是引用 切換npm鏡像源 切換到官方源 npm config set registry http…

【大模型】DeepSeek 高級提示詞技巧使用詳解

目錄 一、前言 二、DeepSeek 通用提示詞技巧 2.1 DeepSeek 通用提示詞技巧總結 三、DeepSeek 進階使用技巧 3.1 DeepSeek一個特定角色的人設 3.1.1 為DeepSeek設置角色操作案例一 3.1.2 為DeepSeek設置角色操作案例二 3.2 DeepSeek開放人設升級 3.2.1 特殊的人設&#…

Qt開發③Qt的信號和槽_概念+使用+自定義信號和槽+連接方式

目錄 1. 信號和槽概述 1.1 事件和控件 1.2 信號的本質 1.3 槽的本質 2. 信號和槽的使用 2.1 connect 連接信號和槽 2.2 查看內置信號和槽 2.3 Qt Creator 生成信號槽代碼 3. 自定義信號和槽 3.1 不帶參數的信號和槽 3.2 帶參數的信號和槽 4. 信號與槽的連接方式 4…

【動態路由】系統Web URL資源整合系列(后端技術實現)【apisix實現】

需求說明 軟件功能需求:反向代理功能(描述:apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 業務應用等多個web資…

Vue2 中使用 UniApp 時,生命周期鉤子函數總結

在 Vue2 中使用 UniApp 時,生命周期鉤子函數是一個重要的概念。它允許開發者在特定的時間點運行代碼,管理組件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期鉤子函數總結: 1. beforeCreate 說明: 組件實例剛被創建,此時數據…

在Ubuntu24.04上安裝Stable-Diffusion1.10.1版本

之前曾介紹過在Ubuntu22.04上安裝Stable-Diffusion: 在Ubuntu22.04上部署Stable Diffusion_ubuntu stable dif-CSDN博客 這個安裝我們使用conda python虛擬機。這次我們介紹的是在Ubuntu24.04安裝Stable-Diffusion的最新版本V1.10.1(截止到今天最新版&…

IIS asp.net權限不足

檢查應用程序池的權限 IIS 應用程序池默認使用一個低權限賬戶(如 IIS_IUSRS),這可能導致無法刪除某些文件或目錄。可以通過以下方式提升權限: 方法 1:修改應用程序池的標識 打開 IIS 管理器。 在左側導航樹中&#x…