当前位置: 首页 > news >正文

【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())实现了数据项的快速定位,从而支持各项操作的快速响应。


三、可视化分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


相关文章:

【C语言】C语言 食堂自动化管理系统(源码+数据文件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【C语言】C语言 食堂自动化管理系统(源…...

mybatis存储过程返回list

在MyBatis中&#xff0c;要想通过调用存储过程返回一个List集合&#xff0c;你需要在Mapper接口中定义一个方法&#xff0c;并使用Param注解来传递存储过程的参数。同时&#xff0c;你需要在Mapper XML文件中配置相应的<select>标签&#xff0c;并指定statementType"…...

【vue】nodejs版本管理利器:nvm

nvm&#xff08;Node Version Manager&#xff09;即 Node 版本管理器&#xff0c;是一个用于在系统中轻松安装、管理和切换不同版本 Node.js 的工具。 在实际开发中&#xff0c;不同的项目可能基于不同版本的 Node.js 构建。比如一个旧项目依赖于 Node.js 12.x 版本的特定功能…...

负载测试工具有哪些?

Apache JMeter Apache JMeter 是一款开源的性能测试工具&#xff0c;主要用于对 Web 应用程序进行功能、负载和压力测试。JMeter 支持多种协议和技术&#xff0c;包括 HTTP, HTTPS, FTP 和 WebSocket 等。通过模拟大量并发用户访问来评估应用程序的表现1。 jmeter -n -t testp…...

路由基础 | 路由引入实验 | 不同路由引入方式存在的问题

注&#xff1a;本文为 “路由基础 | 路由表 | 路由引入” 相关文章合辑。 未整理去重。 路由基本概念 1—— 路由表信息、路由进表以及转发流程、最长掩码匹配原则 静下心来敲木鱼已于 2023-11-26 14:06:22 修改 什么是路由 路由就是指导报文转发的路径信息&#xff0c;可以…...

网络安全不分家 网络安全不涉及什么

何为网络安全 信息安全是指系统的硬件、软件及其信息受到保护&#xff0c;并持续正常运行和服务。信息安全的实质是保护信息系统和信息资源免受各种威胁、干扰和破坏&#xff0c;即保证信息的安全性。 网络安全是指利用网络技术、管理和控制等措施&#xff0c;保证网络系统和…...

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言&#xff1a; GitHub Copilot 的最新更新为开发者带来了显著变化&#xff0c;其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令&#xff0c;并具备多级任务推理能力&#xff0c;这使得开发者在开发复杂功能时&#xff0c;可大幅减少…...

wordpress企业官网建站的常用功能

WordPress 是一个功能强大的内容管理系统(CMS)&#xff0c;广泛用于企业官网的建设。以下是企业官网建站中常用的 WordPress 功能&#xff1a; 1. 页面管理 自定义页面模板&#xff1a;企业官网通常需要多种页面布局&#xff0c;如首页、关于我们、产品展示、联系我们等。Wor…...

讯方·智汇云校华为官方授权培训机构

1.官方授权 讯方智汇云校是华为领先级授权培训机构&#xff08;华为授权培训合作伙伴&#xff08;HALP&#xff09;体系&#xff0c;分为认证、优选、领先三个等级&#xff0c;领先级是HALP最高级&#xff09;&#xff0c;代表着华为对培训合作伙伴在专业能力、师资队伍、合作…...

C语言中的文件

文章目录 文件1. 流1.1 文件缓冲1.2 标准流1.3 文本文件和二进制文件 2. 打开/关闭文件2.1 fopen2.2 fclose 3. 读写文件3.1 fgetc & fputc3.2 fgets & futs3.3 fscanf & fprintf3.4 fread & fwrite 4. 文件定位5. 错误处理5.1 errno 文件 1. 流 在 C 语言中…...

利用分治策略优化快速排序

1. 基本思想 分治快速排序&#xff08;Quick Sort&#xff09;是一种基于分治法的排序算法&#xff0c;采用递归的方式将一个数组分割成小的子数组&#xff0c;并通过交换元素来使得每个子数组元素按照特定顺序排列&#xff0c;最终将整个数组排序。 快速排序的基本步骤&#…...

前端工程化的具体实现细节

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

数据分析--数据清洗

一、数据清洗的重要性&#xff1a;数据质量决定分析成败 1.1 真实案例警示 电商平台事故&#xff1a;2019年某电商大促期间&#xff0c;因价格数据未清洗导致错误标价&#xff0c;产生3000万元损失医疗数据分析&#xff1a;未清洗的异常血压值&#xff08;如300mmHg&#xff…...

✨1.HTML、CSS 和 JavaScript 是什么?

✨✨ HTML、CSS 和 JavaScript 是构建网页的三大核心技术&#xff0c;它们相互协作&#xff0c;让网页呈现出丰富的内容、精美的样式和交互功能。以下为你详细介绍&#xff1a; &#x1f98b;1. HTML&#xff08;超文本标记语言&#xff09; 定义&#xff1a;HTML 是一种用于描…...

QT--常用对话框

文章目录 前言一、颜色对话框颜色对话框代码解析 二、文本对话框文本对话框代码解析 三、输入对话框1.整型输入对话框2.浮点数输入对话框3.条目对话框 四、提示对话框1.提问对话框2.消息对话框3.警告对话框4.关键对话框 五、进度对话框六、向导对话框总结 前言 今天介绍几种标…...

基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例

简简单单 Online zuozuo :本心、输入输出、结果 文章目录 基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例前言下载 Ollama实际部署所需的硬件要求设置 LLM 使用 GPU ,发挥 100% GPU 性能Ollama 大模型管理命令大模型的实际运行资源消耗基于 Ollam…...

图的最小生成树算法: Prim算法和Kruskal算法(C++)

上一节我们学习了最短路径算法, 这一节来学习最小生成树. 最小生成树(Minimum Spanning Tree, MST)算法是图论中的一种重要算法, 主要用于在加权无向图中找到一棵生成树, 使得这棵树包含图中的所有顶点, 并且所有边的权重之和最小. 这样的树被称为最小生成树. 最小生成树广泛应…...

WPS的AI助手进化跟踪(灵犀+插件)

Ver V0.0 250216: 如何给WPS安装插件用以支持其他大模型LLM V0.1 250217: WPS的灵犀AI现在是DeepSeek R1(可能是全参数671B) 前言 WPS也有内置的AI&#xff0c;叫灵犀&#xff0c;之前应是自已的LLM模型&#xff0c;只能说是属于“能用&#xff0c;有好过无”&#xff0c;所…...

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样&#xff1f; 这里描述自己在使用AI进行数据分析&#xff08;数据清洗&#xff09;过程中的几个小故事&#xff1a; 1. 变量名的翻译 有一个项目是某医生自己收集的数据&#xff0c;变量名使用的是中文&#xff0c;分…...

一周学会Flask3 Python Web开发-request请求对象与url传参

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili request请求对象封装了从客户端发来的请求报文信息&#xff0c;我们可以从中获取所有数据。 request对象包含的常用属性&…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...