银行管理系统实验报告.docx
- 文档编号:28069208
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:15
- 大小:57.60KB
银行管理系统实验报告.docx
《银行管理系统实验报告.docx》由会员分享,可在线阅读,更多相关《银行管理系统实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
银行管理系统实验报告
一.需求分析
假设某银行有2个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。
因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进和银行的客户。
如果某个窗口的业务员正空闲,则可上前办理业务。
反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。
编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。
1.输入:
初始存款,营业时间,最大到达时间间隔,最大处理时间
2.输出:
客户到达离开时间,客户平均逗留时间,银行余额
3.功能:
模拟银行业务情况,计算客户平均逗留时间
4.测试数据:
随机
二.概要设计
数据结构:
用链表实现客户到来和离开事件表。
用队列实现用户无法进行事物办理时的排队情况。
三.详细设计
1.数据结构详细设计:
structqueue
{//队列
service*head;
service*rear;
}
;
queueeq;//事件队列
queuefq;//队列一
queuesq;//对列二
//初始化三个队列
四.调试分析
调试过程中遇到的问题:
银行服务中,不只是存取款这些简单的事情,我在最初的程序设计时考虑十分浅显。
对于如何使用链表实现表示客户到来跟业务办理时存在疑问,经老师同学指点后问题解决。
五.使用说明和测试结果
1.使用说明:
用户选择1或0(开始模拟或退出)开始程序。
自主输入银行的初始存款、银行的营业时间、最大到达时间间隔、最大处理时间。
回车。
程序开始运行。
2.测试结果:
六.心得体会
通过此次实验,成功的实现了由队列来解决很多解决问题时需要等待排队的问题。
对于如何使用链表表现相关到达及处理问题事宜也有了更近一步的学习。
在实践过程中,遇到了很多由于经验不足而导致的问题,幸好在老师和同学们的帮助下,我顺利完成了实验,并学习了更多。
附录
源代码:
#include
#include
#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;
};
structqueue
{//队列
service*head;
service*rear;
}
;
queueeq;//事件队列
queuefq;//队列一
queuesq;//对列二
//初始化三个队列
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;
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; }//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; } 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); }//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()%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(currentTimeOfDeal currentTimeOfDeal=currentTime; if(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< if(eq.head->type=="到达") cout< pop(eq); } cout<<"银行关门未处理客户: "<<""< while(NULL! =fq.head) {totalTime+=(closeTime-fq.head->beginTime);//更新结束时第一队列中未处理的客户 cout< ++counter; pop(fq); }//while cout<<"资金短缺未处理客户: "<<""< while(NULL! =sq.head) {totalTime+=(closeTime-sq.head->beginTime);//更新结束时第二队列中未处理的客户 cout< ++counter; pop(sq); } cout<<"客户逗留平均时间为: "< cout<<"银行当前余额: "< break; }//while(n==1) return0; }//maim()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行 管理 系统 实验 报告