用python写银行叫号系统(这个是学校的实训题目,真的没什么技术含量)

一、 项目概述
智能排队叫号系统是在银行等待业务办理区域所使用的智能叫号系统,系统可有效解决客户办理业务时排队的无序、业务员工作量的不平衡、就诊环境嘈杂等问题。

二、 需求分析
主要分为取号、排队等待叫号、叫号办理业务
取号系统支持随时添加取号信息(编号、姓名、取号时间),信息将被添加到数据文件中。
写这一取号部分主要就是数据的存储,把编号、姓名、取号时间存储到CSV文档中
叫号系统每隔十分钟叫取五个等待中的号码。每个号码叫三遍,每遍间隔三秒钟,控制台输入取号标识(如:y)代表成功叫号准备就诊。若超时未输入当前号码作废,继续叫取下一个排队中号码,并将作废挂号信息添加到过号数据文件中。支持过号用户查询过号数据。
写这一部分主要就是有两种方法:第一种引用threading模块,利用timer方法实现每个号码叫三遍,每遍间隔三秒钟,但是好像每隔十分钟叫取五个等待中的号码怎么也实现不了所以呢用第二种方法,for循环语句+time这一模块,叫三遍=循环三次,间隔三秒钟=time.sleep(3),隔十分钟类似
三、 数据结构设计
本次实训运用的是Python,在该任务中,主要运用了list(),for循环,以及if条件判断,例如:每个页面的打开、关闭、返回上个界面多次用到if条件判断语句;遍历列表的信息、读取存入到csv中的数据,多次用到for循环语句。
四、 存储结构设计
本次实训运用的是csv文件写入模块,运用csv的写入和读取这两个方法。例如:取号信息的写入、过期号码的写入用到了csv的写入方法;管理员读取排队列表、过期号码信息用到了csv的读取的方法。
五、 算法设计与分析
yell_code():在该函数中引用了time这一模块,运用了三次for循环实现了每隔十分钟叫取五个等待中的号码。每个号码叫三遍,每遍间隔三秒钟这一功能(叫号功能的实现)
take_code():在该函数中引用csv这一模块,把取号的信息写入csv列表中,加入list(),使得每个进入银行的客户能取到一个号码,并能根据自己取到的号看到自己还需等待多久(取号功能的实现)

六、 程序实现
import time
import csv
import datetime
def user_agent(x):#各种用户
if x==‘v’:
print(‘VIP用户:’)
print(‘请您直接去VIP客房直接办理业务’)
x=input()
if x==‘0’:
main()
elif x==‘1’:
print(‘普通用户:’)
welcome()
elif x==‘2’:
print(‘特殊用户:’)
print(‘请您去快速窗口直接办理业务’)
x=input()
if x==‘0’:
main()

def welcome():#欢迎普通用户取号界面
print(’*****************************’)
print(‘按1取号’+’\n’+‘按0返回上一界面’)
x = input()
if x ==‘1’:
number = 1001
take_code(number)
number +=1
return
elif x ==‘0’:
main()

def yell_code():#叫号实现的功能
print(‘如果叫号成功请输入y准备办理业务’+’\n’+‘如果叫号失败输入n当前号码作废’+’\n’+‘读取过期号列表请按r’)
l = list(range(1001,1101))
for i in l:
if i%50:
time.sleep(10)
n = l[l.index(i)-4:l.index(i)+1]
print(n)
for q in n:
for m in range(1,4):
time.sleep(3)
now_time = datetime.datetime.now()
print(‘第’+str(m)+‘次叫号’+’\n’+‘请’+str(q)+‘号办理业务’,now_time.strftime(’%Y/%m/%d %H:%M:%S’))
time.sleep(9)
x = input()
if x
’y’:
print(‘请办理业务’)
elif x ‘n’:
print(‘当前号码作废’)
read_info1(str(q))
elif x
’r’:
read_info2()
elif x==‘0’:
main1()

过期号码系统

def write_head1():#表头
csv_file = open(‘files\overtime.csv’,‘w’)
writer = csv.DictWriter(csv_file,fieldnames=[‘过期的号’,‘姓名’,‘银行卡号’,‘取号时间’],lineterminator = ‘\n’)
writer.writeheader()
print(writer)

