1、银行管理系统实验报告一 需求分析 假设某银行有2个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进和银行的客户。如果某个窗口的业务员正空闲,则可上前办理业务。反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。1.输入:初始存款, 营业时间,最大到达时间间隔,最 大处理时间2.输出:客户到达离开时间,客户平均逗留时间,银行余额 3.功能:模拟银行业务情况,计算客户平均逗留时间4.测试数据:随机 二 概要设计数据结构:用
2、链表实现客户到来和离开事件表。用队列实现用户无法进行事物办理时的排队情况。三 详细设计1. 数据结构详细设计:struct queue /队列service* head;service* rear;queue eq; /事件队列queue fq; /队列一 queue sq; /对列二 /初始化三个队列四 调试分析 调试过程中遇到的问题:银行服务中,不只是存取款这些简单的事情,我在最初的程序设计时考虑十分浅显。对于如何使用链表实现表示客户到来跟业务办理时存在疑问,经老师同学指点后问题解决。五 使用说明和测试结果1.使用说明:用户选择1或0(开始模拟或退出)开始程序。自主输入银行的初始存款、银行
3、的营业时间、最大到达时间间隔、最大处理时间。回车。程序开始运行。2.测试结果:六 心得体会 通过此次实验,成功的实现了由队列来解决很多解决问题时需要等待排队的问题。对于如何使用链表表现相关到达及处理问题事宜也有了更近一步的学习。在实践过程中,遇到了很多由于经验不足而导致的问题,幸好在老师和同学们的帮助下,我顺利完成了实验,并学习了更多。 附录源代码:#include #include #include using namespace std;int total; /初始时银行现存资金总额int closeTime; /营业结束时间int arriveTime; /两个到达事件之间的间隔上限in
4、t dealTime; /客户之间交易的时间上限int dealMoney = 5000; /交易额上限int currentTime = 0; /当前时间int totalTime = 0; /客户逗留总时间int counter = 0; /客户总数int number = 1; /初始客户序列号bool state =1; /用于判断是否有窗口在处理int currentTimeOfDeal = 0;int theArriveTime = 0;struct service int num; /客户号 string type; /到达或离开 int beginTime; int endTi
5、me; int money; /正数为存款,负数为取款 service* next;struct queue /队列service* head;service* rear;queue eq; /事件队列queue fq; /队列一 queue sq; /对列二 /初始化三个队列void push(queue &q,int d)/ 插入元素d为Q的新的队尾元素service* temp = new service;temp-money = d;temp-next = NULL;if(NULL = q.head)/队列为空,初始化q. head = temp;q. rear = temp;/ife
6、lse /队列不为空,插入元素dq. rear-next = temp;q. rear = q.rear-next;/void 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* searchAn
7、dDel(queue &q,int m)/在对列中寻找可处理元素service* sign = q. head; /标记头节点service* temp;while(NULL != q. head)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 = NUL
8、L;/else/elseif(q. head = sign)/队列循环一周时停止return NULL;return NULL;void arrive()/到达函数 随机产生顾客,进入队列一产生到达事件 进入事件队列push(fq,(rand()% (2*dealMoney) -dealMoney); /随机产生顾客加入第一队列,-5000-5000back(fq)-beginTime = currentTime;back(fq)-num = number;push(eq,(back(fq)-money); /将产生事件加入事件队列back(eq)-beginTime = currentTim
9、e;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()%dealTime +1);+counter; /更新客户总数totalTime += (back(eq)-endTime -
10、 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);/ifelse total += back(fq)-money; pus
11、h(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);
12、/删除第一队列第一个业务 state =0;/elseservice* temped ;int randomTemp;void findAndDeal()/在对列中寻找可处理元素,对其进行处理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
13、;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(1.开始模拟 0.退出n);int n;scanf(%d,&n);whi
14、le(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 closeTime)+currentTime;if( currentTimeOfD
15、eal money = 0)putMoney();findAndDeal();/ifelse getMoney();/ifcout endl 客户序列t 事件类型 tt 时 间 t 处理金额type=离开)cout numtttypettttendTimettmoneytype=到达)cout numtttypettttbeginTimettmoneyendl;pop(eq);cout 银行关门 未处理客户: beginTime ); /更新结束时第一队列中未处理的客户cout num endl ;+counter;pop(fq);/while cout 资金短缺 未处理客户: beginTime ); /更新结束时第二队列中未处理的客户cout num endl ;+counter;pop(sq);cout客户逗留平均时间为: totalTime/counter endl;cout银行当前余额:totalendl;break;/while(n=1)return 0;/maim()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1