26银行业务模拟汇总.docx
- 文档编号:6916155
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:14
- 大小:100.27KB
26银行业务模拟汇总.docx
《26银行业务模拟汇总.docx》由会员分享,可在线阅读,更多相关《26银行业务模拟汇总.docx(14页珍藏版)》请在冰点文库上搜索。
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(currentTimeOfDeal if(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< if(eq.head->money>=0)t1++; elset3++;} else{ cout< 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< else{cout< ++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.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 26 银行业务 模拟 汇总