版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上数据结构课程设计报告银行业务模拟问题描述链表和队列班 级: 计算机091班 姓 名: 王 威 指导教师: 董 跃 华、井福荣 成 绩:_ 信息工程学院 2011年 6月 20日摘要问题描述:客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应的有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立即排入第二队等候,直至满足时才离开银行,否则业务处理完后立即离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第
2、二个队列的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。 关键字: 队列 链表 取款 借款 存款 还款 驱动模拟系统 平均时间目录1.引言 随着数据处理的不断进步和计算机网络的迅速发展,银行业务的
3、处理速度也越来越快,熟悉运用队列和链表编写程序和掌握现代信息系统的开发方法也显得尤为重要。所以对于计算机专业的学生来说熟练掌握队列的运用是每个学生的必备本领。本次课程设计就是以银行业务模拟问题为模型,运用C语言和数据结构结合队列和链表开发的系统。 关键字:C语言 数据结构 队列 链表 2.需求分析 基本功能:银行的办理业务模式。在与传统的各个窗口排队的方式相比现在的打卡号的方式更加的科学和合理,对于这种方法的一种模拟就是本软件的要求。在不同的时间来不同的人,在未知的情况下来的多少人和银行办理业务的资源的冲突,还有不会因为个人的办理业务的时间长短而影响到其他人办理业务的时间问题。对于银行流水线业
4、务的模拟。利用等候区来缓冲在窗口使用为满时候的资源和使用的冲突。在窗口结束工作以后排在队列最前端的顾客去进行办理业务。 输入输出形式:对于次题目是模拟银行运做的系统,而且时间是随即产生的,关于输入方式。可以不用太多。也可以没有。个人可以在做界面的时候输入对应的选项。而输出相应的结果。 必要输出:客户到达时间,客户进入的窗口。客户办理的业务。 测试数据:营业时间为8小时,其他模拟量自行设定。测试数据为时间产生的随机数对于模拟银行中的时间和业务敷值。关键字:基本功能 输入输出 测试数据3.概要设计1.单链表的抽象数据类型定义为: ADT eventli
5、st 数据对象:D=qi|qiElemSet,i=1,2,n,n>=o 数据关系:R=qi-1,qi>|qi-1,qiD,i=2,3,n 队列的抽象数据类型定义: ADT Queue 数据对象:D=ai|aiElemSet,i=1,2,n,n>=o 数据关系:R=ai-1,ai>|ai-1,aiD,i=2,3,n 基本操作: Initqueue(linkqueue &q) 操作结果:构造一个空的队列 q; Initlist(linklist &ev) 操作结果:构造一个空的链表 ev; push(queue &q,int d) 初始条件:队列数组
6、已存在 操作结果:在队尾插入一个元素 epop(queue &q)初始条件:队列已存在 操作结果:获取队列 q 的队头 service* front(queue &q)初始条件:队列已存在 操作结果:返回队首元素service* back(queue &q)初始条件:队列已存在 操作结果:返回队尾元素service* searchAndDel(queue &q,int m)初始条件:队列已存在 操作结果:在队里寻找可处理元素void putMoney()操作结果:处理存款事件 void getMoney()操作结果:处理取款事件void arrive()初始条件
7、:初始化操作完毕 操作结果:处理客户到达事件 2本程序包含五个模块:主程序模块:Void main() 接受命令; 处理命令; 事件链表表单元模块实现链表的抽象数据类型; 队列单元模块实现队列的抽象数据类型;事件结点结构单元模块定义链表的结点结构; 队列结点结构单元模块定义队列的结点结构; 各模块之间的调用关系如下:主程序模块链表、队列表单元模块> 队列、链表结点结构单元模块。4.详细设计1、该程序结构图主函数Main()到达事件处理函数arrive()存款事件函数putMoney()处理客户事件函数findAndDeal()取款事件函数getMoney()产生随机数的函数Random(
8、)返回队尾函数back(queue &q)出队函数pop()入队函数push()图3-12、该程序流程图办业务?开始到达结束存款还款?取款借款?否是是是是否否图3-23、算法设计:客户信息struct service int num; /客户号string type; /到达或离开int beginTime;int endTime;int money; /正数为存款,负数为取款service* next;队列struct queue /队列service* head;service* rear; 入队算法void push(queue &q,int d) / 插入元素d为Q的新
9、的队尾元素service* temp = new service;temp->money = d;temp->next = NULL;if(NULL = q.head) /队列为空,初始化q. head = temp;q. rear = temp;/ifelse /队列不为空,插入元素dq. rear->next = temp;q. rear = q.rear->next;/else 出队算法void pop(queue &q) / 若队列不空,出队列函数service* temp;temp = q. head;if(NULL =q. head->next
10、)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* searchAndDel(queue &q,int m) /在对列中寻找可处理元素service* sign = q. head; /标记头节点service* temp;while(NULL
11、 != q. head) if(-(q. head->money) <m) /队首元素可以处理if(q. head=q.rear) temp = q. head;q. head = q. rear = NULL;return temp;/ifelse /队首元素出列temp = q. head; q. head = q. head->next; / 首节点后移一位,返回原首节点return temp;/else/whileelse /队首元首不能被处理if(q. head = q. rear)else /首节点移到队列尾部q. rear->next = q. head;
12、 q. rear = q. rear->next;q. head =q. head->next;q. rear->next = NULL;/else/elseif(q. head = sign)/队列循环一周时停止return NULL;return NULL; 客户到达事件void arrive() /*"到达"函数 随机产生顾客,进入队列一产生到达事件 进入事件队列*/push(fq,(rand()% (2*dealMoney) -dealMoney); /随机产生顾客加入第一队列back(fq)->beginTime = currentTime
13、;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
14、 = "离开"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; 处理取款或借款事件算法void
15、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;push(eq,front(fq)->money); /加入事件队列 离开back(eq)->type = "离开"
16、;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;/elsevo
17、id 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;back(eq)->endTim
18、e = currentTime + randomTemp ;currentTimeOfDeal += randomTemp;+counter; /更新客户总数totalTime += ( back(eq)->endTime - temped->beginTime ); /更新逗留时间 delete temped; /删除节点temped = NULL;state = 0;5.测试结果初始界面:图5-1模拟界面:图5-26.调试分析1、我开始没有处理系统时间, 即直接使用随机生成的客户到达时间,经查阅资料才知道,原来分钟用 ti/60 显示,秒用 ti%60 显示即可。2、变成过程中
19、犯了一个极其简单的错误,把栈和队列竟然弄反了,在运行结果不对的情况下很难发现错误,花了我好长时间才找出来,我真是糊涂啊。7.设计体会本次课程设计我最大的体会是:编程能力怎么样要看能不能用编程来解决实际生活当中的问题,简单说就是理论联系实际。开始接触这个题目的时候(银行业务模拟)根本不知从何下手,银行业务怎么和编程联系得上呢?后来通过上网了解一些实例后,慢慢的一步步上手,等完成以后才知道原来真的可以用编程来解决一些实际当中的问题的。看来以后还要多多接触这样的问题,来提高自己的实际能力。8.结束语这个程序是在C-Free5.0版本下完成的。使用时只需直接双击exe文件即可。9.参考文献1、严蔚敏
20、吴伟民 著 数据结构(C语言版) 清华大学出版社 20102、谭浩强 著 C程序设计(第三版) 清华大学出版社 200510.附录#include <iostream>#include <string>#include <time.h>using namespace std;int total; /初始时银行现存资金总额int closeTime; /营业结束时间int arriveTime; /两个到达事件之间的间隔上限int dealTime; /客户之间交易的时间上限int dealMoney = 5000; /交易额上限int currentTime
21、 = 0; /当前时间int totalTime = 0; /客户逗留总时间int counter = 0; /客户总数int number = 1; /初始客户序列号struct service int num; /客户号string type; /到达或离开int beginTime;int endTime;int money; /正数为存款,负数为取款service* next;struct queue /队列service* head;service* rear;void push(queue &q,int d) / 插入元素d为Q的新的队尾元素service* temp =
22、new service;temp->money = d;temp->next = NULL;if(NULL = q.head) /队列为空,初始化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(NULL =q. head->next)q.head = q. rear =NULL;el
23、seq. head=q. head->next;delete temp;service* front(queue &q) /返回队首元素return q. head;service* back(queue &q) /返回队尾元素return q. rear;service* searchAndDel(queue &q,int m) /在对列中寻找可处理元素service* sign = q. head; /标记头节点service* temp;while(NULL != q. head) if(-(q. head->money) <m) /队首元素可以
24、处理if(q. head=q.rear) temp = q. head;q. head = q. rear = NULL;return temp;/ifelse /队首元素出列temp = q. head; q. head = q. head->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->ne
25、xt;q. rear->next = 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*deal
26、Money) -dealMoney); /随机产生顾客加入第一队列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; /更新资金总
27、额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); /删除第一队列第一个业务currentTim
28、eOfDeal = 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;push(eq,front(fq)->money
29、); /加入事件队列 离开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
30、 ); /更新逗留时间pop(fq); /删除第一队列第一个业务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(
31、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 = NULL;state = 0;int main() printf("nn");printf(" *n");printf(" * *n");printf(" * 欢迎进入银行模拟系统 *n");printf(" * *n");printf("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度车展场地租赁与媒体合作合同3篇
- 2025年度农产品出口质量保障合同3篇
- 2025年度个人环保项目贷款合同(含环保指标达标)4篇
- 二零二五年度承包工地食堂员工心理健康关爱合同3篇
- 汕尾2025年广东汕尾陆河县第一批城镇公益性岗位招聘笔试历年参考题库附带答案详解
- 数字化时代的学生管理与德育工作变革
- 二零二五年度仓储设施租赁与运输服务合同3篇
- 普洱2024年云南普洱市科学技术局城镇公益性岗位工作人员招聘笔试历年参考题库附带答案详解
- 昭通2025年云南昭通巧家县人力资源和社会保障局零星选调工作人员笔试历年参考题库附带答案详解
- 社交媒体时代孩子的行为模式与心理变化
- JT-T-496-2018公路地下通信管道高密度聚乙烯硅芯塑料管
- 人员密集场所消防安全管理培训
- 《聚焦客户创造价值》课件
- PTW-UNIDOS-E-放射剂量仪中文说明书
- JCT587-2012 玻璃纤维缠绕增强热固性树脂耐腐蚀立式贮罐
- 保险学(第五版)课件全套 魏华林 第0-18章 绪论、风险与保险- 保险市场监管、附章:社会保险
- 典范英语2b课文电子书
- 员工信息登记表(标准版)
- 17~18世纪意大利歌剧探析
- 春节工地停工复工计划安排( 共10篇)
- 何以中国:公元前2000年的中原图景
评论
0/150
提交评论