【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.mzph.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…