




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NANCHANG UNIVERSITY课 程 设 计 报 告课程名称: 计算机技术综合课程设计 题 目: 银行业务模拟 学 院: 信息工程 系: 计算机科学与技术 专 业: 计算机科学与技术 班 级: 061 班 学 号: 6103106020 学生姓名: 邱雨田 时 间: 2010 年 1 月 11 日至 1 月 22 日 一、 问题描述:客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直到满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。二、 分析与设计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 | ai ElemSet, i=1,2,.,n, n0 数据关系:R1 |ai-1, aiD, i=2,.,n 基本操作:void init_Q(Queue 操作结果:构造空队列 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 存在操作结果:插入元素 e 为 Q 的新的队尾元素。void de_Q(Queue 初始条件:队列 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.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 存在/插入元素 e 为 Q 的新的队尾元素。void de_Q(Queue /若队列 Q 存在/删除 Q 的队头元素。b) 其中操作算法:void init_Q(Queue 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 if(!p)exit(-1);p-data=e; p-next=NULL;Q.rear-next=p;Q.rear=p;void de_Q(Queue 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)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 service* back(queue void push(queue 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 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 /标记头节点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) /更新资金总额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=1440) printf(“输入错误!一天的营业时间不能超过 1440 分钟(24 个小时)!请再次输入!n“);printf(“请输入银行的营业时间:n“);scanf(“%d“,if(closeTime=1440) printf(“输入错误!一天的营业时间不能超过 1440 分钟(24 个小时)!请最后一次输入!n“);printf(“请输入银行的营业时间:n“);scanf(“%d“,if(closeTime=1440) printf(“三次输入都错误!请按任意键退出!n“);getch();printf(“请按任意键退出!n“);goto end; printf(“请输入最大到达时间间隔:n“); scanf(“%d“,if(arriveMaxTimecloseTime) printf(“输入错误!最大到达时间间隔必须小于营业时间!请再次输入!n“);printf(“请输入最大到达时间间隔:n“); scanf(“%d“,if(arriveMaxTimecloseTime) printf(“输入错误!最大到达时间间隔必须小于营业时间!请最后一次输入!n“);printf(“请输入最大到达时间间隔:n“); scanf(“%d“,if(arriveMaxTimecloseTime)printf(“三次输入都错误!请按任意键退出!n“);getch(); printf(“请按任意键退出!n“);goto end; printf(“请输入最小到达时间间隔:n“); scanf(“%d“,if(arriveMinTime=arriveMaxTime) printf(“输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请再次输入!n“); printf(“请输入最小到达时间间隔:n“); scanf(“%d“,if(arriveMinTime=arriveMaxTime) printf(“输入错误!最小到达时间间隔必须介于零和最大到达时间之间!请最后一次输入!n“); printf(“请输入最小到达时间间隔:n“); scanf(“%d“,if(arriveMinTime=arriveMaxTime)printf(“三次输入都错误!请按任意键退出!n“);getch();printf(“请按任意键退出!n“);goto end; printf(“请输入最大的处理时间:n“);scanf(“%d“,if(dealMaxTimecloseTime) printf(“输入错误!最大处理时间必须小于营业时间!请再次输入!n“); printf(“请输入最大的处理时间:n“);scanf(“%d“,if(dealMaxTimecloseTime) printf(“输入错误!最大处理时间必须小于营业时间!请最后一次输入!n“); printf(“请输入最大的处理时间:n“);scanf(“%d“,if(dealMaxTimecloseTime)printf(“三次输入都错误!请按任意键退出!n“);getch(); printf(“请按任意键退出!n“);goto end;printf(“请输入最小的处理时间:n“);scanf(“%d“, if(dealMinTime=dealMaxTime) printf(“输入错误!最小处理时间必须介于零和最大处理时间之间!请再次输入!n“);printf(“请输入最小的处理时间:n“);scanf(“%d“, if(dealMinTime=dealMaxTime) printf(“输入错误!最小处理时间必须介于零和最大处理时间之间!请最后一次输入!n“);printf(“请输入最小的处理时间:n“);scanf(“%d“, if(dealMinTime=dealMaxTime) printf(“三次输入都错误!请按任意键退出!n“);getch();printf(“请按任意键退出!n“);goto end;printf(“请输入交易额的最大上限:n“);scanf(“%d“,if(dealMaxMoney=total | dealMaxMoney50000) printf(“输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于 50000!请再次输入!n“);printf(“请输入交易额的最大上限:n“);scanf(“%d“,if(dealMaxMoney=total | dealMaxMoney50000)printf(“输入错误!超出本银行的服务范围!最大交易额应低于银行开始营业时的资金总额且小于 50000!请最后一次输入!n“);printf(“请输入交易额的最大上限:n“);scanf(“%d“,if(dealMaxMoney=total | dealMaxMoney50000)printf(“三次输入都错误!请按任意键退出!n“);getch();printf(“请按任意键退出!n“);goto end;thearriveMaxTime +=rand()%(arriveMaxTime-arriveMinTime + 1)+arriveMinTime; /首次到达时间while(currentTime 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. 对于怎样计算已办理顾客的人数,一直没成功,最后在主函数中调用存款,取款函数中计算,才完成。此时可以输入相应数据:a) 银行初始资金 total(测试数据为 10000)b) 银行营业时间 closetime(测试数据为 600)c) 客户交易时间上下界 dealmaxtime 和 dealmintimed) 客户到达时间间隔上下界 arrivemaxtim
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 11803-2025船用交流低压配电板
- 审计运营考试题库及答案
- 森林火知识培训课件
- 森林消防危险地形课件
- 梯形面积课件
- 2025年财务分析师招聘面试实战模拟题及案例解读
- 2025年残联就业指导员面试技巧及常见问题解答
- 2025年注册验船师考试(C级船舶检验法律法规)冲刺试题及答案二
- 2025年风电场安全管理高级运维工程师考试重点解析
- 桥梁施工员培训课件
- 2025年吉林省中考语文真题(含答案)
- 2025高级会计师考试试题及答案
- 工地建筑钢板租赁合同范本
- 光传输业务配置课件
- 2025年辽宁省地质勘探矿业集团有限责任公司校园招聘笔试备考题库带答案详解
- 2025年青海辅警招聘考试题及答案
- 2025新外研版初中英语八年级上全册课文原文翻译
- 钢结构安装安全操作规程
- 流程优化活动方案
- 消防装备认识课件
- 2025年山西中考道德与法治真题解读及答案讲评课件
评论
0/150
提交评论