26银行业务模拟汇总.docx
《26银行业务模拟汇总.docx》由会员分享,可在线阅读,更多相关《26银行业务模拟汇总.docx(14页珍藏版)》请在冰豆网上搜索。
![26银行业务模拟汇总.docx](https://file1.bdocx.com/fileroot1/2023-3/28/2137876a-4444-4bbf-aa5e-b05a77173f4c/2137876a-4444-4bbf-aa5e-b05a77173f4c1.gif)
26银行业务模拟汇总
银行业务模拟
一.实验目的
本次实习的目的在于使读者深入了解栈和队列的特性,以便在实际问题背景下灵活运用他们;同时还将巩固对这两种结构的构造方法的理解。
二.实验内容
【问题描述】客户业务分为两种。
第一种是申请从银行得到一笔资金,即取款或借款。
第二种是向银行投入一笔资金,即存款或还款。
银行有两个服务窗口,相应的有两个队列。
客户到达银行后先排第一队。
处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立即排入第二个队等候,直至满足时才离开银行,否则业务处理完后立即离开银行。
每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。
注意在此检查过程中,一旦银行资金总额少于或等于刚才第一个对列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查和处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个对列的客户,任何时刻都只开一个窗口。
假设检查不需要时间。
营业时间结束时所有客户立即离开银行。
写一个上述银行业务的事物驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。
【基本要求】利用动态存储结构实现模拟。
三.实验步骤(可选)
#include
#include
#include
#include
usingnamespacestd;
structservice{
intnum;//客户号
stringtype;//到达或离开
intbeginTime;//到达时间
intendTime;//离开时间
intmoney;//正数为存款,负数为取款
service*next;};//指针域
structqueue{//队列
service*head;//队列头指针
service*rear;//队列尾指针
};
inttotal;//初始时银行现存资金总额
intcloseTime;//营业结束时间
intarriveMaxTime;//两个到达事件之间的间隔上限
intarriveMinTime;//两个到达事件之间的间隔下限
intdealMaxTime;//客户之间交易的时间上限
intdealMinTime;//客户之间交易的时间下限
intdealMaxMoney;//交易额上限
intndn=0;//需要存款的人数
intnwn=0;//需要取款的人数
intsdn=0;//成功存款的人数
intswn=0;//成功取款的人数
intcurrentTime=0;//当前时间
inttotalTime=0;//客户逗留总时间
intcounter=0;//客户总数
intnumber=1;//初始客户序列号
boolstate=1;//用于判断是否有窗口在处理
intcurrentTimeOfDeal=0;
intthearriveMaxTime=0;
//初始化三个队列
queueeq;//事件队列
queuefq;//队列一
queuesq;//对列二
service*front(queue&q){//返回队首元素
returnq.head;}
service*back(queue&q){//返回队尾元素
returnq.rear;}
voidpush(queue&q,intd){//插入元素d为Q的新的队尾元素
service*temp=newservice;
temp->money=d;
temp->next=NULL;
if(q.head==NULL){//队列为空,初始化
q.head=temp;
q.rear=temp;}//if
else{//队列不为空,插入元素d
q.rear->next=temp;
q.rear=q.rear->next;}//else
}
voidpop(queue&q){//若队列不空,出对列函数
service*temp;
temp=q.head;
if(q.head->next==NULL)
q.head=q.rear=NULL;
elseq.head=q.head->next;
deletetemp;}
voidarrive(){//"到达"函数,随机产生顾客,进入队列一产生到达事件进入事件队列
push(fq,(rand()%(2*dealMaxMoney)-dealMaxMoney));//随机产生顾客加入第一队列
back(fq)->beginTime=currentTime;
back(fq)->num=number;
push(eq,(back(fq)->money));//将产生事件加入事件队列
back(eq)->beginTime=currentTime;
back(eq)->type="到达";
back(eq)->num=number;
++number;}
voidputMoney(){//"存款"函数
total+=front(fq)->money;//更新资金总额
push(eq,front(fq)->money);//加入事件队列离开
back(eq)->type="离开";
back(eq)->num=front(fq)->num;
back(eq)->endTime=(front(fq)->beginTime+rand()%(dealMaxTime-dealMinTime+1)+dealMinTime);
++counter;//更新客户总数
totalTime+=(back(eq)->endTime-front(fq)->beginTime);//更新逗留时间
pop(fq);//删除第一队列第一个业务
currentTimeOfDeal=back(eq)->endTime;
state=0;}
voidgetMoney(){//"取款"函数
if((-fq.head->money)>total){//资金短缺加入第二队列
push(sq,front(fq)->money);
back(sq)->beginTime=front(fq)->beginTime;
back(sq)->num=front(fq)->num;
pop(fq);}//if
else{
total+=back(fq)->money;
push(eq,front(fq)->money);//加入事件队列离开
back(eq)->type="离开";
back(eq)->num=front(fq)->num;
back(eq)->endTime=(front(fq)->beginTime+rand()%(dealMaxTime-dealMinTime+1)+dealMinTime);
back(eq)->beginTime=0;
currentTimeOfDeal=back(eq)->endTime;
++counter;//更新客户总数
totalTime+=(back(eq)->endTime-back(fq)->beginTime);//更新逗留时间
pop(fq);//删除第一队列第一个业务
state=0;}//else
}
service*searchAndDel(queue&q,intm){//"搜索"函数,在对列中寻找可处理元素
service*sign=q.head;//标记头节点
service*temp;
while(q.head!
=NULL){
if((-(q.head->money))if(q.head==q.rear){
temp=q.head;
q.head=q.rear=NULL;
returntemp;}//if
else{//队首元素出列
temp=q.head;
q.head=q.head->next;//首节点后移一位,返回原首节点
returntemp;}//else
}//while
else{//队首元首不能被处理
if(q.head==q.rear){}
else{//首节点移到队列尾部
q.rear->next=q.head;
q.rear=q.rear->next;
q.head=q.head->next;
q.rear->next=NULL;}//else
}//else
if(q.head==sign)//队列循环一周时停止
returnNULL;}
returnNULL;}
service*temped;
intrandomTemp;
voidfindAndDeal(){//"处理"函数在对列中寻找可处理元素,对其进行处理
while((temped=searchAndDel(sq,total))&&temped!
=NULL){//查找可处理取款
total+=temped->money;//更新资金总额
push(eq,temped->money);//加入事件队列离开
back(eq)->type="离开";
back(eq)->num=temped->num;
randomTemp=rand()%(dealMaxTime-dealMinTime+1)+dealMinTime;
back(eq)->endTime=currentTime+randomTemp;
currentTimeOfDeal+=randomTemp;
++counter;//更新客户总数
totalTime+=(back(eq)->endTime-temped->beginTime);//更新逗留时间
deletetemped;//删除节点
temped=NULL;}
state=0;}
intmain(){
cout<<"****************************************"<cout<<"*****欢迎进入银行模拟系统*****"<cout<<"****************************************"<inti;
cout<<"****************************************"<cout<<"*******1.开始模拟;0.退出*******"<cout<<"****************************************"<intn,t1=0,t2=0,t3=0,t4=0,m=0;
cin>>n;
while(n==1){
srand(time(NULL));//初始化随机函数
cout<<"请输入银行的初始存款:
";
cin>>total;
if(total<0){
cout<<"输入错误!
初始存款不能小于0!
请再次输入!
"<cout<<"请输入银行的初始存款:
";
cin>>total;
if(total<0){
cout<<"输入错误!
初始存款不能小于0!
请最后一次输入!
"<cout<<"请输入银行的初始存款:
";
cin>>total;
if(total<0){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
cout<<"请按任意键退出!
";
gotoend;}}}
cout<<"请输入银行的营业时间:
";
cin>>closeTime;
if(closeTime>=1440){
cout<<"输入错误!
一天的营业时间不能超过1440分钟(24个小时)!
请再次输入!
"<cout<<"请输入银行的营业时间:
";
cin>>closeTime;
if(closeTime>=1440){
cout<<"输入错误!
一天的营业时间不能超过1440分钟(24个小时)!
请最后一次输入!
"<cout<<"请输入银行的营业时间:
";
cin>>closeTime;
if(closeTime>=1440){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
cout<<"请按任意键退出!
"<gotoend;}}}
cout<<"请输入最大到达时间间隔:
";
cin>>arriveMaxTime;
if(arriveMaxTime>closeTime){
cout<<"输入错误!
最大到达时间间隔必须小于营业时间!
请再次输入!
"<cout<<"请输入最大到达时间间隔:
";
cin>>arriveMaxTime;
if(arriveMaxTime>closeTime){
cout<<"输入错误!
最大到达时间间隔必须小于营业时间!
请最后一次输入!
"<cout<<"请输入最大到达时间间隔:
";
cin>>arriveMaxTime;
if(arriveMaxTime>closeTime){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
cout<<"请按任意键退出!
"<gotoend;}}}
cout<<"请输入最小到达时间间隔:
";
cin>>arriveMinTime;
if(arriveMinTime<=0||arriveMinTime>=arriveMaxTime){
cout<<"输入错误!
最小到达时间间隔必须介于零和最大到达时间之间!
请再次输入!
"<cout<<"请输入最小到达时间间隔:
";
cin>>arriveMinTime;
if(arriveMinTime<=0||arriveMinTime>=arriveMaxTime){
cout<<"输入错误!
最小到达时间间隔必须介于零和最大到达时间之间!
请最后一次输入!
"<cout<<"请输入最小到达时间间隔:
";
cin>>arriveMinTime;
if(arriveMinTime<=0||arriveMinTime>=arriveMaxTime){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
cout<<"请按任意键退出!
";
gotoend;}}}
cout<<"请输入最大的处理时间:
";
cin>>dealMaxTime;
if(dealMaxTime>closeTime){
cout<<"输入错误!
最大处理时间必须小于营业时间!
请再次输入!
"<cout<<"请输入最大的处理时间:
";
cin>>dealMaxTime;
if(dealMaxTime>closeTime){
cout<<"输入错误!
最大处理时间必须小于营业时间!
请最后一次输入!
"<cout<<"请输入最大的处理时间:
";
cin>>dealMaxTime;
if(dealMaxTime>closeTime){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
cout<<"请按任意键退出!
"<gotoend;}}}
cout<<"请输入最小的处理时间:
";
cin>>dealMinTime;
if(dealMinTime<=0||dealMinTime>=dealMaxTime){
cout<<"输入错误!
最小处理时间必须介于零和最大处理时间之间!
请再次输入!
"<cout<<"请输入最小的处理时间:
";
cin>>dealMinTime;
if(dealMinTime<=0||dealMinTime>=dealMaxTime){
cout<<"输入错误!
最小处理时间必须介于零和最大处理时间之间!
请最后一次输入!
"<cout<<"请输入最小的处理时间:
";
cin>>dealMinTime;
if(dealMinTime<=0||dealMinTime>=dealMaxTime){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
cout<<"请按任意键退出!
"<gotoend;}}}
cout<<"请输入交易额的最大上限:
";
cin>>dealMaxMoney;
if(dealMaxMoney>=total||dealMaxMoney>50000){
cout<<"输入错误!
超出本银行的服务范围!
最大交易额应低于银行开始营业时的资金总额且小于50000!
请再次输入!
"<cout<<"请输入交易额的最大上限:
";
cin>>dealMaxMoney;
if(dealMaxMoney>=total||dealMaxMoney>50000){
cout<<"输入错误!
超出本银行的服务范围!
最大交易额应低于银行开始营业时的资金总额且小于50000!
请最后一次输入!
"<cout<<"请输入交易额的最大上限:
";
cout<if(dealMaxMoney>=total||dealMaxMoney>50000){
cout<<"三次输入都错误!
请按任意键退出!
"<getch();
printf("请按任意键退出!
\n");
gotoend;}}}
thearriveMaxTime+=rand()%(arriveMaxTime-arriveMinTime+1)+arriveMinTime;//首次到达时间
while(currentTime++currentTime;
if(currentTimeOfDealif(currentTimeOfDeal==currentTime)state=1;
if(currentTime==thearriveMaxTime){//到达事件
arrive();
thearriveMaxTime+=rand()%(arriveMaxTime-arriveMinTime+1)+arriveMinTime;}//if
if(state==1&&fq.head!
=NULL){
if(fq.head->money>=0){
putMoney();//调用存款函数
findAndDeal();//调用搜索处理函数
ndn++;}//if
else{
getMoney();//调用取款函数
nwn++;}//else
}}//if
cout<<"客户序列"<<"\t"<<"事件类型"<<"\t"<<"时间"<<"\t"<<"处理金额"<while(eq.head!
=NULL)//清除事件队列
{if(eq.head->type=="离开"){
cout<num<<"\t"<<"离开"<<"\t"<endTime<<"\t"<money<if(eq.head->money>=0)t1++;
elset3++;}
else{
cout<num<<"\t"<<"到达"<<"\t"<beginTime<<"\t"<money<if(eq.head->money>=0)t2++;
elset4++;}
sdn=ndn-(t2-t1);
swn=nwn-(t4-t3);
pop(eq);}
cout<<"未处理客户:
";
while(fq.head!
=NULL){
totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户
if(m%10!
=0)cout<num;
else{cout<num;}
++counter;m++;pop(fq);}//while
if(m==0)cout<<"无未处理客户"<cout<cout<<"需要存款的客户人数:
"<cout<<"需要取款的客户人数:
"<cout<<"成功办理存款的客户人数:
"<cout<<"成功办理取款的客户人数:
"<cout<<"存款成功办理率:
"<cout<<"取款成功办理率:
"<cout<<"客户逗留平均时间为:
"<cout<<"银行当前余额:
"<cout<<"请按任意键退出!
"<if(n==0)cout<<"请按任意键退出!
"<end:
getch();
system("pause");
return0;
}//maim()
四.实验的结果及分析。
图1.
图2.