26银行业务模拟汇总.docx

上传人:b****4 文档编号:11607044 上传时间:2023-03-28 格式:DOCX 页数:14 大小:100.27KB
下载 相关 举报
26银行业务模拟汇总.docx_第1页
第1页 / 共14页
26银行业务模拟汇总.docx_第2页
第2页 / 共14页
26银行业务模拟汇总.docx_第3页
第3页 / 共14页
26银行业务模拟汇总.docx_第4页
第4页 / 共14页
26银行业务模拟汇总.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

26银行业务模拟汇总.docx

《26银行业务模拟汇总.docx》由会员分享,可在线阅读,更多相关《26银行业务模拟汇总.docx(14页珍藏版)》请在冰豆网上搜索。

26银行业务模拟汇总.docx

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<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.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1