def write_info1(number,bianhao,name,time):#录入过期号码表
csv_file = open(‘files/overtime.csv’,‘at’)
writer = csv.DictWriter(csv_file,fieldnames=[‘过期的号’,‘姓名’,‘银行卡号’,‘取号时间’],lineterminator = ‘\n’)
writer.writerow({‘取到的号’:number,‘姓名’:name,‘银行卡号’:bianhao,‘取号时间’:time})
def read_info2():#读取过期号码(overtime)表
csv_file = open(‘files/overtime.csv’,‘rt’)
data = csv.reader(csv_file)
for d in data:
print(d)
def read_info1(x):#过期文件录入
csv_file = open(‘files/code.csv’,‘rt’)
data = csv.reader(csv_file)
for d in data:
if x ==d[0]:
write_info1(d[0],d[1],d[2],d[3])
print(‘过期的号码:’+d[0]+’ ‘+‘姓名:’+d[1]+’ ‘+‘银行卡号:’+d[2]+’ '+‘取号时间:’+d[3])

取号系统

def write_head():#取号code表头
csv_file = open(‘files\code.csv’,‘w’)
writer = csv.DictWriter(csv_file,fieldnames=[‘取到的号’,‘姓名’,‘银行卡号’,‘取号时间’],lineterminator = ‘\n’)
writer.writeheader()
print(writer)
def read_info():#读取排队列表
csv_file = open(‘files/code.csv’,‘rt’)
data = list(csv.reader(csv_file))
for d in data:
if data.index(d)>0:
print(‘取到的号:’+d[0]+’ ‘+‘姓名:’+d[1]+’ ‘+‘银行卡号:’+d[2]+’ '+‘取号时间:’+d[3])
def write_info(number,bianhao,name,time):#录入排队列表
csv_file = open(‘files/code.csv’,‘at’)
writer = csv.DictWriter(csv_file,fieldnames=[‘取到的号’,‘姓名’,‘银行卡号’,‘取号时间’],lineterminator = ‘\n’)
writer.writerow({‘取到的号’:number,‘姓名’:name,‘银行卡号’:bianhao,‘取号时间’:time})

def take_code(number):#取号
while True:
print(‘请输入姓名:’)
name = input()
if name==‘0’:
welcome()
print(‘请输入银行卡号:’)
bianhao = input()
if bianhao==‘0’:
welcome()
now_time = datetime.datetime.now()
write_info(number,bianhao,name,now_time.strftime(’%Y/%m/%d %H:%M:%S’))
print(‘取号成功,等待叫号’)
print(‘您的编号是:’)
print(number)
print(‘您的取号时间是:’)
print(now_time.strftime(’%Y/%m/%d %H:%M:%S’))
print(‘按任意键继续取号,按y结束’)
number=number+1
x = input()
if x == ‘y’:
welcome()
x = input()
if x==‘1’:
take_code(number)
def main():#取号主函数
print(’*************************************’)
print('欢迎进入##银行系统取号系统
’)
print(’***************************************’)
print(‘如果您是VIP用户请输入v;’+’\n’+‘如果您是普通用户请输入1;’+’\n’+‘如果您是军人、烈士家属、残疾人请输入2;’)
print(‘退出系统请按0’)
x = input()
if x==‘0’:
main2()
user_agent(x)
def main1():#叫号主函数
print(’*************************************’)
print('欢迎进入##银行系统叫号系统
’)
print(’***************************************’)
print(‘按1请执行叫号任务’+’\n’+‘按2执行查看排队列表’+’\n’+‘按0返回上一界面’)
y = input()
if y==‘1’:
yell_code()

elif y=='2':
    read_info()
    print('请按0返回上一界面')
    x=input()
    if x=='0':
        main1()
elif y=='0':
    main2()

def main2():#主函数
print(‘如果您是用户请按1’+’\n’+‘如果您是管理员请按2’)
print(‘温馨提示按键0为返回上一界面’)
x = input()
if x==‘1’:
main()
elif x==‘2’:
main1()
elif x==‘0’:
print(‘已是首页’)
main2()

write_head()

write_head1()

main2()
七、 程序运行结果与分析
取号操作:
取号界面有三个用户选项,这也是考虑到用户的种群不同
叫号操作:
叫号操作叫号系统每隔十秒叫取五个等待中的号码。每个号码叫三遍,每遍间隔三秒钟

1.问题的定义即分析 银行叫号系统中大概能分成两个对象:一个为来的顾客,一个为银行本身 顾客(Customer)里面需要包含有数据: 【1】每个顾客都应该有一个标签以用来区分,因此需要一个ID(cID) 【2】问题中有求等待的时间,而有关等待时间的两个变量即为进入银行的时间以及接受服务的时间(enterTime和startTime) 【3】由于题目中说明顾客的服务时间不是固定的,因此每个顾客的服务时间又有区别,所以需要有一个变量来进行表示(serTime) 【4】顾客接受服务完后离开的时间(endTime) 综上:Customer中所需要的私有成员有(cID,enterTime,startTime,serTime,endTime) 而Customer的成员函数其实只是对以上数据进行输入输出,所以有成员函数有: 一系列的Set函数,一系列的Get函数,以及构造函数,复制函数,=的重载函数以及Reset函数 银行(bank)里面需要包含的数据: 银行中的人有两种状态,一是等待,二是接受服务,而这等待状态遵循先到先得的原则,因此,采用队列这种结构来表示这些状态比较合适,已经接受过服务的要反复输入输出,用容易遍历的数据类型vector 【1】处于等待状态的人(waiting) 【2】处于服务状态或已经接受过服务的人(serving) 由于经常要对waiting以及serving进行操作,所以不考虑将其作为私有成员(省去了Set以及Get函数) 考虑一下所含有的成员函数:Reset函数(保证银行是空的),Display函数(对已经接受过服务的以及正在服务的顾客进行展示),Assign()(断某个窗口是否是空的利用每次都改变的endTime - startTime == 随机生成的serTime判断 添加功能函数:查看最大等待时间以及其对应的人数的函数Maxwaiting 2.类与算法设计 类设计: class Customer { private: int enterTime; //进入银行的时间 int startTime; //开始服务的时间 int cID; //顾客的编号 int endTime; //顾客停止服务的时间 int serTime; //顾客服务从开始到结束服务所需要的时间(随机的) public: Customer(); //默认构造函数 Customer(const Customer &new;_customer); //复制函数 Customer &operator;=(const Customer&old;_customer); //=重载函数 void Reset(); //重置,将所有数据归零 int GetServDurance(); //返回等待时间 int GetEndTime(); //返回离开银行的时间 int GetSerTime(); //返回接受服务的时间 int GetStartTime();//返回开始接受服务的时间 int GetID(); //返回ID void SetEnterTime(int new_enter); void SetStartTime(int new_start); void SetEndTime(int new_end); void SetID(int new_ID); void SetSerTime(int new_sertime); }; class Bank { public: vector<Customer> serving; //在服务窗口接受过服务的人 queue<Customer> waiting; //在银行内等待的人 bool Assign(Customer customer); //判断第i个窗口的顾客是否服务完成 void Display(); //将在等待的人或者是已经接受了服务的人展示到屏幕上 void MaxWaiting(); void Reset(); }; 算法设计 随机数的产生: 【1】由于需要对过程进行模拟,所以需要一整套的模拟系统,包括产生随机人数,随机服务时间等等 【2】事实上,银行对服务窗口的更新是按照一定的时间(即每隔几秒刷新一次),同样的人也是类似,因此需要几个单位时间已确定进行这些随机事件发生的间隔 几个变量如下: const int UnitTime = 10;//单位时间为10 const int ServTime = 5;//服务时间为5-10 const int UnitTimePeo = 5;//单位时间进来的人数为5-10; const int StopEnterTime = TimeSlot - 2 * UnitTime;//为了保证所有顾客能完成服务,顾客进入的时间为0-80 const int PerTime = 5;//每隔5秒显示一次窗口信息 int TimeOfServing = 0;//随机生成的服务时间(5-10) int Number = 0; //随机生成的人数(5-10) 通过这些变量以及srand((unsigned)time(0)),rand()即可产生一系列的随机数以便进行模拟 过程的模拟 每当产生一系列随机的人,就将他们放进waiting的队列中去,接着遍历各个窗口,若窗口为空,则先来的人可以去那个窗口(即push到serving,pop掉waiting),若不为空,则改变结束时间,之后Present + 1 显示内容:剩余的时间,各窗口的情况,以及已经接受了服务的人的等待时间 注意:该程序为每五刷新一次,每十随机进入一些人
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值