网站为什么要icp备案/seo关键词分类
👀樊梓慕:个人主页
🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》
🌝每一个不曾起舞的日子,都是对生命的辜负
前言
大一小学期,我迎来了人生中的第一次实训,“宅急送”订餐管理系统是一个非常好的检验该阶段所学知识的实训项目,本篇文章我会围绕这一实训项目以及在实训中遇到的问题和收获与大家进行探讨,内容包括流程图、函数调用关系图、算法描述以及代码实现等等,可供大家进行参考,希望大家多多点赞收藏支持🔥
欢迎大家📂收藏📂以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。
=========================================================================
GITEE相关代码:🌟fanfei_c的仓库🌟
=========================================================================
1.详细设计
1.1上班
1.1.1算法描述
首先对套餐顺序表进行初始化,然后从文件中读取套餐信息,并将其存储到套餐顺序表中,提示用户套餐信息读取完成,而后对订单信息队列进行初始化,从文件中读取订单信息,并将其存储到订单信息队列中,同样提示用户订单信息读取完成,最后则是对图进行初始化,从文件中分别读取地点信息和地点间距离信息,并将其存储到图中,提示地址和距离信息读取完成,而后等待用户进行下一步操作。
1.1.2流程图
1.2订单管理
1.2.1算法描述
1.接收订单
从用户输入获取订单信息,包括订餐人姓名、订单号和目的地等,并判断输入的订单信息是否合法,然后创建一个临时变量用来存储订单信息,最后将该临时变量入队。
2.根据订单号查询订单
从用户输入获取订餐人姓名,遍历队列中的每个节点,直到找到订单号匹配的节点为止,如果找到匹配的订单号,返回该节点的指针,否则返回空指针。
3.根据订餐人姓名查询订单
从用户输入获取订餐人姓名,遍历队列中的每个节点,直到找到订餐人姓名匹配的节点为止,如果找到匹配的订餐人姓名,返回 true,否则返回 false。
4.根据订单号查询并修改订单
调用订单号查询函数,获取该订单地址,根据用户输入的信息修改相应的订单属性,同样在其中穿插判断订单信息的合法性,最后更新订单信息。
5.根据订单号查询并取消订单
从用户输入获取订单号,调用订单号查询函数,获取该订单地址,判断该订单是否已派送,将该订单状态信息更新为取消。
1.2.2流程图
1.3派送订单
1.3.1算法描述
1.遍历未派送订单
以队列的size大小界定循环次数,遍历该队列,当派送状态为未派送时输出订单信息即可。
2.逐个派送
首先找到订单队列中最靠近队首的未派送订单,然后利用弗洛伊德算法计算最短路径并生成最短距离矩阵D得到最短距离,和最短路径矩阵Path,利用PrintShortedPath函数输出最短路径,设骑手速度为30,计算出送达时间并输出,将订单状态修改为已派送,最后提示用户派送成功。
1.3.2流程图
1.4数据维护
1.4.1算法描述
1.添加套餐
调用函数 CheckSetList检测套餐列表容量是否已满,如果已满则扩容,通过用户输入获取套餐信息,包括套餐编号、套餐名称、套餐描述、套餐价格和套餐状态,将获取的套餐信息依次存储到顺序表的末尾,增加顺序表长度,提示用户添加成功。
2.删除套餐
通过用户输入获取要删除的套餐的编号,遍历顺序表中的每个套餐,直到找到与输入的编号匹配的套餐为止,如果找到匹配的套餐,询问用户是否确定删除该套餐,并根据用户的选择进行相应操作,如果用户确定删除套餐,则将该套餐从顺序表中删除,并提示用户删除成功。
3.根据套餐编号修改套餐信息
通过用户输入获取要修改的套餐的编号,然后遍历顺序表中的每个套餐,直到找到与输入的编号匹配的套餐为止,如果找到匹配的套餐,通过用户输入修改套餐的名称、描述、价格和状态,提示用户修改成功,如果未找到匹配的套餐,提示用户修改失败并声明原因。
4.根据套餐名称修改套餐信息
通过用户输入获取要修改的套餐的名称,然后遍历顺序表中的每个套餐,直到找到与输入的名称匹配的套餐为止,如果找到匹配的套餐,通过用户输入修改套餐的名称、描述、价格和状态,提示用户修改成功,如果未找到匹配的套餐,提示用户修改失败并声明原因。
5.恢复套餐信息
首先初始化顺序表,然后调用函数 LoadSetList加载文件中的套餐信息,并将其存储到顺序表中,提示用户恢复套餐成功,之后调用函数 TraverseSet 遍历并打印顺序表中的套餐信息。
1.4.2流程图
1.5统计
1.5.1算法描述
1.当天统计
遍历订单队列,获取订单的时间信息,判断订单的时间是否为当天,如果是则进行统计,统计未派送数量、已派送数量、总套餐数和总金额,输出统计结果。
2.当月统计
遍历订单队列,获取订单的时间信息,判断订单的月份是否为当月,如果是则进行统计,遍历套餐列表,匹配订单的套餐编号,统计未派送数量、已派送数量、套餐数和总金额,最终输出统计结果。
3.当周统计
遍历订单队列,获取订单的时间信息,判断订单的日期是否在本周范围内,如果是则进行统计,遍历套餐列表,匹配订单的套餐编号,统计未派送数量、已派送数量、套餐数和总金额,最终输出统计结果。
4.按地址统计
遍历订单队列,获取订单的地址信息,遍历地址数组,匹配订单的地址,遍历套餐列表,匹配订单的套餐编号,统计订单数量和总金额,最终输出统计结果。
1.5.2流程图
1.6下班
1.6.1算法描述
将顺序表中的内容存储到文本文件中,然后销毁为顺序表开辟的动态内存空间,将队列中的内容存储到文本文件中,销毁为队列开辟的动态内存空间,提示用户信息储存完毕,等待用户退出程序。
1.6.2流程图
2.代码实现
=========================================================================
GITEE相关代码:🌟fanfei_c的仓库🌟
=========================================================================
3.函数调用关系
该图采用Mindmaster(亿图脑图)创作完成。
4.遇到的问题
1.fread与fwrite只能读取和写入二进制文件,不能读取文本文件(造成乱码的原因)
在实训初期,文件读取操作是比较棘手的难题,由于对于文件操作函数使用的不熟练,常常陷入读取文本出现乱码的问题,经过仔细研究文件操作函数,最终成功解决了这一问题。
为了以后方便学习,在套餐信息的读取和写入中我使用了二进制读取写入方式,而订单信息和图的信息我才用了文本读取写入方式。
二进制读取举例:
void Save_Set(SetList* s)//存储套餐信息文件
{FILE* pf = fopen("Menu_Info.txt", "w");//保存套餐信息到文件if (pf == NULL){perror("fopen Menu_Info");return;}int i = 0;for (i = 0; i < s->length; i++){fwrite(&s->setmea[i], sizeof(Meal), 1, pf);}
}
void LoadSetList(SetList* s)//加载套餐信息文件
{FILE* pf = fopen("Menu_Info.txt", "rb");if (pf == NULL){perror("LoadSetList");return;}Meal tmp = { 0 };while (fread(&tmp, sizeof(Meal), 1, pf)){CheckSetList(s);s->setmea[s->length] = tmp;s->length++;}printf("Menu_Info.txt加载成功!\n");fclose(pf);return;
}
文本读取举例:
void Save_Book(Que* pq)// 存储订单信息文件
{FILE* pf = fopen("Book_Info.txt", "w");if (pf == NULL){perror("fopen Book_Info");return;}while (!QueueEmpty(pq)){Order_Info tmp = { 0 };tmp = QueueFront(pq);fprintf(pf, "%s ", tmp.Order_Num);fprintf(pf, "%s ", tmp.Menu_Num);fprintf(pf, "%d ", tmp.Num);fprintf(pf, "%s ", tmp.Orderer_Name);fprintf(pf, "%s ", tmp.Order_Tele);fprintf(pf, "%s ", tmp.Address);fprintf(pf, "%s ", tmp.Order_Time);fprintf(pf, "%d ", tmp.Deliver_State);fprintf(pf, "%d\n", tmp.timestamp);QueuePop(pq);}
}
void LoadBook(Que* pq)//加载订单信息
{FILE* pf = fopen("Book_Info.txt", "r");if (pf == NULL){perror("LoadBook");return;}char line[150];while (fgets(line, sizeof(line), pf)) // 逐行读取文件内容{Order_Info tmp = { 0 };sscanf(line, "%s %s %d %s %s %s %s %d %d", tmp.Order_Num, tmp.Menu_Num, &tmp.Num,tmp.Orderer_Name,tmp.Order_Tele,tmp.Address,tmp.Order_Time,&tmp.Deliver_State,&tmp.timestamp); // 解析行中的数据QueuePush(pq, tmp);}printf("Book_Info.txt加载成功!\n");fclose(pf);return;
}
大家如果对文件操作相关知识有所欠缺,可以浏览下我之前写的博客->【C语言】文件操作🍎
2.使用feof()函数判断文件结束是不合适的
在处理文件指针时,判断文件是否已经到达末尾的一种常见方法是使用feof()函数(feof()函数会在文件指针到达文件末尾时返回非零值,否则返回0)
因此,在循环中使用while (!feof(pf))来判断文件是否到达末尾,看起来似乎是一种合理的做法。
然而,实际上在循环中使用while (!feof(pf))可能会导致最后一次循环读取无效数据的问题。这是因为feof()函数的返回值只有在文件指针尝试读取文件末尾之后才会为真。也就是说,在feof()函数返回真之前,文件指针可能已经读取了文件末尾之后的数据,但循环仍然会继续执行一次。因此,在最后一次循环中,会读取到文件末尾之后的无效数据。
为了避免这个问题,可以使用替代方案来处理文件指针。一种常见的替代方案是使用fgets()函数来逐行读取文件内容,并在循环中检查fgets()函数的返回值是否为NULL,以判断是否到达文件末尾。如果fgets()函数返回NULL,说明文件已经到达末尾,循环应该结束。这种方式可以确保最后一次循环不会读取无效数据。
使用fgets()函数逐行读取文件内容,当fgets()函数返回NULL时,循环结束。这样确保了最后一次循环不会读取无效数据。
while (fgets(line, sizeof(line), pf))
{
// 处理每一行的数据
// ...
}
总结起来,建议避免在循环中使用feof()函数来判断文件是否到达末尾,而是使用替代方案如fgets()函数来处理文件指针,以确保最后一次循环不会读取无效数据。
下面是feof函数的正确使用方法:
int main()
{FILE* file = fopen("data.txt", "r");if (file == NULL){perror("fopen");return 1;}char buffer[100];while (fgets(buffer, sizeof(buffer), file) != NULL){printf("%s", buffer);}if (feof(file))//将feof的判断放在循环末尾{printf("Reached end of file.\n");}else{printf("Error occurred while reading file.\n");}fclose(file);return 0;
}
由于当fgets(buffer, sizeof(buffer), file)函数的返回值为NULL时,说明文件已经到达末尾,此时循环结束,再利用feof(file)做判断,如果此时feof(file)的返回值为真,证明文件确实到达了末尾,但如果feof(file)的返回值为假,那证明文件在读取的过程中发生了错误,需要进行检查。
由此才是feof()函数的正确用法,这样的方法也更加严谨和安全。
3.跨文件结构体指针作为参数无法识别,必须使用struct +结构体名
这个问题是在基本完成各个源文件后,合并在一起实现时出现的问题,即多文件形式引起的错误,我发现虽然在头文件中定义结构体:
typedef struct Queue
{
…
}Queue;
在函数形参中,参数格式为Queue* 即可,但我发现编译器会报错,当加上struct Queue*就不报错了,所以我推测跨文件结构体指针作为参数无法识别,必须适用struct Queue*的格式才行,下面是问题截图:
当然,这只是我的推测,在请教学校老师后,老师给了我这个答案:可能是我所使用的编译器不支持省略struct的写法,如果有大佬发现我的说法是错误的话,希望可以帮我指正出来,谢谢!
4.统计板块中的时间识别问题
如何界定统计中的当日统计、当月统计和本周统计呢,我的思路是将订单结构体中新增一个结构体变量time_t timestamp,在日后需要识别订单时间时,利用localtime(&p->data.timestamp),就能拿到订单的时间了,否则还需要对时间字符串char Order_Time[25]进行转化识别,下面是localtime返回值tm结构体的成员,可作为参考:
诚然这种思路可以实现统计的功能,但在本周统计上,仍然需要考虑该周跨月甚至跨年的问题,我感觉较为繁琐,不知道大家对于统计的算法有没有什么更好的思路可以分享的呢,欢迎大家在评论区多多交流🌝
5.需要读取的时间字符串中间存在空格
订单信息中的下单时间,需求文档中给定的格式是2023-08-28 19:00:00,日期和时间中间存在一个空格,这就与其他信息间存在冲突,因为读取文件信息我采用的是sscanf函数,sscanf遇到空格即停止读取,这也是一段字符串中不同内容可以区分的特性,而时间字符串中存在一个空格,这就导致sscanf读取到2023-08-28即停止,19:00:00就被认为是下一个内容了。
我的解决方案是将时间的格式更改为2023-08-28/19:00:00,这样就解决了这一问题。
但其实这是一种妥协,另一种方法则是将日期2023-08-29看作一个字符串,将时间14:53:30看作一个字符串,分别读取到不同的结构体变量中,当然如果大家有更好的方法,希望可以分享在评论区😁
总结
本次实训极大的考验了我的代码能力,在程序设计前期,由于对文件操作知识掌握相对薄弱,对于二进制读取和文本读取还没有清晰的认识,导致在测试调试过程中常常出现乱码等问题,甚至在实训前期一度对自己产生怀疑,但好在翻过了文件操作这一座高山,其他的问题基本上就是轻舟已过万重山。
为期两周的实训结束了,我交上了自己还算满意的答卷,大一小学期的这次实训让我收获满满,也希望各位读者在文章中我遇到的问题上可以给出指导或建议,谢谢大家!
=========================================================================
如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容
🍎博主很需要大家的支持,你的支持是我创作的不竭动力🍎
🌟~ 点赞收藏+关注 ~🌟
=========================================================================
相关文章:

