银行业务系统77.docx
《银行业务系统77.docx》由会员分享,可在线阅读,更多相关《银行业务系统77.docx(23页珍藏版)》请在冰豆网上搜索。
银行业务系统77
银行业务系统77
数据结构与算法课程设计实验报告
一、实验问题描述-------------------------2
二、实验需求分析-------------------------3
三、软件概要设计-------------------------4
四、软件详细设计-------------------------5
五、编码与调试分析----------------------14
六、程序运行操作说明--------------------15
七、测试结果----------------------------16
八、课程设计心得体会--------------------18
九、自主学习参考文献--------------------19
1
数据结构与算法课程设计实验报告
一、实验问题描述:
本课程设计的目的就是要达到能够灵活运用程序设计基础所讲授内容,能够针对一个需求比较明确的小型软件,设计合理的解决方案,并能够用编程语言转化为可执行程序,以解决实际问题。
进一步掌握开发一个小型实用软件系统的基本步骤和方法、进一步培养良好的编程习惯、提升学习能力,熟练掌握数据结构中所学知识,并加以运用到实际软件开发中去,掌握调试代码的基本方法,通过调试找出BUG出现的地方以及原因,并运用正确的方法进行DEBUG。
设银行有四个服务窗口,一个等待队列,每个窗口均可以办理存款、取款、挂失、还贷业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候,当任一服务窗口空闲时,处理等候客户中排在最前面的客户的业务。
写一个上述银行业务的模拟系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
基本要求:
每个客户到达银行的时间和需要办理的业务随机产生,输出一天客户在银行的平均逗留时间和每个窗口每天办理的客户数和每种业务数。
提高要求:
设计图形用户界面,模拟中国银行真实的打号机操作界面,当用户选择一种业务后,要提示用户排在前面的人数。
测试数据:
营业时间为8小时,其他模拟量自行设定。
每个人在生活中都会随时随地的和银行业务接触,因而也造成了银行工作人员的业务繁忙,同时大量的办理业务客户的出现也扰乱了银行秩序。
因此在实际生活中需要的前提下,诞生银行业务办理系统是必然的。
每个客户到达银行后自行到打号机前打取自己的票号,从而就产生了一个银行业务办理等待队列,每个客户都根据自己的小票信息在银行等待办理自己的业务,从而有效地解决了客户多引起的秩序混乱,当某个窗口空闲时,等待队列中的最前一个客户就到当前空闲的窗口办理自己的业务,后面的客户继续等待,直到再一个空闲窗口出现。
通过对以上功能的实现,从而在实际生活中解决了人们日常生活中的银行业务办理需求,解决生活中的实际问题,方便人们的生活和工作,提高办事效率和生活质量。
二、实验需求分析:
2.1、软件的基本功能
银行有四个服务窗口,一个等待队列,每个窗口均可以办理存款、取款、挂失、还贷业务,每种业务所需的服务时间不同,客户到达银行后,先到打号机上打号,号票上包括到达时间、编号和需要办理的业务,然后在银行内等候,当任
2
数据结构与算法课程设计实验报告
一服务窗口空闲时,处理等候客户中排在最前面的客户的业务。
银行业务的模拟系统,通过模拟方法求出客户在银行内逗留的平均时间和每个窗口办理的客户数及办理的每种业务数。
设计图形用户界面,模拟中国银行真实的打号机操作界面,当用户选择一种业务后,要提示用户排在前面的人数。
2.2、程序执行时的输入/输出形式
按照程序执行是的界面提示选择操作顺序,若需要执行银行业务模拟,则在菜单选项中选择执行,如果执行成功系统会提示模拟信息生成成功,否则会提示无可查信息;信息生成完成后选择执行显示客户逗留时间,就可以输出当天模拟情况下的总模拟人数,当天银行下班为止总共办理的客户数量,和未办理完业务的客户数量,和客户当天在银行的平均逗留时间;选择显示各窗口业务统计信息可看到当天的四个窗口的业务办理情况,分别办理了那些业务和各种业务的总数;也可按窗口分别显示四个窗口分别办理了那些客户的业务,以及他们的业务办理信息;另外可以手动选择业务并产生相应的到达时间切输出打号的信息。
如果输入值与要求不符合,则系统会提示输入数据错误,并重新输入或者结束程序。
2.3、测试数据要求
程序执行时按照既定的数据类型及大小分别输入有效数据,若出现输入数据与既定数据类型及大小不符合则输出错误提示并选择执行下一步。
三、软件概要设计:
(1)抽象数据类型:
根据题目的要求,考虑用队列类型比较适合。
ADTQueue
Data
队列中元素具有相同类型及先进先出特性,相邻元素具有前驱和后继
关系
Operation
InitQueue
前置条件:
队列不存在
输入:
无
功能:
初始化队列
输出:
无
后置条件:
创建一个空队列
DestroyQueue
前置条件:
队列已存在
3
数据结构与算法课程设计实验报告
输入:
无
功能:
销毁队列
输出:
无
后置条件:
释放队列所占用的存储空间
EnQueue
前置条件:
队列已存在
输入:
元素值x
功能:
入队操作,在队尾插入一个元素x
输出:
如果插入不成功,抛出异常
后置条件:
如果插入成功,队尾增加了一个元素
DeQueue
前置条件:
队列已存在
输入:
无
功能:
出对操作,删除对头元素
输出:
如果删除成功,返回被删元素值,否则,抛出异常
后置条件:
如果删除成功,对头减少了一个元素
GetQueue
前置条件:
队列已存在
输入:
无
功能:
读取当前的对头元素
输出:
若队列不空,返回当前的对头元素值
后置条件:
队列不变
Empty
前置条件:
队列已存在
输入:
无
功能:
判断队列是否为空
输出:
如果队列为空,返回1;否则,返回0
后置条件:
队列不变
EndADT
4
数据结构与算法课程设计实验报告
(2)主程序流程:
开始
输入数据
判断是否是整型输入数据数错误
判断是否打号无可查信
息
业务生成成功,请
等待
结束
5
数据结构与算法课程设计实验报告
(3)模块调用关系:
本程序中函数包括:
main函数,队列操作相关函数;
Personnel_Func(Tickett2[],intn,ints)函数,手动业务生成函数,可选择要生成的业务同时产生一个到达时间和打票信息;
Ticket_Produce_Function(Tickett[],intn)函数,自动生成客户到达银行时的打票信息,其中包括到达时间,小票编号,业务种类;
Personnel_Distribution_Func(intn,intflag)函数,业务办理函数,等待队列中的每个元素出对后通过时间的计算和窗口闲忙的判断把客户分配到各个窗口办理业务;
Business_statistic_Func(Windowswin[],intm)函数,统计各个窗口当天办理的各种业务种类,以及各种业务的数量;
Display_Business_Func(Windowswin[],intm,intn,intcoordinate)函数,按窗口分别显示各个窗口办理了那些客户的业务,以及数量;
Make_waittime_Func(intn)函数,计算当天银行中办理业务的所有客户在银行的逗留时间,以及当天总共办理了多少客户的业务和有多少客户的业务在下班时还没有办理业务;
Menu()函数,模拟输出银行业务办理系统的打号菜单,并分类显示各个窗口业务办理情况。
6
数据结构与算法课程设计实验报告
其函数调用关系如下:
Mian()
Menu()
Personnel_Make_waitBusinessDisplay_Personne
Distributiontime_Func(_statisticBusinessl_Func(T
intn)_Func(int_Func(W_Func(Wicket
n,intflag)indowsindowst2[],int
n,ints)win[],intwin[],int
m)m,int
n,int
coordinat
e)
Ticket_ProdPersonnel_uce_FunctioDistribution(Ticketn_Func(intt[],intn)n,intflag))
7
数据结构与算法课程设计实验报告
4(详细设计
(1)实现概要设计的数据类型:
采用队列
constintQueueSize=1000;
template//定义模板类BankBusinses
classBankBusinses
{
public:
BankBusinses();
voidEnQueue();
intGetQueue();
voidPersonnel_Func(Tickett2[],intn,ints);//手动业务生成函数
intTicket_Produce_Function(Tickett[],intn);//打号函数
intPersonnel_Distribution_Func(intn,intflag);//业务办理函数
intBusiness_statistic_Func(Windowswin[],intm);//业务统计函数
voidDisplay_Business_Func(Windowswin[],intm,intn,intcoordinate);//
业务显示函数
voidMake_waittime_Func(intn);//等待时间函数
intMenu();//菜单函数
Windowswin[4];//窗口
Ticket
t[QueueSize];//票
Tickett2[QueueSize];
private:
stringname;//业务名称
intbusinesstime;//办理业务所需时间
intalltime;//办理所有业务的总时间
intwaittime;//等待时间
doubleaveragetime;//平均等待时间
long*a,*b,*v;
intdata[QueueSize];
Ticketdata2[QueueSize];
intfront,rear;
};
8
数据结构与算法课程设计实验报告
(2)主程序以及其它模块的算法描述:
主函数具体代码:
intmain()
{BankBusinsesC;
while
(1){switch(C.Menu()){
case1:
srand(time(0));
n=(rand()%(500-1)+1);
for(i=0;iC.t[i].arrivaltime.minute=rand()%60;
C.t[i].arrivaltime.second=rand()%60;}
C.Ticket_Produce_Function(C.t,n);
C.EnQueue();
C.GetQueue();
C.Personnel_Distribution_Func(n,0);
break;
case2:
if(flag==0){cout<<"\t\t无可查询信息!
\n";}
else{C.Make_waittime_Func(n);}
break;
case3:
if(flag==0){cout<<"\t\t无可查询信息!
\n";}
else{C.Business_statistic_Func(C.win,4);}
break;
case4:
if(flag==0){cout<<"\t\t无可查询信息!
\n";}
else{C.Display_Business_Func(C.win,4,n,0);}
break;
case5:
if(flag==0){cout<<"\t\t无可查询信息!
\n";}
else{C.Display_Business_Func(C.win,4,n,1);}
break;
case6:
if(flag==0){cout<<"\t\t无可查询信息!
\n";}
else{C.Display_Business_Func(C.win,4,n,2);}
break;
case7:
if(flag==0){cout<<"\t\t无可查询信息!
\n";}
else{C.Display_Business_Func(C.win,4,n,3);}
break;
case8:
for(i=0;iwhile(cin>>m,!
cin.eof())if(!
cin.good()){
9
数据结构与算法课程设计实验报告
cin.clear();
cin.ignore();
cout<<"\t\t输入错误!
\n\t\t请重新输入!
";
Sleep(1000);}
elseif(m!
=0&&m!
=1){
Sleep(1000);}
elseif(cin.good()&&(m==0||m==1)){
if(m==0)
{tag=1;}
break;}}
if(tag==1)break;
C.Personnel_Func(C.t2,0,m);}
break;
case0:
//如返回值为0则程序结束
cout<<"\t\tOVER!
\n";
exit(0);}}
return0;}
主函数的功能调用了各个实现函数。
首先是调用菜单函数显示出模拟菜单,提示用户按照要求进行选择操作,输入有误则会重新操作,否则进行下一个功能函数的调用,产生模拟客户的基本业务信息,在信息随机产生后就会调用核心函数把办理业务的客户根据实际情况分配到不同的窗口办理自己的业务。
调用时间计算函数确定客户平均逗留时间和办理客户的人
。
数。
最后是清屏函数。
直至用户选择退出
(3)其它模块的算法描述
打号函数
功能:
调用随机函数产生客户到达银行的随机时间和随机业务,并通过
冒泡法对所有时间排序,然后进入队列等待。
intBankBusinses:
:
Ticket_Produce_Function(Tickett[],intn)
{
srand(time(0));
n=(rand()%(500-1)+1);
for(i=0;i{//产生客户到达银行的随机时间
C.t[i].arrivaltime.hour=(rand()%(17-9)+9);
C.t[i].arrivaltime.minute=rand()%60;
C.t[i].arrivaltime.second=rand()%60;
}
for(i=0;i{
t[i].number=i;//编号产生
rear=(rear+1)%QueueSize;
data[rear]=t[i].number;//产生的编号入队
sign=(rand()%(5-1))+1;
10
数据结构与算法课程设计实验报告
t[i].business=sign;//产生随机客户业务
}
}
处理客户业务函数
功能:
调用打号函数对队列中的元素分配到不同的窗口办理业务。
intBankBusinses:
:
Personnel_Distribution_Func(intn,intflag)
{
intc[4]//作用是对应储存四个窗口业务办理结束的时间,在循环过程中
后一个业务办理结束时间将修改当前结束时间
Ticket_Produce_Function(t,n);//调用时间生成函数
c[0]=a[0]+b[0];//第一个窗口结束时间初值为队列中第一个客户办理业务的结束时间
waittime=b[0];//第一个客户的逗留时间
int*d;
d=newint[4];//动态申请长度为四的一维数组,用于存放被修改结束时间的窗口的序号,判断四个窗口中的结束时间是否大于下一个客户办理业务的开始时间,如果小于则数组的d[j]中保存该窗口的序号,否则该地址存为-1,判断窗口序号保存数组d[j]中是否有被保存的窗口序号,若有则结束,且记住该窗口序号;
如果有窗口序号被修改,则继续修改当前结束时间为下一个客户的业务办理结束时间,窗口各种业务累计,如果当前窗口序号全未被修改,即当前所有窗口均处于忙碌状态,下一个客户需等待,找出当前所有正在办理业务的窗口中,结束时间最早的窗口;
c[k]=c[k]+b[i+1];//修改该窗口的结束时间,即下一个在等待的客户到该窗口办理业务,窗口各种业务累计
}
窗口业务统计函数
功能:
统计各个窗口办理业务的情况,人数以及各种业务种类。
intBankBusinses:
:
Business_statistic_Func(Windowswin[],intm)
{inti,n=0,allnum=0;
for(i=0;i<4;i++)
{
allnum=win[i].withdrawals+win[i].deposit+win[i].reportloss+win[i].borrowed;
cout<<"\t\t\t\t窗口"<
cout<cout<<"取款人数"<<"\t存款人数"<<"\t挂失人数"<<"\t还贷人数"<<"\t办理业务总数";
cout<<}
窗口业务显示函数
11
数据结构与算法课程设计实验报告
功能:
显示各个窗口当天的业务办理情况。
voidBankBusinses:
:
Display_Business_Func(Windowswin[],intm,intn,int
coordinate)
{intj,flag=1;
cout<<"\t\t\t\t窗口"<";
cout<for(j=0;jif(v[j]==coordinate){
cout<flag=0;}}
if(flag==1){
cout<<"\t\t该窗口当天没有办理业务!
\n";}}
等待时间函数
功能:
计算当天所有客户在银行的平均逗留时间,和当日总共办理的客
户数,和未办理完业务的客户数。
voidBankBusinses:
:
Make_waittime_Func(intn){
flag=Personnel_Distribution_Func(n,flag);
if((n-flag-1)!
=0){
cout<<"\t\t未办理完业务的编号:
"<"<aver=(waittime/(flag+1))/60.0;
for(i=flag+2;iaveragetime=((waittime+waittime2)/n)/60.0;}
5、编码与调试分析
编码与调试过程中遇到的问题及解决办法:
【问题一】:
随机产生的时间无序,等待队列需按照有序等待。
解决办法:
定义时间结构体类型的数组存储时间,然后对时间进行排序并进入队列。
解决此问题的核心代码:
for(i=0;ifor(j=i+1;jif(t[i].arrivaltime.hour>t[j].arrivaltime.hour)
{temp=t[i].arrivaltime.hour;
t[i].arrivaltime.hour=t[j].arrivaltime.hour;
t[j].arrivaltime.hour=temp;
temp=t[i].arrivaltime.minute;
t[i].arrivaltime.minute=t[j].arrivaltime.minute;
t[j].arrivaltime.minute=temp;
temp=t[i].arrivaltime.second;
t[i].arrivaltime.second=t[j].arrivaltime.second;
t[j].arrivaltime.second=temp;}}
12
数据结构与算法课程设计实验报告
for(i=0;ifor(j=i+1;jif(t[i].arrivaltime.hour==t[j].arrivaltime.hour&&t[i].arrivaltime.minute>t[j].arrivaltime.minute){
temp=t[i].arrivaltime.minute;
t[i].arrivaltime.minute=t[j].arrivaltime.minute;
t[j].arrivaltime.minute=temp;
temp=t[i].arrivaltime.second;
t[i].arrivaltime.second=t[j].arrivaltime.second;
t[j].arrivaltime.second=temp;}
elsecontinue;}
for(i=0;ifor(j=i+1;jif(t[i].arrivaltime.hour==t[j].arrivaltime.hour&&t[i].arrivaltime.minute==t[j].arrivaltime.minute&&t[i].arrivaltime.second>t[j].arrivaltime.second){
temp=t[i].arrivaltime.second;
t[i].arrivaltime.second=t[j].arrivaltime.second;
t[j].arrivaltime.se