银行管理系统实验报告.docx
《银行管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《银行管理系统实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
银行管理系统实验报告
一.需求分析
假设某银行有2个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。
因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进和银行的客户。
如果某个窗口的业务员正空闲,则可上前办理业务。
反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。
编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。
1.输入:
初始存款,营业时间,最大到达时间间隔,最大处理时间
2.输出:
客户到达离开时间,客户平均逗留时间,银行余额
3.功能:
模拟银行业务情况,计算客户平均逗留时间
4.测试数据:
随机
二.概要设计
数据结构:
用链表实现客户到来和离开事件表。
用队列实现用户无法进行事物办理时的排队情况。
三.详细设计
1.数据结构详细设计:
structqueue
{//队列
service*head;
service*rear;
}
;
queueeq;//事件队列
queuefq;//队列一
queuesq;//对列二
//初始化三个队列
四.调试分析
调试过程中遇到的问题:
银行服务中,不只是存取款这些简单的事情,我在最初的程序设计时考虑十分浅显。
对于如何使用链表实现表示客户到来跟业务办理时存在疑问,经老师同学指点后问题解决。
五.使用说明和测试结果
1.使用说明:
用户选择1或0(开始模拟或退出)开始程序。
自主输入银行的初始存款、银行的营业时间、最大到达时间间隔、最大处理时间。
回车。
程序开始运行。
2.测试结果:
六.心得体会
通过此次实验,成功的实现了由队列来解决很多解决问题时需要等待排队的问题。
对于如何使用链表表现相关到达及处理问题事宜也有了更近一步的学习。
在实践过程中,遇到了很多由于经验不足而导致的问题,幸好在老师和同学们的帮助下,我顺利完成了实验,并学习了更多。
附录
源代码:
#include
usingnamespacestd;
inttotal;//初始时银行现存资金总额
intcloseTime;//营业结束时间
intarriveTime;//两个到达事件之间的间隔上限
intdealTime;//客户之间交易的时间上限
intdealMoney=5000;//交易额上限
intcurrentTime=0;//当前时间
inttotalTime=0;//客户逗留总时间
intcounter=0;//客户总数
intnumber=1;//初始客户序列号
boolstate=1;//用于判断是否有窗口在处理
intcurrentTimeOfDeal=0;
inttheArriveTime=0;
structservice
{
intnum;//客户号
stringtype;//到达或离开
intbeginTime;
intendTime;
intmoney;//正数为存款,负数为取款
service*next;
};
voidpush(queue&q,intd)
{//插入元素d为Q的新的队尾元素
service*temp=newservice;
temp->money=d;
temp->next=NULL;
if(NULL==q.head)
{//队列为空,初始化
q.head=temp;
q.rear=temp;
}//if
else
{//队列不为空,插入元素d
q.rear->next=temp;
q.rear=q.rear->next;
}//
voidpop(queue&q)//出队
service*temp;
temp=q.head;
if(NULL==q.head->next)
q.head=q.rear=NULL;
q.head=q.head->next;
deletetemp;
service*front(queue&q)
{//返回队首元素
returnq.head;
service*back(queue&q)
{//返回队尾元素
returnq.rear;
service*searchAndDel(queue&q,intm)
{//在对列中寻找可处理元素
service*sign=q.head;//标记头节点
while(NULL!
=q.head)
if((-(q.head->money)){if(q.head==q.rear){temp=q.head;q.head=q.rear=NULL;returntemp;}//ifelse{//队首元素出列temp=q.head;q.head=q.head->next;//首节点后移一位,返回原首节点returntemp;}//else}//whileelse{//队首元首不能被处理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}//elseif(q.head==sign)//队列循环一周时停止returnNULL;}returnNULL;} voidarrive(){//"到达"函数随机产生顾客,进入队列一产生到达事件进入事件队列push(fq,(rand()%(2*dealMoney)-dealMoney));//随机产生顾客加入第一队列,-5000-5000back(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()%dealTime+1);++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);}//ifelse{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()%dealTime+1);back(eq)->beginTime=0;currentTimeOfDeal=back(eq)->endTime;++counter;//更新客户总数totalTime+=(back(eq)->endTime-back(fq)->beginTime);//更新逗留时间pop(fq);//删除第一队列第一个业务state=0;}//else}service*temped;intrandomTemp;voidfindAndDeal(){//在对列中寻找可处理元素,对其进行处理while((temped=searchAndDel(sq,total))&&NULL!=temped){//查找可处理取款total+=temped->money;//更新资金总额push(eq,temped->money);//加入事件队列训离开back(eq)->type="离开";back(eq)->num=temped->num;randomTemp=rand()%dealTime+1;back(eq)->endTime=currentTime+randomTemp;currentTimeOfDeal+=randomTemp;++counter;//更新客户总数totalTime+=(back(eq)->endTime-temped->beginTime);//更新逗留时间deletetemped;//删除节点temped=NULL;}state=0;} intmain(){printf("********************************************\n");printf("欢迎进入银行模拟系统\n");printf("********************************************\n");printf("1.开始模拟0.退出\n");intn;scanf("%d",&n);while(n==1){srand(time(NULL));//初始化随机函数printf("输入银行的初始存款:\n");scanf("%d",&total);printf("输入银行的营业时间:\n");scanf("%d",&closeTime);printf("输入最大到达时间间隔:\n");scanf("%d",&arriveTime);printf("输入最大的处理时间:\n");scanf("%d",&dealTime);theArriveTime+=rand()%arriveTime+1;//首次到达时间while(currentTime{++currentTime;if(currentTimeOfDealcurrentTimeOfDeal=currentTime;if(currentTimeOfDeal==currentTime)state=1;if(currentTime==theArriveTime)//到达事件{arrive();theArriveTime+=rand()%arriveTime+1;}//ifif(1==state&&NULL!=fq.head){if(fq.head->money>=0){putMoney();findAndDeal();}//ifelsegetMoney();}//if} cout<while(NULL!=eq.head)//清除事件队列{if(eq.head->type=="离开")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<endTime<<"\t\t"<money<if(eq.head->type=="到达")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<beginTime<<"\t\t"<money<pop(eq);}cout<<"银行关门未处理客户:"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
if(q.head==q.rear)
returntemp;
{//队首元素出列
q.head=q.head->next;//首节点后移一位,返回原首节点
}//else
}//while
{//队首元首不能被处理
{}
{//首节点移到队列尾部
q.rear->next=q.head;
q.rear->next=NULL;
if(q.head==sign)//队列循环一周时停止
returnNULL;
voidarrive()
{//"到达"函数随机产生顾客,进入队列一产生到达事件进入事件队列
push(fq,(rand()%(2*dealMoney)-dealMoney));//随机产生顾客加入第一队列,-5000-5000
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()%dealTime+1);
++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);
total+=back(fq)->money;
back(eq)->beginTime=0;
totalTime+=(back(eq)->endTime-back(fq)->beginTime);//更新逗留时间
service*temped;
intrandomTemp;
voidfindAndDeal()
{//在对列中寻找可处理元素,对其进行处理
while((temped=searchAndDel(sq,total))&&NULL!
=temped)
{//查找可处理取款
total+=temped->money;//更新资金总额
push(eq,temped->money);//加入事件队列训离开
back(eq)->num=temped->num;
randomTemp=rand()%dealTime+1;
back(eq)->endTime=currentTime+randomTemp;
currentTimeOfDeal+=randomTemp;
totalTime+=(back(eq)->endTime-temped->beginTime);//更新逗留时间
deletetemped;//删除节点
temped=NULL;
intmain()
printf("********************************************\n");
printf("欢迎进入银行模拟系统\n");
printf("1.开始模拟0.退出\n");
intn;
scanf("%d",&n);
while(n==1)
srand(time(NULL));//初始化随机函数
printf("输入银行的初始存款:
\n");
scanf("%d",&total);
printf("输入银行的营业时间:
scanf("%d",&closeTime);
printf("输入最大到达时间间隔:
scanf("%d",&arriveTime);
printf("输入最大的处理时间:
scanf("%d",&dealTime);
theArriveTime+=rand()%arriveTime+1;//首次到达时间
while(currentTime{++currentTime;if(currentTimeOfDealcurrentTimeOfDeal=currentTime;if(currentTimeOfDeal==currentTime)state=1;if(currentTime==theArriveTime)//到达事件{arrive();theArriveTime+=rand()%arriveTime+1;}//ifif(1==state&&NULL!=fq.head){if(fq.head->money>=0){putMoney();findAndDeal();}//ifelsegetMoney();}//if} cout<while(NULL!=eq.head)//清除事件队列{if(eq.head->type=="离开")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<endTime<<"\t\t"<money<if(eq.head->type=="到达")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<beginTime<<"\t\t"<money<pop(eq);}cout<<"银行关门未处理客户:"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
{++currentTime;
if(currentTimeOfDealcurrentTimeOfDeal=currentTime;if(currentTimeOfDeal==currentTime)state=1;if(currentTime==theArriveTime)//到达事件{arrive();theArriveTime+=rand()%arriveTime+1;}//ifif(1==state&&NULL!=fq.head){if(fq.head->money>=0){putMoney();findAndDeal();}//ifelsegetMoney();}//if} cout<while(NULL!=eq.head)//清除事件队列{if(eq.head->type=="离开")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<endTime<<"\t\t"<money<if(eq.head->type=="到达")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<beginTime<<"\t\t"<money<pop(eq);}cout<<"银行关门未处理客户:"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
currentTimeOfDeal=currentTime;
if(currentTimeOfDeal==currentTime)
state=1;
if(currentTime==theArriveTime)//到达事件
arrive();
theArriveTime+=rand()%arriveTime+1;
if(1==state&&NULL!
=fq.head)
if(fq.head->money>=0)
putMoney();
findAndDeal();
getMoney();
cout<while(NULL!=eq.head)//清除事件队列{if(eq.head->type=="离开")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<endTime<<"\t\t"<money<if(eq.head->type=="到达")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<beginTime<<"\t\t"<money<pop(eq);}cout<<"银行关门未处理客户:"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
=eq.head)//清除事件队列
if(eq.head->type=="离开")
cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<endTime<<"\t\t"<money<if(eq.head->type=="到达")cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<beginTime<<"\t\t"<money<pop(eq);}cout<<"银行关门未处理客户:"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
if(eq.head->type=="到达")
cout<num<<"\t\t"<type<<"\t\t"<<"\t\t"<beginTime<<"\t\t"<money<pop(eq);}cout<<"银行关门未处理客户:"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
pop(eq);
cout<<"银行关门未处理客户:
"<<""<while(NULL!=fq.head){totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
{totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户
cout<num<<""<++counter;pop(fq);}//whilecout<<"资金短缺未处理客户:"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
++counter;
cout<<"资金短缺未处理客户:
"<<""<while(NULL!=sq.head){totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
=sq.head)
{totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户
cout<num<<""<++counter;pop(sq);}cout<<"客户逗留平均时间为:"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
pop(sq);
cout<<"客户逗留平均时间为:
"<cout<<"银行当前余额:"<break;}//while(n==1)return0;}//maim()
cout<<"银行当前余额:
"<break;}//while(n==1)return0;}//maim()
break;
}//while(n==1)
return0;
}//maim()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1