【实训】“宅急送”订餐管理系统(程序设计综合能力实训)
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 大一小学期,我迎来了人生中的第一次实训…...

openeuler上安装polarismesh集群
1、安装MySQL数据库 数据库连接地址10.10.10.168 用户root 密码123456 MySQL安装参考搭建DSS环境(六)之安装基础环境MySQL_linux安装dss_青春不流名的博客-CSDN博客 2、安装Redis集群 IPResid PORTSentinel PORTPASSWORDCluster NAME10.10.10.110637…...

Java基础——stream
流 stream是什么?stream优点stream和集合的区别stream的创建steam的操作从steam中取值 stream是什么? stream可以简化对集合的操作,具体操作由流内部实现,而无需用户自行实现过程 stream优点 对于以下ArrayList List<Strin…...

Spring Quartz 持久化解决方案
Quartz是实现了序列化接口的,包括接口,所以可以使用标准方式序列化到数据库。 而Spring2.5.6在集成Quartz时却未能考虑持久化问题。 Spring对JobDetail进行了封装,却未实现序列化接口,所以持久化的时候会产生NotSerializable问题&…...

基于Java+SpringBoot+Vue前后端分离火锅店管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

Unity——导航系统补充说明
一、导航系统补充说明 1、导航与动画 我们可以通过设置动画状态机的变量,让动画匹配由玩家直接控制的角色的移动。那么自动导航的角色如何与动画系统结合呢? 有两个常用的属性可以获得导航代理当前的状态: 一是agent.velocity,…...

