c语言银行业务模拟.docx

上传人:大张伟 文档编号:6124040 上传时间:2020-09-11 格式:DOCX 页数:11 大小:26.54KB
返回 下载 相关 举报
c语言银行业务模拟.docx_第1页
第1页 / 共11页
c语言银行业务模拟.docx_第2页
第2页 / 共11页
c语言银行业务模拟.docx_第3页
第3页 / 共11页
c语言银行业务模拟.docx_第4页
第4页 / 共11页
c语言银行业务模拟.docx_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《c语言银行业务模拟.docx》由会员分享,可在线阅读,更多相关《c语言银行业务模拟.docx(11页珍藏版)》请在三一文库上搜索。

1、银行业务模拟( 2) 银行业务模拟(难度系数)问题描述客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或换款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先派第一个队列。处理每一个客户业务时, 如属于第一种, 且申请超出银行现存资金总额而得不到满足的,则立即排入第二个队列等候,直到满足时才离开银行;否则业务处理完后立即离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的末尾。注意:在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个

2、客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。基本要求利用动态存储结构实现模拟。测试数据一天营业开始银行拥有的款项10000 (元),营业时间为 600 分钟。其他模拟的参量自定。注意测定两种极端情况:一是两个到达事件之间的间隔很短,而客户的交易时间很长;另一个正好相反,设置两个到达事件的间隔时间很长,而客户之间交易的时间很短。实现提示

3、事件有两类:到达银行和离开银行。初始时银行现存资金总额为Total 。开始营业后的第一个事件是客户到达,营业时间从 0 到 Closetime。到达事件发生时随机地设置各客户的交易时间和距下一次到达时间之间的时间间隔。每个客户要办理的款项也是随机确定的,用负值和正值分别表示第一类和第二类业务。变量Total、 CloseTime 以及上述两个随机量的上下界均交互地从终端读入,作为模拟参数。两个队列和一个事件表均要用动态的存储结构实现。注意弄清应该在什么条件下设置离开事件,以及第二个队列用怎样的存储结构实现可以获得较高的效率。注意:时间表是按照时间顺序有序的。#include #include

4、#include using namespace std;int total; / 初始时银行现存资金总额int closeTime; /营业结束时间int arriveTime;/ 两个到达事件之间的间隔上限int dealTime; / 客户之间交易的时间上限int dealMoney = 5000; /交易额上限int currentTime = 0; /当前时间int totalTime = 0; / 客户逗留总时间1 / 8int counter = 0; /客户总数int number = 1; /初始客户序列号+struct serviceint num; / 客户号string

5、 type; /到达或离开int beginTime;int endTime;int money; /正数为存款,负数为取款service* next;struct queue /队列service* head;service* rear;void push(queue &q,intd)/插入元素d 为 Q 的新的队尾元素service* temp = new service;temp-money = d;temp-next = NULL;if(NULL= q.head)/ 队列为空,初始化q. head = temp;q. rear = temp;/ifelse/ 队列不为空,插入元素dq.

6、 rear-next = temp;q. rear = q.rear-next;/else2 / 8void pop(queue &q)/若队列不空 ,出对列函数service* temp;temp = q. head;if(NULL=q. head-next)q.head = q. rear =NULL;elseq. head=q. head-next;delete temp;service* front(queue &q)/ 返回队首元素return q. head;service* back(queue &q)/ 返回队尾元素return q. rear;service* searchA

7、ndDel(queue &q,intm)/ 在对列中寻找可处理元素service* sign = q. head; /标记头节点service* temp;while(NULL!= q. head)if(-(q.head-money) next; / 首节点后移一位,返回原首节点return temp;/else/whileelse3 / 8/ 队首元首不能被处理if(q. head = q. rear)else/ 首节点移到队列尾部q. rear-next = q. head;q. rear = q. rear-next;q. head =q. head-next;q. rear-next

8、= NULL;/else/elseif(q. head = sign)/ 队列循环一周时停止return NULL;return NULL;bool state =1; /用于判断是否有窗口在处理int currentTimeOfDeal= 0;int theArriveTime= 0;queue eq; /事件队列queue fq; /队列一queue sq; /对列二/初始化三个队列void arrive()/* 到达 函数随机产生顾客,进入队列一产生到达事件进入事件队列*/push(fq,(rand()%(2*dealMoney)-dealMoney); / 随机产生顾客加入第一队列ba

9、ck(fq)-beginTime= currentTime;back(fq)-num= number;push(eq,(back(fq)-money);/ 将产生事件加入事件队列back(eq)-beginTime = currentTime;back(eq)-type = 到达 ;back(eq)-num = number;+number;4 / 8void putMoney() /存款函数total += front(fq)-money;/更新资金总额push(eq,front(fq)-money);/加入事件队列离开back(eq)-type = 离开 ;back(eq)-num = f

10、ront(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;void getMoney()/ 取款函数if( (-fq.head-money) total )/ 资金短缺加入第二队列push( sq,front(f

11、q)-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()%dealTime +1);back(eq)-beginTime = 0;currentTimeOf

12、Deal = back(eq)-endTime;+counter;/ 更新客户总数totalTime+= ( back(eq)-endTime - back(fq)-beginTime ); / 更新逗留时间pop(fq);/删除第一队列第一个业务state =0;/elseservice* temped ;int randomTemp;void findAndDeal()5 / 8/ 在对列中寻找可处理元素,对其进行处理while(temped= searchAndDel(sq,total)&NULL!= temped )/ 查找可处理取款total += temped-money; / 更

13、新资金总额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); /更新逗留时间delete temped; /删除节点temped = NU

14、LL;state = 0;int main()printf(*n);printf(欢迎进入银行模拟系统n);printf(*n);printf(1. 开始模拟0.退出 n);int n;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,&deal

15、Time);6 / 8theArriveTime+=rand()%arriveTime+1;/ 首次到达时间while(currentTime closeTime)+currentTime;if(currentTimeOfDealmoney=0)putMoney();findAndDeal();/ifelsegetMoney();/ifcout endl 客户序列 t事件类型 tt时间 t处理金额 type= 离开 )cout numtttypettttendTimettmoneytype= 到达 )cout numtttypettttbeginTimettmoneyendl;pop(eq);cout 未处理客户 : beginTime); /更新结束时第一队列中未处理的客户7 / 8cout num endl ;+counter;pop(fq);/whilecout 客户逗留平均时间为: totalTime/counterendl;cout 银行当前余额:totalendl;break;/while(n=1)return 0;/maim()8 / 8

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1