【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.rhkb.cn/news/20498.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#之上位机开发---------C#通信库及WPF的简单实践

〇、上位机,分层架构 界面层 要实现的功能: 展示数据 获取数据 发送数据 数据层 要实现的功能: 转换数据 打包数据 存取数据 通信层 要实现的功能: 打开连接 关闭连接 读取数据 写入数据 实体类 作用: 封装数据…

网络编程(24)——实现带参数的http-get请求

文章目录 二十四、day241. char 转为16进制2. 16进制转为 char3. URL 编码函数4. URL 解码函数5. 实现 get 请求参数的解析6. 测试 二十四、day24 我们在前文通过beast实现了http服务器的简单搭建,但是有很多问题我们并没有解决。 在前文中,我们的 get…

机器学习_18 K均值聚类知识点总结

K均值聚类(K-means Clustering)是一种经典的无监督学习算法,广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇,使得簇内相似度高而簇间相似度低。今天,我们就来深入探讨K均值聚类的原理、实现和应用…

LeetCode1287

LeetCode1287 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 给定一个非递减的整数数组 arr,其中有一个元素恰好出现超过数组长度的 25%。请你找到并返回这个元素。 示例 示例 1 输入: arr [1, 2, 2, 6, 6, 6, 6, 7,…

恒创科技:如何重新启动 Windows 服务器

重新启动 Windows 服务器对于应用更新、解决问题和维护系统性能至关重要。定期重新启动有助于确保服务器运行最新软件、解决冲突并清除临时文件。本教程将介绍如何使用不同的方法重新启动 Windows 服务器。 注意:重新启动服务器之前保存所有工作,以避免丢…

Django ModelForm使用(初学)

1.目的是根据员工表字段,实现一个新增员工的数据填写页面 2.在views.py文件中按下面的格式写 定义 ModelForm 类:UserModelForm (自己命名的类名)使用时需要导入包 定义视图函数:user_model_form_add(在函…

华为固态电池引发的思索

华为固态电池真牛! 超长续航:单次充电即可行驶3000公里 极速充电:五分钟内充满80% 极致安全:不可燃、不漏液 长寿命设计:循环寿命达10000次以上 如上是华为电池展示的优势项,每一条都让我们心动不已。…

美信监控易:运维新时代,守护数据安全

在 2025 年这个科技飞速发展的时代,数据安全已成为各行业关注的焦点。随着云计算、大数据、物联网等技术的不断推进,运维数据的保护面临着新的挑战与要求。美信时代公司的美信监控易运维管理软件,以其卓越的功能、特性和竞争力,为…

个人博客5年回顾

https://huangtao01.github.io/ 五年前,看程序羊的b站视频做的blog,受限于网络,只能单向学习,没有人指导与监督,从来没有想过,有没有什么问题? 一、为什么要做个人博客? 二、我是怎么…

Unity合批处理优化内存序列帧播放动画

Unity合批处理序列帧优化内存 介绍图片导入到Unity中的处理Unity中图片设置处理Unity中图片裁剪 创建序列帧动画总结 介绍 这里是针对Unity序列帧动画的优化内容,将多个图片合批处理然后为了降低Unity的内存占用,但是相对的质量也会稍微降低。可自行进行…

【Docker】容器被停止/删除的方式及命令:全面解析与实践指南

文章目录 引言一、容器的生命周期二、停止容器的命令及方式1. docker stop 命令2. docker kill 命令3. docker pause 和 docker unpause 命令4. docker restart 命令 三、删除容器的命令及方式1. docker rm 命令2. docker container prune 命令3. docker rm 与 docker rmi 的区…

大数据SQL调优专题——Flink执行原理

引入 上一篇我们了解了Spark,相比起MapReduce来说,它确实已经快了超级多了,但是人类的欲望是没有止境的,这也是推动人类进步的动力。 Flink就是为了满足实时响应的场景需求诞生的。 其实在Flink之前,实时处理其实已…

【Cocos TypeScript 零基础 16.1】

目录 FlappyBird背景其他心得_刚体audio部分 FlappyBird 本人没有按照老师的做法去做,大体差不多, 当然老师做的更精细,有些不会的还是参考老师的方法 参考部分 小鸟如何像真实物体一样的重力效果点击如何使小鸟飞翔 省略部分 3. 小鸟多动画(飞机大战其实有做,单纯偷懒) 4. …

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker,这是一个基于网络的计算平台,旨在简化和加速 EnzyDock 对接模拟的设置过程&…

腿足机器人之六- 前向运动学

腿足机器人之六- 前向运动学 刚体运动学基础坐标系定义旋转矩阵与欧拉角齐次变换矩阵(平移旋转的统一表示) 运动链建模串联运动链结构(从基座到末端的关节连接)标准Denavit-Hartenberg(D-H)参数法改进D-H参…

uni-app发起网络请求的三种方式

uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…

【linux】更换ollama的deepseek模型默认安装路径

【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…

「软件设计模式」装饰者模式(Decorator)

深入解析装饰者模式:动态扩展功能的艺术(C实现) 一、模式思想与应用场景 1.1 模式定义 装饰者模式(Decorator Pattern)是一种结构型设计模式,它通过将对象放入包含行为的特殊封装对象中,动态地…

java项目打包成docker镜像步骤

java项目打包成docker镜像步骤 1.使用maven把java文件打包成可执行的jar包2. 打包成Dockerfile3. 把jar包和DockerFile两个文件上传到服务器上。4. 制作镜像5.启动容器 1.使用maven把java文件打包成可执行的jar包 2. 打包成Dockerfile # 先从dockerhub找到对应版本的openjdk的…

后台管理系统-项目初始化

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最常见的应用模式,不同的管理系统之间有很多相似的地方…