nginx实现负载均衡load balance
目录 nginx实现负载均衡load balance相关算法负载均衡https的访问后端的real server是否知道真正访问的用户的IP地址健康检查提升负载均衡的并发数量七层负载均衡和四层负载均衡七层负载均衡四层负载均衡四层和七层的区别502错误 nginx实现负载均衡load balance 准备ÿ…...

淘宝订单接口:连接消费者与商家的桥梁
当我们谈论淘宝订单接口时,我们谈论的是淘宝网为卖家和买家提供的一个用于处理订单的核心系统。通过这个接口,卖家可以接收订单、处理订单状态,并更新买家和平台的状态信息;买家则可以实时追踪自己的订单状态,更好地掌…...

数据结构-第一期——数组(Python)
目录 00、前言: 01、一维数组 一维数组的定义和初始化 一维变长数组 一维正向遍历 一维反向遍历 一维数组的区间操作 竞赛小技巧:不用从a[0]开始,从a[1]开始 蓝桥杯真题练习1 读入一维数组 例题一 例题二 例题三 实战训…...

八 动手学深度学习v2 ——卷积神经网络之卷积+填充步幅+池化+LeNet
目录 1. 图像卷积总结2. 填充和步幅 padding和stride3. 多输入多输出通道4. 池化层5. LeNet 1. 图像卷积总结 二维卷积层的核心计算是二维互相关运算。最简单的形式是,对二维输入数据和卷积核执行互相关操作,然后添加一个偏置。核矩阵和偏移是可学习的参…...

