麦当劳点餐系统要点和坑点总结 | 我发现很多同学有几个共性的问题:
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分钟后食物的库存量和下一个食物剩余时间,完全能做到,可以降低很多时间复杂度。但同学们请记住,不是最后一个订单完成了就算全部完成,因为会存在后面的订单比前面的订单先完成的情况。