一、题目
有客人来就餐时其叫号系统会自动生成一个号码,并根据人数安排餐桌型号;当对应餐桌型号有空桌时,按餐桌编号(由小到大)即时分配餐桌安排客人就餐;当对应餐桌型号没有空桌时,客人按先后顺序排队。程序部分运行界面如下:
餐厅餐桌设置如下表:
二、程序
# 全局变量设置 size = [2, 4, 6, 12] # 每种桌型最大就餐人数 nums = [8, 2, 10, 4] # 每种桌型的餐桌数量 times = [25, 45, 60, 80] # 每种桌型平均就餐时间 flags = [[True] * nums[i] for i in range(4)] # 标记每张桌子的初始状态,True为空闲,False为占用,默认True s_time = 10 * 60 * 60 # 开始营业时间-10 点整,转化为秒 e_time = 14 * 60 * 60 # 结束营业时间-14 点整转化为秒 maxn = 50 # 假设队列已经足够深 qc = [[0] * maxn for i in range(4)] # 循环队列 now_time = s_time id = 0 # head是4个初始化0的数组,用来存储四种桌型的头指针;tail是4个初始化数组为0的数组,用来存储四种桌型的尾指针;tail-head+1则是队列的长度,也就是当前桌型已占用的桌数 head, tail = [0] * 4, [0] * 4 def gettype(num): type = -1 for i in range(len(size)): if num <= size[i]: type = i break return type def checktable(n): ans = [] for i in range(nums[n]): if flags[n][i]: ans.append(i) return ans def getinfo(): return int(input("请输入客人人数:")) if __name__ == '__main__': while now_time < e_time: # 调用函数getinfo() #获取客人人数 number = getinfo() if number > 0: id += 1 # 根据就餐人数确定餐桌类型 type = gettype(number) if type != -1: qc[type][tail[type]] = id tail[type] = (tail[type] + 1) % maxn qc_len = (tail[type] - head[type] + maxn) % maxn print(id, "号客人,给您安排的是", size[type], "人桌,前面还有", qc_len - 1, "人在等位") else: print(id, "号客人,非常抱歉,没有适合您的桌型!") else: print("结束!") break for i in range(4): tables = checktable(i) if len(tables) > 0 and head[i] != tail[i]: flags[i][tables[0]] = False # 座第一个空桌 print(qc[i][head[i]], "号客人请用餐-->", size[i], "人桌", tables[0], "号") head[i] = (head[i] + 1) % maxn now_time += 1 # 更新每张餐桌的就餐情况,代码略 # 根据桌型的就餐时间,就餐时间截至则将占用桌重新释放
三、运行结果
请输入客人人数:3
1 号客人,给您安排的是 4 人桌,前面还有 0 人在等位
1 号客人请用餐--> 4 人桌 0 号
请输入客人人数:3
2 号客人,给您安排的是 4 人桌,前面还有 0 人在等位
2 号客人请用餐--> 4 人桌 1 号
请输入客人人数:3
3 号客人,给您安排的是 4 人桌,前面还有 0 人在等位
请输入客人人数:3
4 号客人,给您安排的是 4 人桌,前面还有 1 人在等位
请输入客人人数:3
5 号客人,给您安排的是 4 人桌,前面还有 2 人在等位
请输入客人人数:3
6 号客人,给您安排的是 4 人桌,前面还有 3 人在等位
请输入客人人数:3
7 号客人,给您安排的是 4 人桌,前面还有 4 人在等位
请输入客人人数:3
8 号客人,给您安排的是 4 人桌,前面还有 5 人在等位
请输入客人人数:3
9 号客人,给您安排的是 4 人桌,前面还有 6 人在等位
请输入客人人数:2
10 号客人,给您安排的是 2 人桌,前面还有 0 人在等位
10 号客人请用餐--> 2 人桌 0 号
请输入客人人数:2
11 号客人,给您安排的是 2 人桌,前面还有 0 人在等位
11 号客人请用餐--> 2 人桌 1 号
请输入客人人数:2
12 号客人,给您安排的是 2 人桌,前面还有 0 人在等位
12 号客人请用餐--> 2 人桌 2 号
请输入客人人数:2
13 号客人,给您安排的是 2 人桌,前面还有 0 人在等位
13 号客人请用餐--> 2 人桌 3 号
请输入客人人数:1
14 号客人,给您安排的是 2 人桌,前面还有 0 人在等位
14 号客人请用餐--> 2 人桌 4 号
请输入客人人数:2
15 号客人,给您安排的是 2 人桌,前面还有 0 人在等位
15 号客人请用餐--> 2 人桌 5 号
请输入客人人数:12
16 号客人,给您安排的是 12 人桌,前面还有 0 人在等位
16 号客人请用餐--> 12 人桌 0 号
请输入客人人数:20
17 号客人,非常抱歉,没有适合您的桌型!
请输入客人人数:32
18 号客人,非常抱歉,没有适合您的桌型!
请输入客人人数:-1
结束!