SparkCore
第1章 RDD概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD类比工厂生产。 …...

配置 Windows 系统环境变量
直接按键盘上面的 WINS 打开 Windows 搜索 搜索“编辑系统环境变量” 也可以右键此电脑->属性->高级系统设置打开相同的界面 点击环境变量 一般添加就是添加在框出的 Path 里面,双击可以看到现有的环境变量并进行编辑 例如我在博客中写把 Java 的 jdk 解压好…...

【计算机视觉】图片文件格式的讲解
文章目录 一、图片的压缩二、计算机表示颜色三、JPG和PNG3.1 JPG3.2 PNG 一、图片的压缩 图片文件格式有可能会对图片的文件大小进行不同程度的压缩,图片的压缩分为有损压缩和无损压缩两种。 有损压缩。指在压缩文件大小的过程中,损失了一部分图片的信…...

2023最全的性能测试种类介绍,这6个种类特别重要!
系统的性能是一个很大的概念,覆盖面非常广泛,包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等,性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称,它其实包…...

代码随想录算法训练营19期第43天
1049. 最后一块石头的重量 II 视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II_哔哩哔哩_bilibili 代码随想录 初步思路:动态规划。 总结:套用01背包 dp[j…...

微信小程序wx.previewImage实现图片预览
在微信小程序中,wx.previewImage函数用于预览图片,可以将一组图片以轮播的方式展示给用户,并支持用户手势操作进行切换。 使用wx.previewImage函数需要传入一个参数对象,该对象包含以下属性: current: String&#x…...

Java实现Modbus读写数据
背景 由于当时项目周期赶,引入了一个PLC4X组件,上手快。接下来就是使用这个组件遇到的一些问题: 关闭连接NioEventLoop没有释放导致oom设计思想是一个设备一个连接,而不是一个网关一个连接连接断开后客户端无从感知 前两个问题解…...

C++11新特性⑤ | 仿函数与lambda表达式
目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...&a…...

解决websocket不定时出现1005错误
后台抛出异常如下: Operator called default onErrorDropped reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005 Caused by: java.lang.IllegalArgume…...

文章内容生成随机图像,并将这些图像上链
一、需求背景 在当前的互联网时代,信息越来越快速地传播,一篇好的文章不仅需要有吸引人的文字内容,还需要有精美的配图。但是,对于某些只有文字,而没有图片的文章,我们可以使用程序去生成随机的图片来作为文章的配图。 本文将详细介绍如何使用Java语言实现文章内容生成…...

l8-d9 UDP通信实现
一、函数接口扩展与UDP通信实现流程 1.write/read到send/recv 函数原型: ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); 前三个参数同read/write一样; ssize_t rea…...

