麦当劳点餐系统要点和坑点总结 | 我发现很多同学有几个共性的问题:

麦当劳点餐系统要点和坑点总结 | 我发现很多同学有几个共性的问题:

1. 输出的订单完成时间对不上号:

有些同学总想着订单一完成或者一失败就立马printf输出。这是不对的,因为你输出的时候需要按照订单点单时的先后顺序进行输出,不然对不上号对吧?所以,不要急于输出,其实可以把订单状态保存在订单里面,然后,直到把每一秒的状态都模拟完成了,也就是到达23:59:59,然后再输出所有订单的状态、失败的就fail,成功的就输出时间。

2. 从文件读取数据有问题:

其实多数同学的读取食物信息、w1、w2都没啥问题,问题最多的就是combo的那一行不定长字符串数字,不知道结尾在哪里,那我先前讲公开课的时候就说过,有两种操作方式,第1种是把一整行读取进来,然后依据空格划分每一个字符串,每行第一个就是套餐名,后面都是食物名。第2种是一个小技巧,套餐名都有combo后缀,所以读到带有combo的字符串就是新一轮套餐,相关函数就是strstr。

3. 订单主动找食物or食物主动供应订单?

订单主动找食物这种方式有一个好处,就是订单只要以数组形式保存,天然就是依据开始时间排好序的,这是题目保证的,那我们只要对每一个订单遍历库存中的食物,看是否为本订单需要的食物,即可,这样就自然保证了先来的订单先得到食物供应。但如果是食物主动供应订单,那就需要食物有一个优先队列,这个队列要保证早到的订单排在前面,后到的订单排在后面,略微增加了复杂度。

4. 系统接单状态更新:

如果一个订单的加入,无法立刻完成,就会导致未完成订单数加一,并且此时未完成订单数大于w1,那么接单系统立刻失败。但如果有订单完成后,未完成订单数小于w2,则在下一秒!下一秒!下一秒!(重要的事情说三遍)开始接单,比图片中的这个例子:

2分13秒刚好一个订单完成了,此时未完成订单数为1,单系统的接单状态此刻不发生任何改变,下一秒才开启。所以,2分13秒的新进来的chocolatesauce接单失败,从而显示fail。有些同学这里显示了该订单完成。

5. 可否提早结束点餐模拟:

当然可以!只要已完成订单数和失败订单数加起来等于总订单数,就可以停止模拟循环,进行最后的订单输出。更有些同学还能做更好的优化,比如中间有一段时间未完成订单数为0,而还有订单未抵达,完全可以直接使用时间跳转机制,比如一下子计算出1分钟后食物的库存量和下一个食物剩余时间,完全能做到,可以降低很多时间复杂度。但同学们请记住,不是最后一个订单完成了就算全部完成,因为会存在后面的订单比前面的订单先完成的情况。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了编写麦当劳点餐系统,您可以使用EasyX图形库和C ++编程。下面是一个简单的示例程序,展示了如何使用EasyX绘制窗口并获取用户的输入,并使用C ++处理并显示数据。 ```cpp #include <graphics.h> #include <conio.h> #include <iostream> #include <string> using namespace std; int main() { // 初始化窗口 initwindow(800, 600); // 绘制背景 setbkcolor(WHITE); cleardevice(); // 绘制标题 settextcolor(BLACK); settextstyle(40, 0, _T("微软雅黑")); outtextxy(250, 50, _T("欢迎来到麦当劳点餐系统")); // 绘制菜单 settextcolor(BLACK); settextstyle(25, 0, _T("微软雅黑")); outtextxy(100, 150, _T("1.汉堡")); outtextxy(100, 200, _T("2.薯条")); outtextxy(100, 250, _T("3.可乐")); // 获取用户输入 int x = 0; int y = 0; while (true) { if (_kbhit()) { int ch = _getch(); if (ch == 49) // 用户按下1 { x = 1; break; } else if (ch == 50) // 用户按下2 { x = 2; break; } else if (ch == 51) // 用户按下3 { x = 3; break; } } } // 显示用户选择 string selected; if (x == 1) { selected = "汉堡"; } else if (x == 2) { selected = "薯条"; } else if (x == 3) { selected = "可乐"; } settextcolor(BLACK); settextstyle(25, 0, _T("微软雅黑")); outtextxy(100, 350, _T("您选择了:")); outtextxy(300, 350, _T(selected.c_str())); // 等待用户响应 while (!_kbhit()) { delay_fps(60); } // 关闭窗口 closegraph(); return 0; } ``` 在这个例子中,我们使用`initwindow`函数初始化窗口,使用`outtextxy`函数绘制文本,使用`_kbhit`和`_getch`函数获取用户的输入,使用`closegraph`函数关闭窗口。在用户选择完餐品后,我们将所选内容显示在屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值