银行业务活动的模拟汇总.docx
《银行业务活动的模拟汇总.docx》由会员分享,可在线阅读,更多相关《银行业务活动的模拟汇总.docx(19页珍藏版)》请在冰豆网上搜索。
银行业务活动的模拟汇总
罗开华 | 193132班 | 20131001842
2015年1月5日
数据结构
指导老师:
陈桂玲
题号:
1题目:
银行业务活动的模拟
1.需求分析
1.客户的业务分为两种:
第一种是申请从银行得到一笔资金,即取款或借款;
2.第二种是向银行中投入一笔资金,即存款或还款。
银行有两个服务窗口,相应地有两个队列。
客户到达银行后先排第一个队。
3.处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。
每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。
4.注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。
任何时刻都只开一个窗口。
假设检查不需要时间。
营业时间结束时所有客户立刻离开银行。
5.要求:
模拟银行业务活动,按时间顺序输出业务活动的事件,并求出客户在银行内逗留的平均时间。
2.设计
2.1设计思想
(1)数据结构设计(采用的结构及原因)
本题我采用的是用队列来储存客户数据,用rand函数来提取随值。
(2)算法设计(函数模块及功能,可画流程图)
2.2设计表示
(1)关系调用图
(2)函数接口规格说明
函数调用
1.主函数main
2.进栈函数push
3.出栈函数pop
4.查找和处理函数service*searchAndDel
5.到达函数arrive
6.存款函数putMoney
7.群款函数getMoney
8.随机函数rand
2.3详细设计(伪码,注释)
ADTQueue{
数据对象:
D={ai∈Elemseti=1,2,…,n,n≥0}
数据关系:
R1={ai-1ai∈D,i=2,…,n}
约定其中a1端为队列头,an端为队列尾.
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q
QueueEmpty(Q)
操作结果:
若Q为空队列,则返回TRUE,否则FALSE
GetHead(Q&q)EnQueue(&Qq)
操作结果:
插入元素q为Q的新的队尾素
DeQueue(&Q&q);操作结果删除Q的队头元素,并用q返回其值。
3调试分析(时间空间复杂度)
银行业务模拟程序,在编译的时候,由于对话框之间的衔接不太懂,所以并没有实现应有的结果。
但后来还是通过学生,上网查询等多种方法,终于弄清了对话框之间的衔接和一些基本算法。
最终也运行出来了。
4.用户手册
本程序是在visualsdudio2012上编译测试的。
5.测试数据及测试结果
测试数据:
存款10000,时间480,最大时间间隔30,最大处理时间5
存款30000,时间360,最大时间间隔10,最大处理时间10
6.源程序清单
#include
#include
usingnamespacestd;
inttotal;
intcloseTime;
intarriveTime;
intdealTime;
intdealMoney=5000;
intcurrentTime=0;
inttotalTime=0;
intcounter=0;
intnumber=1;+
structservice
{
intnum;
stringtype;
intbeginTime;
intendTime;
intmoney;
service*next;
};
structqueue
{
service*head;
service*rear;
};
voidpush(queue&q,intd)
{
service*temp=newservice;
temp->money=d;
temp->next=NULL;
if(NULL==q.head)
{
q.head=temp;
q.rear=temp;
}
else
{
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;
else
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;
service*temp;
while(NULL!
=q.head)
{
if((-(q.head->money)){
if(q.head==q.rear)
{
temp=q.head;
q.head=q.rear=NULL;
returntemp;
}
else
{
temp=q.head;
q.head=q.head->next;
returntemp;
}
}
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;
}
}
if(q.head==sign)
returnNULL;
}
returnNULL;
}
boolstate=1;
intcurrentTimeOfDeal=0;
inttheArriveTime=0;
queueeq;
queuefq;
queuesq;
voidarrive()
{
push(fq,(rand()%(2*dealMoney)-dealMoney));
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);
}
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()%dealTime+1);
back(eq)->beginTime=0;
currentTimeOfDeal=back(eq)->endTime;
++counter;
totalTime+=(back(eq)->endTime-back(fq)->beginTime);
pop(fq);
state=0;
}
}
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("**\n");
printf("********************************************\n");
printf("1.开始模拟0.退出\n");
intn;
scanf("%d",&n);
while(n==1)
{
srand(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(currentTimeOfDealif(currentTimeOfDeal==currentTime)state=1;
if(currentTime==theArriveTime)
{
arrive();
theArriveTime+=rand()%arriveTime+1;
}//if
if(1==state&&NULL!
=fq.head)
{
if(fq.head->money>=0)
{
putMoney();
findAndDeal();
}//if
else
getMoney();
}//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);
}
cout<<"客户逗留平均时间为:
"<cout<<"银行当前余额:
"<break;
}
return0;
}