python模拟银行取号叫号系统
模擬銀行取號叫號系統
需求如下:
 1.當客戶使用排隊系統,排隊機按存儲的號碼遞增,生成一個號碼并打印,排隊機將此號碼在無線空閑狀態下發送給主機。
 2.主機根據現有各窗口業務狀況,如果有某個窗口空閑,則立即指派任務。如果有客戶在前面等待則讓最新的號碼加入排隊隊列。銀行排隊叫號系統工作流程
 3.當工作人員按下呼叫器的呼叫鍵時,呼叫器通過無線模塊往主機提出要求,主機收到要求后,給出應答,應答包括安排的客戶號碼和現有排隊等待的人數。如果沒人排隊,則提示**空閑信息。
 4.主機確定有人在排隊的情況下,將最前面一個號碼發送給語音播放系統,播放語音告知客戶。并將號碼發給對應的顯示屏顯示。
設計算法
其實需求有不清晰之處:未明確窗口與業務的對應關系,對應關系有三種:①窗口與業務是一對一的關系;②窗口與業務是一對多的關系;③窗口與業務是多對一的關系;④窗口與業務是多對多的關系。其中一對一的關系實現起來最簡單,我們依次為例進行分析。
算法分為兩個模塊,一個是用戶界面的取號模塊,另一個是工作人員的叫號模塊,如果要實現兩個模塊之間來回切換,我們還要實現兩個模塊的鏈接。我們用一個字典來存儲所有客戶的叫號信息,通過字典的寫入(取號),修改(叫號)實現兩個模塊的鏈接,假定過號必須重新叫號。
1、字典。
 字典可以設置為:
其中t1,t2,t3,t4表示對應業務的排隊名單,是列表類型。
2、取號。
 我們假設服務與數字相對應:1. 銀行卡服務;2. 社保卡服務 3. 金融卡服務 4. 其他服務。獲取用戶輸入的數字,判定用戶需要何種服務,設置計數碼,使用while循環對號碼進行累次遞加,并打印出取號信息。
 使用append()將函數新取號的用戶加入t列表中,方便后續叫號使用。
3、叫號。
 叫號需要切換到工作人員的界面,我們用pop()函數對字典中的t列表進行取出元素并刪除的操作,取出的元素放到popped_num變量中,并打印出叫號信息,用len()函數可以獲取當前的等待人數。
完整代碼
#銀行取號叫號系統 def get_num(): #實現取號,并把每一個號存入列表中。global t1,t2,t3,t4,a,b,c,d,pos_dict #定義全局變量,用來切換客戶和工作人員窗口時數據能同步更新。#t1,t2,t3,t4表示對應業務的排隊名單#a,b,c,d表示對應業務的取號計數變量#pos_dict 是整個數據存儲的字典pos_dict = {"銀行卡服務窗口":t1,"社保卡服務窗口":t2,"金融卡服務窗口":t3,"其他服務窗口":t4}while True:id = eval(input('請選擇業務類型:1. 銀行卡服務;2. 社保卡服務 \ 3. 金融卡服務 4. 其他 5. 切換到工作人員窗口\n'))if id == 1:a += 1A_num = "A" + str(a) #為了以示區分,在取號上加了A,B,C,Dt1.append(A_num)pos_dict['銀行卡服務窗口'] = t1print('你的排隊號碼是A{},當前你選擇的是銀行卡服務。\n'.format(a))#print(pos_dict['銀行卡服務窗口'])#上面是一行禁用的代碼,不禁用時用來測試運行時結果是否正確。elif id ==2:b += 1B_num = "B" + str(b)t2.append(B_num)pos_dict['社保卡服務窗口'] = t2print('你的排隊號碼是B{},當前你選擇的是社保卡服務。\n'.format(b))elif id ==3:c += 1C_num = "C" + str(c)t3.append(C_num)pos_dict['金融卡服務窗口'] = t3print('你的排隊號碼是C{},當前你選擇的是金融卡服務。\n'.format(c))elif id == 4:d += 1D_num = "D" + str(c)t4.append(D_num)pos_dict['其他服務窗口'] = t4print('你的排隊號碼是D{},當前你選擇的是其他服務。\n'.format(d))elif id == 5:break #輸入5的時候切換到工作人員界面else:print("輸入有誤,請重新輸入!")return pos_dictdef yell_num(pos_dict):t1 = pos_dict['銀行卡服務窗口']t2 = pos_dict['社保卡服務窗口']t3 = pos_dict['金融卡服務窗口']t4 = pos_dict['其他服務窗口'] while True:key = input("呼叫客戶按y,切換到用戶界面按n,結束進程請按e\n")if key == "y":window_num = input("請輸入當前窗口類型:1. 銀行卡服務;2. 社保卡服務 \ 3. 金融卡服務 4. 其他 5.切換到客戶界面\n")if window_num =="1":try:popped_num = t1.pop(0) #pop()函數,從列表取出第0個元素將其存儲在popped_num,并刪除print("請{}號客戶前往1號窗口辦理業務,當前排隊人數為{}人\n"\.format(popped_num,len(t1)))except:print("目前1號窗口空閑,無人排隊")#列表為空時,pop()函數報錯,故except表示列表為空elif window_num =="2":try:popped_num = t2.pop(0)print("請{}號客戶前往2號窗口辦理業務,當前排隊人數為{}人\n"\.format(popped_num,len(t2)))except:print("目前2號窗口空閑,無人排隊")elif window_num =="3":try:popped_num = t3.pop(0)print("請{}號客戶前往3號窗口辦理業務,當前排隊人數為{}人\n"\.format(popped_num,len(t3)))except:print("目前3號窗口空閑,無人排隊")elif window_num =="4":try:popped_num = t4.pop(0)print("請{}號客戶前往4號窗口辦理業務,當前排隊人數為{}人\n"\.format(popped_num,len(t4)))except:print("目前4號窗口空閑,無人排隊")elif window_num =="5":#設置輸入5切換到用戶界面get_num()else:print("輸入錯誤,請重新輸入!\n")elif key == "n":get_num()elif key == "e":breakelse:print("輸入錯誤,請重新輸入!\n")def main():pos_dict =get_num()yell_num(pos_dict)a=0 b=0 c=0 d=0 t1 = [] t2 = [] t3 = [] t4 = [] main()程序運行的結果截圖如下:
 
需要注意的問題
1、關于全局變量。
 代碼中使用了全局變量,global t1,t2,t3,t4,a,b,c,d,pos_dict ,是因為我們的取號模塊和叫號模塊需要來回切換,如果不使用全局模塊就會出現從叫號模塊返回取號模塊后,取號又重新從A1開始,再回到叫號模塊,也從A1開始。
2、關于其他的“”窗口-業務“”對應關系的處理
 由于python只學了一個月,所以目前只寫出了一一對應關系下的模擬系統,其他關系的系統寫出來后會繼續上傳。也希望能有朋友一起交流一下。
3、寫代碼的時候發現的一行代碼太長的問題
 用英文的 \ 是可以解決一行代碼太長的情況的,但是要注意在print語句中用 \ 時,我們需要把第二行的代碼取消縮進,頂格書寫,否則會有空格。具體如下(第二個是正確的):
 
 
寫在最后
本文科生學習python以來,第一次寫博客,希望大家多多見諒,多多指教,謝謝!
總結
以上是生活随笔為你收集整理的python模拟银行取号叫号系统的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 别瞎找了,你要的C语言经典示例都在这~
 - 下一篇: AD9371+ZC706 NO-OS初始