共21页
北京电子科技学院
《数据结构课程设计》实验报告
题目:银行排队模拟系统
班级:0921
姓名:韩晓雪
学号:1
完成日期:2024/9/9
一、问题描述
银行业务越来越丰富,有一般的客户存款或取款、理财金(股票、基金等业务)、外币服务等。每天来银行的客户越来越多,为免除客户排队等待,日前银行均设计有排队管理系统。试编程模拟管理银行的排队业务。
题目要求:
(1)设置有排队机器,可以实现“理财金”“外币”“个人服务”等3种业务的排队。
(2)银行窗口接待服务。接待窗口分3种“理财”“外币”和“个人业务”,理财和外币业务由专用窗口接待,且这些专用窗口接待完本类业务之后,将继续进行“个人业务”服务。直到全部客户服务均完成。
二、需求分析
根据客户办理业务的需求,银行设有“个人业务”、“理财业务”和“外币业务”3种业务的办理,且“理财业务”的优先级高于“外币业务”。本程序将根据客户选择要办理的业务类型,等候办理业务的客户进行队伍编排。工作人员控制每位客户的业务办理时间。
程序开始:第一位客户选择要办理的业务类型后。
程序结束:3个窗口均无人办理业务。
三、概要设计
(一)程序功能:
本程序可以实现对办理不同业务的客户进行合理编排,尽量减少客户等待时间,同时客户可以从界面获得自己的排队情况,并可以了解到当前日期和时间。
1、选择业务:客户从应用程序界面上选择要办理的业务类型。
2、产生编号:程序通过客户选择业务来为其排号,业务不同,客户获得的编号类型不同。
3、显示排队情况:将客户的编号、所排窗口、所在队伍位置显示在应用程序界面上,模拟排队情况。
4、刷新队伍:每位客户业务办理结束后,工作人员提醒下一位客户,当2号窗口、3号窗口业务办理结束且1号窗口仍有人在办理业务,则将在1号窗口前排队的客户分配到2号窗口、3号窗口去。分配方法是:当2、3窗口同时为空时,先分配给2号窗口,若此时仍有客户在1号窗口排队,则再分配给3号窗口。
5、排号算法:若客户选择“理财”或“外币”业务,则分别将其直接排到
2号窗口、3号窗口的队伍中,若客户选择“个人业务”,则要进行如下判断:
(1)若1号窗口无人办理业务,则安排其到1号窗口办理业务;
(2)若1号窗口有人在办理业务,则一次判断2号窗口、3号窗口是否有
人办理业务,若没有则安排其在无人窗口办理业务;
(3)若3个窗口均有人在办理业务,则将其排到1号窗口的队伍中。
(二)对象说明
1、窗体:1个窗体,用于设计应用程序界面。
2、Label控件:14个Label控件,用于做文字说明或信息提示。
3、Button控件:7个Button控件,用于接受客户的命令,然后执行该命令所对应的事件过程中的程序代码。
4、Te_tBo_控件:4个Te_tBo_控件,用于输出文本信息
5、Timer控件:3个Timer控件,用于触发事件。
6、DataTimePicker1控件1个:获取当前日期,观看日历。
四、详细设计
本程序通过数组来实现对排队客户的存储,再通过te_tbo_以文本形式将排队情况显示出来。
(一)数据
(二)事件说明
1、Button6_Click
客户选择个人业务,将客户放在数组geren()中,数组元素加1,
并给客户相应的编号,编号加1,根据排号算法,将客户排在合适的窗口并显示。
若排队人数多于25人,显示提示信息,同时停止个人业务办理。
2、Button7_Click
客户选择理财业务,将客户放在数组licai()中,数组元素加1,
并给客户相应的编号,编号加1,根据排号算法,将客户排在2号窗口并显示。
若2号窗口排队人数多于25人,显示提示信息,同时停止理财业务
3、Button8_Click
客户选择外币业务将客户放在数组waibi()中,数组元素加1,并
给客户相应的编号,编号加1,根据排号算法,将客户排在3号窗口并显示。
若3号窗口排队人数多于25人,显示提示信息,同时停止外币业务
4、Button1_Click
工作人员接待当前客户完毕后,在显示排队情况的文本中清除该客户
编号,下一位前往办理业务。
1号窗口排队人数小于25人时,撤销提示信息,恢复个人业务的办理。
5、Button2_Click
工作人员接待当前客户完毕后,在显示排队情况的文本中清除该客户
编号,下一位前往办理业务。
2号窗口排队人数小于25人时,撤销提示信息,恢复理财业务的办理。所有理财业务办理结束后,触发timer6。
6、Button4_Click
工作人员接待当前客户完毕后,在显示排队情况的文本中清除该客户
编号,下一位前往办理业务。
3号窗口排队人数小于25人时,撤销提示信息,恢复外币业务的办理。所有理财业务办理结束后,触发timer5。
7、Button3_Click
退出程序。
8、Timer6_Tick
2号窗口为空,且1号窗口仍有人排队,将排在1号窗口的第一位客
户转到2号窗口办理业务。
1号窗口排队人数小于25人时,撤销提示信息,恢复个人业务的办理。3个窗口均为空,退出程序。
9、Timer5_Tick
3号窗口为空,1、2号窗口均不空,将排在1号窗口的第一位客户转
到3号窗口办理业务。
3号窗口为空是,2号窗口也为空,则无动作。
1号窗口排队人数小于25人时,撤销提示信息,恢复个人业务的办理。3个窗口均为空,退出程序。
10、Timer4_Tick
数字时钟,显示当前时间。
(三)交互关系
五、测试分析
提示:在各窗口下的第一个编号,即是在该窗口正在办理业务的客户的编号。
(一)测试数据和测试结果
测试1:
客户(G)办理个人业务时,3个窗口都为空。
测试2:
客户(G)办理个人业务时,只有2号窗口有人在办理业务。
测试3:
客户(G)办理个人业务时,只有3号窗口有人在办理业务。
测试4:
客户(G)办理个人业务时,2号、3号窗口都有人在办理业务。
测试5:
客户(L)办理理财业务。
测试6:
客户(W)办理外币业务。
测试:7:
客户(G-2)来办理个人业务时,3个窗口均有人在办理业务。
测试8:
3个窗口都在办理业务过程中,3号窗口结束接待后,1号、2号窗口都有客户在排队。
测试9:
3个窗口都在办理业务过程中,2号窗口结束接待后,1号、3号窗口仍有客户在排队。
测试10:
3个窗口都在办理业务过程中,3号和2号窗口同时结束接待后,1号窗口仍有客户在排队。
测试11:
某窗口排对人数超过25人。
(二)遇到的问题和解决方法:
问题1:
当2号、3号窗口同为空时,排在1号窗口的第一为客户的编号会出现在2号、3号两个窗口中。
经分析,这是由于没有考虑两个窗口的优先级所致,于是我设置办理理财业务的2号窗口的优先级高于办理外币业务的3号窗口。当两窗口同
为空时,先给2号窗口分配客户,之后,若1号窗口仍有人排队,再分配给3号窗口。
问题2:
各窗口无限排队问题。
通过判断显示排队情况的文本的字符长度,来确定各窗口正在排队
人数,多于25人时,系统显示提示信息,同时暂停接收对应业务的办理。
六、实验总结
通过为期10天的数据结构课程设计,在老师们的指导帮助下,我完成了银行排队模拟系统的程序设计,在这次课程设计中,我收获良多。
课程设计不同于平时的编程实验,它的要求更多更全面,需要程序编写者在前期做出准确的需求分析,还有后期全面的程序测试,这些都是在过去的学习中很少接触到的。通过老师的讲解和自身在编程中的实践,我深刻体会到需求分析可以使得程序更贴近生活,更具实用性,而全面到位的程序设计则可以保证程序的实用性和健壮性。
起初我对所选题目的理解不够到位,只设计了系统中的客户界面,也因此不能确定每个客户办理业务所需具体时间,只能通过时间控件,以固定的时间频率刷新队伍,也就是所有将客户办理业务的时间限制在同样的时间里(5分钟),这使得程序不够人性化,后经过老师的提醒和指导,我添加了工作人员界面,由工作人员通过来控制客户的办理时间,这样也就实现了系统的“叫号”功能,也使得客户和工作人员通过系统有了信息的交换。
这次课程设计使我加强了自身的编程能力的同时,也让我认识到要将所学灵活的应用到实际生活中去,不可以凭空想象,要着眼实际,找到生活所需,理论里联系实际,才可以编写出真正有价值的程序。
感谢各位老师在这些天来对我的指导和帮助,让我及时看到错误并得以改正。在今后的学习中我会更加仔细认真,真正做到学以致用。
附:程序代码
PublicClassForm1
Dima,b,c,num1,num2,num3AsInteger
Dimgeren(1000),licai(1000),waibi(1000)AsString'分别为用来存储排在个人业务\理财业务\外币业务窗口的客户的数组
PrivateSubTimer4_Tick(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesTimer4.Tick
Te_tBo_4.Te_t=TimeOfDay()'数字时钟
EndSub
PrivateSubButton6_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton6.Click
num1=num1+1
Label3.Te_t="您的的编号为:G-"num1'num1为办理个人业务客户的编号
'通过判断各窗口有无业务正在办理,安排办理个人业务客户的排队位置
IfMe.Te_tBo_1.Te_t.Trim=String.EmptyThen
Callg()'调用函数g()
ElseIfMe.Te_tBo_2.Te_t.Trim=String.EmptyThen
licai(b)=num1'将该客户编号存入licai数组,b为licai数组的数组元素标号
Te_tBo_2.Te_t=Te_tBo_2.Te_t"G-"licai(b)
Te_tBo_2.Te_t=Te_tBo_2.Te_tvbCrLf
b=b+1'排在号窗口,并将其号码显示在文本框输出
ElseIfMe.Te_tBo_3.Te_t.Trim=String.EmptyThen
waibi(c)=num1'将该客户编号存入waibi数组,c为weibi数组的数组元素标号()
Te_tBo_3.Te_t=Te_tBo_3.Te_t"G-"waibi(c)
Te_tBo_3.Te_t=Te_tBo_3.Te_tvbCrLf
c=c+1'排在号窗口,并将其号码显示在文本框输出
Else
Callg()
EndIf
'提醒客户要排队的窗口前排队等候的人数多于
IfTe_tBo_1.Te_tLength>125Then
Label7.Visible=True
Label7.Te_t="排队等候多于人!"
Button6.Enabled=False
Else
Label9.Visible=False
EndIf
EndSub
PrivateSubButton7_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton7.Click
num2=num2+1'num2为办理理财业务客户的编号
Label3.Te_t="您的的编号为:L-"num2
licai(b)=num2'将该客户编号存入licai数组
Te_tBo_2.Te_t=Te_tBo_2.Te_t"L-"licai(b)
Te_tBo_2.Te_t=Te_tBo_2.Te_tvbCrLf
b=b+1'排在号窗口,并将其号码显示在文本框输出
IfTe_tBo_2.Te_tLength>125Then
Label8.Visible=True
Label8.Te_t="排队等候多于人!"
Button7.Enabled=False
EndIf
EndSub
PrivateSubButton8_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton8.Click
num3=num3+1'num2为办理理财业务客户的编号
Label3.Te_t="您的的编号为:W-"num3
waibi(c)=num3'将该客户编号存入waibi数组
Te_tBo_3.Te_t=Te_tBo_3.Te_t"W-"waibi(c)
Te_tBo_3.Te_t=Te_tBo_3.Te_tvbCrLf
c=c+1'排在号窗口,并将其号码显示在文本框输出
'提醒客户要排队的窗口前排队等候的人数多于
IfTe_tBo_3.Te_tLength>125Then
Label9.Visible=True
Label9.Te_t="排队等候的人数多于!"
Button8.Enabled=False
Else
Label9.Visible=False
EndIf
EndSub
PrivateSubg()
geren(a)=num1'将该客户编号存入geren数组,a为geren数组的数组元素标号
Te_tBo_1.Te_t=Te_tBo_1.Te_t"G-"geren(a)
Te_tBo_1.Te_t=Te_tBo_1.Te_tvbCrLf
a=a+1'排在号窗口,并将其号码显示在文本框输出EndSub
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
'将号窗口办完业务的客户的编号从文本框中撤除
Dima1,a2AsString
a1=Te_tBo_1.GetFirstCharInde_FromLine(0)'第一行第一个字符的索引
a2=Te_tBo_1.GetFirstCharInde_FromLine(1)'第二行第一个字符的索引
Te_tBo_1.Select(a1,a2)'选中第一行
Te_tBo_1.SelectedTe_t=""'设置第一行的内容为空
IfTe_tBo_1.Te_tLength<=125Then'排队人数小于等于人时,撤除提醒
Label7.Visible=False
Button6.Enabled=True
EndIf
IfTe_tBo_1.Te_tLength=0Then
IfTe_tBo_2.Te_tLength=0Then
IfTe_tBo_3.Te_tLength=0Then
EndIf
EndIf
EndIf
EndSub
PrivateSubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handles
Button2.Click
'将号窗口办完业务的客户的编号从文本框中撤除
Dimb1,b2AsString
b1=Te_tBo_2.GetFirstCharInde_FromLine(0)
b2=Te_tBo_2.GetFirstCharInde_FromLine(1)
Te_tBo_2.Select(b1,b2)
Te_tBo_2.SelectedTe_t=""
'当号窗口前为空时,触发timer6
IfTe_tBo_2.Te_tLength=0Then
Timer6.Enabled=True
Else
Timer6.Enabled=False
EndIf
IfTe_tBo_2.Te_tLength<=125Then
Label8.Visible=False
EndIf
IfTe_tBo_2.Te_tLength<=125Then
Label8.Visible=False
Button7.Enabled=True
EndIf
IfTe_tBo_1.Te_tLength=0Then
IfTe_tBo_2.Te_tLength=0Then
IfTe_tBo_3.Te_tLength=0Then
EndIf
EndIf
EndIf
EndSub
PrivateSubButton4_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton4.Click
'将号窗口办完业务的客户的编号从文本框中撤除
Dimc1,c2AsString
c1=Te_tBo_3.GetFirstCharInde_FromLine(0)
c2=Te_tBo_3.GetFirstCharInde_FromLine(1)
Te_tBo_3.Select(c1,c2)
Te_tBo_3.SelectedTe_t=""
'当号窗口前为空时,触发timer5
IfTe_tBo_3.Te_tLength=0Then
Timer5.Enabled=True
Else
Timer5.Enabled=False
EndIf
IfTe_tBo_3.Te_tLength<=125Then
Label9.Visible=False'排队人数小于等于人时,撤除提醒
Button8.Enabled=True
EndIf
IfTe_tBo_1.Te_tLength=0Then
IfTe_tBo_2.Te_tLength=0Then
IfTe_tBo_3.Te_tLength=0Then
EndIf
EndIf
EndIf
EndSub
PrivateSubTimer5_Tick(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesTimer5.Tick
Dimd1,d2,f1,f2AsString
'当号窗口为空,1号窗口仍有人排队,且号窗口不为空时,将号窗口排队的第一个客户转到号窗口IfTe_tBo_1.Te_tLength>5Then
IfTe_tBo_2.Te_tLength>0Then
d1=Te_tBo_1.GetFirstCharInde_FromLine(1)
d2=Te_tBo_1.GetFirstCharInde_FromLine(1)
Te_tBo_1.Select(d1,d2)
Te_tBo_1.Cut()
f1=Te_tBo_3.GetFirstCharInde_FromLine(0)
f2=Te_tBo_3.GetFirstCharInde_FromLine(1)
Te_tBo_3.Select(f1,f2)
Te_tBo_3.Paste()
Timer5.Enabled=False
EndIf
'当号窗口仍有人排队,且号窗口为空时,无动作
ElseIfTe_tBo_1.Te_tLength>5Then
IfTe_tBo_2.Te_tLength=0Then
EndIf
ElseIfTe_tBo_1.Te_tLength=0Then
IfTe_tBo_2.Te_tLength=0Then
IfTe_tBo_3.Te_tLength=0Then
EndIf
EndIf
Else
EndIf
IfTe_tBo_1.Te_tLength<=125Then
Label7.Visible=False'排队人数小于等于人时,撤除提醒
Button6.Enabled=True
EndIf
EndSub
PrivateSubTimer6_Tick(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesTimer6.Tick
'2号窗口为空,1号窗口仍有人排队时,将号窗口排队的第一个客户转到号窗口
Dime1,e2,g1,g2AsString
IfTe_tBo_1.Te_tLength>5Then
g1=Te_tBo_1.GetFirstCharInde_FromLine(1)
g2=Te_tBo_1.GetFirstCharInde_FromLine(1)
Te_tBo_1.Select(g1,g2)
Te_tBo_1.Cut()
e1=Te_tBo_2.GetFirstCharInde_FromLine(0)
e2=Te_tBo_2.GetFirstCharInde_FromLine(1)
Te_tBo_2.Select(e1,e2)
Te_tBo_2.Paste()
Timer6.Enabled=False
EndIf
IfTe_tBo_1.Te_tLength=0Then
IfTe_tBo_2.Te_tLength=0Then
IfTe_tBo_3.Te_tLength=0Then
EndIf
EndIf
EndIf
IfTe_tBo_1.Te_tLength<=125Then
Label7.Visible=False'排队人数小于等于人时,撤除提醒
Button6.Enabled=True
EndIf
EndSub
PrivateSubButton3_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton3.Click
End'退出程序
EndSub
EndClass
举报