MongoDB复杂聚合查询与java中MongoTemplate的api对应
MongoDB聚合json脚本 db.getCollection("202303_refund").aggregate([{"$match": {"courseType": "常规班课","teacherRefundReasonCheck": true,"teacherId": {"$in": [7544]},"createTime"…...

WireShark抓包工具的安装
1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包,点击next 点击next 选择UI界面,两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功...

审计智能合约的成本是多少?如何审计智能合约?
审计智能合约的成本是多少?如何审计智能合约? 智能合约安全审计在去中心化金融 (DeFi) 生态系统中非常普遍。如果您投资了一个区块链项目,您的决定可能部分基于智能合约代码审查的结果。 虽然大多数人都了解审计对网络安全的重要性ÿ…...

9.7 校招 内推 面经
绿泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | Momenta 2024校招火热进行中!新增招聘岗位(内推) 校招 | Momenta 2024校招火热进行中!新增招聘岗位(内推) 2、…...

【网络编程】IO多路复用
IO多路复用是一种高效的I/O处理方式,它允许单个进程能够同时监视多个文件描述符(sockets、文件等),并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作,以提…...

MySQL与postgreSQL数据库的区别
MySQL 是一个流行的开源关系型数据库管理系统,具有以下优势: 开源和免费:MySQL 是一个开源软件,允许用户免费下载、使用和修改。它的免费版本(Community Edition)提供了广泛的功能,适用于大多数…...

单片机电子元器件-按键
电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关,开关在闭合不会马上稳定的接通,会有一连串的抖动 抖动时间的长短有机械特性来决定的,一般为5ms 到10 ms 。 消抖的分类 硬件消…...

Nacos docker实现nacos高可用集群项目
目录 Nacos是什么? Nacos在公司里的运用是什么? 使用docker构建nacos容器高可用集群 实验规划图:编辑 1、拉取nacos镜像 2、创建docker网桥(实现集群内的机器的互联互通(所有的nacos和mysql)&#x…...

基于Dubbo实现服务的远程调用
目录 前言 RPC思想 为什么使用Dubbo Dubbo技术框架 编辑 调用关系流程 基础实现 A.提供统一业务Api B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用…...