




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程名称: 计算机技术综合课程设计 题 目: 银行业务模拟 学 院: 信息工程 系: * 专 业: * 班 级: 0* 学 号: * 学生姓名: * 时 间: * 一、 问题描述:客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直到满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。二、 分析与设计1. 问题分析:本问题主要需要处理两个队列(fq,sq)和一个事件表(eq)。一个队列(fq)表示第一种业务(存款或还款),另一个队列(sq)表示第二种业务(取款或借款)。事件有两类:到达银行和离开银行。到达事件发生时随机地设置此用户的交易时间和距下一到达事件之间的时间间隔。每个客户要办理的款额也应该是随机确定的。初始时银行现存资金总额为total。开始营业后的第一个事件是客户到达,营业时间从0到closetime。Total和closetime以及随机产生的时间和款项的上下界都是交互地从让用户从输入,作为模拟参数。要得到相关的结果:由于下班时间到而没能办理的顾客数;分别列出需要办理两种业务的顾客数;分别列出已成功办理两种业务的顾客数;分别列出两种业务的成功办理率;客户在银行内的平均逗留时间;下班时银行所剩余的资金总额。2. 测试数据及期望结果:1) 输入:用户需要在程序运行开始时输入以下数据:1 银行初始资金total(测试数据为10000)2 银行营业时间closetime(测试数据为600)3 客户交易时间上下界dealmaxtime和dealmintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值。4 客户到达时间间隔上界arrivemaxtime arrivemintime,用于给随机数产生函数传递参数,产生一个介于这两个值之间的值。5 交易额的最大上限dealMaxMoney.用于给随机函产生函数参数,产生一个介于-dealMaxMoney和dealMaxMoney之间的值,作为顾客到银行办理业务的交易额。2) 输出:本程序用dos界面模拟输出整个银行业务办理及排队的结果,最后给出一下数据:1 由于下班时间到而没能办理的顾客数2 分别列出需要办理两种业务的顾客数3 分别列出已成功办理两种业务的顾客数4 分别列出两种业务的成功办理率。5 客户在银行内的平均逗留时间6 下班时银行所剩余的资金总额3) 所有数据均要正确输入,并对输入合法性进行检测,如只能输入数字,且上界必须不小于下界。4) 预计实现结果截图:用户打开运行程序以后会出现如下的首界面:用户按任意键继续,则会出现如下主界面:用户选择1开始模拟。按提示输入相应的数据设置,就能得到想要的模拟结果。退出选择0.对用户输入要求如下:1 银行开始的资金总额应该大于零。2 银行的营业时间必须小于1440分钟(24小时)。3 最大到达时间间隔必须小于营业时间。4 最小到达时间间隔必须介于零和最大到达时间之间。5 最大处理时间必须小于营业时间。6 最小处理时间必须介于零和最大处理时间之间。7 最大交易额应该小于银行开始时的资金总额且小于程序设置的50000。如果输入不符合上述要求,程序会提示用户哪里输入出错,可以再次输入。每个输入数据都有3次机会。当三次输入都错的时候,程序停止运行,按任意键退出。现给出最小处理时间出错时的三种提示截图:3. 模块结果及各个模块的实现方法描述:1) 概要设计结构体的定义如下:struct serviceint num; /客户号string type; /到达或离开int beginTime;/到达时间int endTime;/离开时间int money; /正数为存款,负数为取款service* next;/指针域;2) 队列的抽象数据类型定义如下:ADT Queue 数据对象:D ai | aiElemSet, i=1,2,.,n, n0 数据关系:R1 |ai-1, aiD, i=2,.,n 基本操作:void init_Q(Queue &Q);操作结果:构造空队列Qint Q_empty(Queue Q);初始条件:队列Q存在操作结果:若Q为空队列,则返回TRUE,否则FALSEint Q_length(Queue Q);初始条件:队列Q存在操作结果:返回队列Q的元素个数,即队列长度int gethead_Q(Queue Q);初始条件:队列Q存在操作结果:返回队列Q的队头元素void en_Q(Queue &Q,int e);初始条件:队列Q存在操作结果:插入元素e为Q的新的队尾元素。void de_Q(Queue &Q,int &e);初始条件:队列Q存在操作结果:删除Q的队头元素。ADT Queue3) 模块及相互调用关系本程序包含3个模块:1 主程序模块2 队列模块实现队列抽象数据类型各模块相互调用关系如下:主程序模块队列模块算法设计4) 队列类型typedef struct QNode/队列节点类型 int data;struct QNode *next;QNode,*PQNode;typedef struct PQNode front;/队头指针PQNode rear;/队尾指针Queue;a) 队列的基本操作设置如下:void init_Q(Queue &Q);/初始化,构造空队列Q(Q.front=Q.rear)int Q_empty(Queue Q);/若队列Q存在/若Q为空队列,则返回TRUE,否则FALSEint Q_length(Queue Q);/若队列Q存在/返回队列Q的元素个数,即队列长度int gethead_Q(Queue Q);/若队列Q存在/返回队列Q的队头元素void en_Q(Queue &Q,int e);/若队列Q存在/插入元素e为Q的新的队尾元素。void de_Q(Queue &Q,int &e);/若队列Q存在/删除Q的队头元素。b) 其中操作算法:void init_Q(Queue &Q)/初始化,构造空队列Q(Q.front=Q.rear)Q.front=Q.rear=(PQNode)malloc(sizeof(QNode);if(!Q.front)exit(-1); int Q_empty(Queue Q)/若队列Q存在/若Q为空队列,则返回TRUE,否则FALSEif(Q.front=Q.rear)return 1;else return 0;int gethead_Q(Queue Q)/若队列Q存在/返回队列Q的队头元素if(!Q_empty(Q)return Q.front-next-data;else return 0;int Q_length(Queue Q)/若队列Q存在/返回队列Q的元素个数,即队列长度int count=0;PQNode p=Q.front;while(p!=Q.rear)count+;p=p-next;return count;void en_Q(Queue &Q,int e)/若队列Q存在/插入元素e为Q的新的队尾元素。PQNode p=(PQNode)malloc(sizeof(QNode);if(!p)exit(-1);p-data=e;p-next=NULL;Q.rear-next=p;Q.rear=p;void de_Q(Queue &Q,int &e)/若队列Q存在/删除Q的队头元素PQNode p;if(Q.front=Q.rear)return ;p=Q.front-next;e=p-data;Q.front-next=p-next;if(Q.rear=p)Q.rear=Q.front;free(p);5) 队列扫描算法伪码:if(!empry(fq)& fq.head-money0)/如果队列一不空,而且队头客户办理第二种业务/1.可以办,完成离开(即银行现金足够取)/2.不可以办,排队2等候else /存款 ,第一种业务 if(!empty(fq) & temped= searchAndDel(sq,total)/当交易时间到/办理该业务,并开始扫描第二队列,看是否能满足/第二队列需要 if(currentime=next_arrtime )/当当前时间等于即将到来的顾客到来时间,初始化/该顾客节点,并设置下一顾客到达时间6) 其他函数算法int rand_num(int max,int min)/随机数生成/根据传进的max和min,生成介于max和min的一个/整数 randomize(); RandSeed=Now(); return ( random(100000) % (max - min + 1) +min ); 三、 源代码:/银行业务模拟系统#include #include #include #include using namespace std;struct serviceint num; /客户号string type; /到达或离开int beginTime;/到达时间int endTime;/离开时间int money; /正数为存款,负数为取款service* next;/指针域;struct queue /队列service* head;/队列头指针service* rear;/队列尾指针;int total; /初始时银行现存资金总额int closeTime; /营业结束时间int arriveMaxTime; /两个到达事件之间的间隔上限int arriveMinTime; /两个到达事件之间的间隔下限int dealMaxTime; /客户之间交易的时间上限int dealMinTime; /客户之间交易的时间下限int dealMaxMoney ; /交易额上限int ndn=0;/需要存款的人数int nwn=0;/需要取款的人数int sdn=0;/成功存款的人数int swn=0;/成功取款的人数int currentTime = 0; /当前时间int totalTime = 0; /客户逗留总时间int counter = 0; /客户总数int number = 1; /初始客户序列号bool state =1; /用于判断是否有窗口在处理int currentTimeOfDeal = 0;int thearriveMaxTime = 0;queue eq; /事件队列queue fq; /队列一queue sq; /对列二/初始化三个队列service* front(queue &q)/返回队首元素return q. head;service* back(queue &q)/返回队尾元素return q. rear;void push(queue &q,int d)/ 插入元素d为Q的新的队尾元素service* temp = new service;temp-money = d;temp-next = NULL;if(q.head=NULL)/队列为空,初始化q. head = temp;q. rear = temp;/ifelse /队列不为空,插入元素dq. rear-next = temp;q. rear = q.rear-next;/elsevoid pop(queue &q)/ 若队列不空,出对列函数service* temp;temp = q. head;if(q. head-next=NULL )q.head = q. rear =NULL;elseq. head=q. head-next;delete temp;void arrive()/到达函数,随机产生顾客,进入队列一产生到达事件 进入事件队列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;void putMoney() /存款函数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;void getMoney()/取款函数if( (-fq.head-money) total ) /资金短缺 加入第二队列push( sq,front(fq)-money );back(sq)-beginTime = front(fq)-beginTime;back(sq)-num = front(fq)-num;pop(fq);/ifelsetotal += 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;/elseservice* searchAndDel(queue &q,int m)/搜索函数,在对列中寻找可处理元素service* sign = q. head; /标记头节点service* temp;while(q. head!=NULL )if(-(q. head-money) next; / 首节点后移一位,返回原首节点return temp;/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)/队列循环一周时停止return NULL;return NULL;service* temped ;int randomTemp;void findAndDeal()/处理函数 在对列中寻找可处理元素,对其进行处理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 ); /更新逗留时间 delete temped; /删除节点temped = NULL;state = 0;int main() printf( *n);printf( *n);printf( *n);printf( * * 学院:信息工程学院n);printf( * *n);printf( * *n);printf( * * 专业:计算机科学与技术n);printf( * *n);printf( * *n);printf( * 欢迎进入银行模拟系统 * 班级:061n);printf( * *n);printf( * *n);printf( * * 姓名:邱雨田n);printf( * *n);printf( * *n);printf( * * 学号:6103106020n); printf( *n);printf( *n);printf( *n);printf(n);printf(n);printf(n);printf(请按任意键继续.n);getch();int i;for(i=0;i=14;i+)printf(n);printf( *n);printf( *n);printf( *n);printf( * 1.开始模拟 *n);printf( * 0.退出 *n);printf( *n);printf( *n);printf( *n);int n,t1=0,t2=0,t3=0,t4=0,m=0;scanf(%d,&n);while(n=1)srand(time(NULL); /初始化随机函数printf(请输入银行的初始存款:n);scanf(%d,&total); if(total0) printf(输入错误!初始存款不能小于0!请再次输入!n); printf(请输入银行的初始存款:n);scanf(%d,&total); if(total0) printf(输入错误!初始存款不能小于0!请最后一次输入!n);printf(请输入银行的初始存款:n);scanf(%d,&total); if(total=1440) printf(输入错误!一天的营业时间不能超过1440分钟(24个小时)!请再次输入!n);printf(请输入银行的营业时间:n);scanf(%d,&closeTime);if(closeTime=1440) printf(输入错误!一天的营业时间不能超过1440分钟(24个小时)!请最后一次输入!n);printf(请输入银行的营业时间:n);scanf(%d,&closeTime);if(closeTime=1440) printf(三次输入都错误!请按任意键退出!n);getch();printf(请按任意键退出!n);goto end; printf(请输入最大到达时间间隔:n); scanf(%d,&arriveMaxTime);if(arriveMaxTimecloseTime) printf(输入错误!最大到达时间间隔必须小于营业时间!请再次输入!n);printf(请输入最大到达时间间隔:n); scanf(%d,&arriveMaxTime);if(arriveMaxTimecloseTime) printf(输入错误!最大到达时间间隔必须小于营业时间!请最后一次输入!n);printf(请输入最大到达时间间隔:n); scanf(%d,&arriveMaxTime);if(arriveMaxTimecloseTime)printf(三次输入都错误!请按任意键退出!n);getch(); printf(请按任意键退出!n);goto end; printf(请输入最小到达时间间隔:n); scanf(%d,&arriveMinTime);if(arriveMinTime=arriveMaxTime) printf(输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请再次输入!n); printf(请输入最小到达时间间隔:n); scanf(%d,&arriveMinTime);if(arriveMinTime=arriveMaxTime) printf(输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请最后一次输入!n); printf(请输入最小到达时间间隔:n); scanf(%d,&arriveMinTime);if(arriveMinTime=arriveMaxTime)printf(三次输入都错误!请按任意键退出!n);getch();printf(请按任意键退出!n);goto end; printf(请输入最大的处理时间:n);scanf(%d,&dealMaxTime);if(dealMaxTimecloseTime) printf(输入错误!最大处理时间必须小于营业时间!请再次输入!n); printf(请输入最大的处理时间:n);scanf(%d,&dealMaxTime);if(dealMaxTimecloseTime) printf(输入错误!最大处理时间必须小于营业时间!请最后一次输入!n); printf(请输入最大的处理时间:n);scanf(%d,&dealMaxTime);if(dealMaxTimecloseTime)printf(三次输入都错误!请按任意键退出!n);getch(); printf(请按任意键退出!n);goto end;printf(请输入最小的处理时间:n);scanf(%d,&dealMinTime); if(dealMinTime=dealMaxTime) printf(输入错误!最小处理时间必须介于零和最大处理时间之间!请再次输入!n);printf(请输入最小的处理时间:n);scanf(%d,&dealMinTime); if(dealMinTime=dealMaxTime) printf(输入错误!最小处理时间必须介于零和最大处理时间之间!请最后一次输入!n);printf(请输入最小的处理时间:n);scanf(%d,&dealMinTime); if(dealMinTime=dealMaxTime) printf(三次输入都错误!请按任意键退出!n);getch();printf(请按任意键退出!n);goto end;printf(请输入交易额的最大上限:n);scanf(%d,&dealMaxMoney);if(dealMaxMoney=total | dealMaxMoney50000) printf(输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于50000!请再次输入!n);printf(请输入交易额的最大上限:n);scanf(%d,&dealMaxMoney);if(dealMaxMoney=total | dealMaxMoney50000)printf(输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于50000!请最后一次输入!n);printf(请输入交易额的最大上限:n);scanf(%d,&dealMaxMoney);if(dealMaxMoney=total | dealMaxMoney50000)printf(三次输入都错误!请按任意键退出!n);getch();printf(请按任意键退出!n);goto end;thearriveMaxTime +=rand()%(arriveMaxTime-arriveMinTime + 1)+arriveMinTime; /首次到达时间while(currentTime closeTime)+currentTime;if( currentTimeOfDeal money = 0)putMoney();/调用存款函数findAndDeal();/调用搜索处理函数ndn+;/ifelse getMoney();/调用取款函数nwn+;/else/ifprintf(客户序列 事件类型 时间 处理金额n);while( eq.head!=NULL ) /清除事件队列if(eq.head-type=离开)printf(%d 离开 %d %dn,eq.head-num, eq.head-endTime,eq.head-money);if(eq.head-money=0) t1+;else t3+;elseprintf(%d 到达 %d %dn,eq.head-num, eq.head-beginTime,eq.head-money);if(eq.head-money=0) t2+;else t4+;sdn=ndn-(t2-t1);swn=nwn-(t4-t3);pop(eq);printf( 未处理客户:n);while( fq.head!=NULL )totalTime += ( closeTime - fq.head-beginTime ); /更新结束时第一队列中未处理的客户if(m%10!=0) printf(%d ,fq.head-num);else printf(n); printf(%d ,fq.head-num); +counter;m+;pop(fq);/whileif(m=0) printf(无未处理客户n);printf(n); printf(需要存款的客户人数:%dn,ndn);printf(需要取款的客户人数:%dn,nwn);printf(成功办理存款的客户人数:%dn,sdn);printf(成功办理取款的客户人数:%dn,swn);printf(存款成功办理率:%fn,float(sdn*100/ndn);printf(取款成功办理率:%fn,float(swn*100/nwn);printf(客户逗留平均时间为:%fn,float(totalTime/counter);printf(银行当前余额:%dn,total);printf(请按任意键退出!n);break;/while(n=1)if(n=0) printf(请按任意键退出!n);end:getch();return 0;/main()四、 总结:1. 调试分析:在做队列的扫描算法时,发现运行演示的效果很奇怪,经过仔细检查和阅读题目,终于发现是我的理解有误。在处理顾客的第一种业务(从银行取出一笔钱)时,我没有特殊处理,仅是和处理第二种一样,即是等到该顾客交易时间结束时才开始判断,如果不够取进入第二队列等候。但题目中有“如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第2个队等候,直至满足时才离开银行,否则业务处理完后立刻离开银行”。想想这也是符合实际。于是改算法的判断为以下算法:伪码:if(!empry(fq)& fq.head-money0)/如果队列一不空,而且队头客户办理第二种业务/1.可以办,完成离开(即银行现金足够取)/2.不可以办,排队2等候else /存款 ,第一种业务 if(!empty(fq) & temped= searchAndDel(sq,total)/当交易时间到/办理该业务,并开始扫描第二队列,看是否能满足/第二队列需要 if(currentime=next_arrtime )/当当前时间等于即将到来的顾客到来时间,初始化/该顾客节点,并设置下一顾客到达时间2. 对于怎样计算已办理顾客的人数,一直没
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版智能节能幕墙施工简易服务协议书
- 2025年度路灯广告设备安装与维护合同
- 2025年度幼儿托管班特色课程开发合同
- 2025版期货代客理财市场分析报告合同
- 2025年度教育信息化设备采购与维护服务合同范例
- 2025版土木工程电气安装工程合同
- 2025年度户外广告投放合同协议
- 2025年新型城镇化示范项目厂房拆迁补偿协议
- 2025年事业单位借调人员管理与服务协议及绩效改进合同
- 第十八届振兴杯全国青年职业技能大赛工业视觉系统运维员理论试题库(含答案)
- 2025重庆对外建设集团招聘41人笔试参考题库附答案解析
- 中医健康管师试题及答案
- 投标造价委托协议书范本
- 新粒子生成与生长机制-洞察及研究
- 六年级下册数学竞赛试题-抽屉原理习题(含答案)
- 2025年军队专业技能岗位文职人员招聘考试(炊事员)历年参考题库含答案详解(5套)
- 高警示药品风险管理
- 医院重症护理技能竞赛理论考试(CRRT)试题及答案
- 2025年新乡事业单位招聘考试笔试试卷(附答案)
- 厦门闽南话趣味教学课件
- 2025年秋期新课标人教版六年级上册数学全册教案(核心素养教案)
评论
0/150
提交评论