数据结构课程设计报告-银行业务模拟问题描述--链表和队列_第1页
数据结构课程设计报告-银行业务模拟问题描述--链表和队列_第2页
数据结构课程设计报告-银行业务模拟问题描述--链表和队列_第3页
数据结构课程设计报告-银行业务模拟问题描述--链表和队列_第4页
数据结构课程设计报告-银行业务模拟问题描述--链表和队列_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

- 1 - 数据结构课程设计报告数据结构课程设计报告 银行业务模拟问题描述银行业务模拟问题描述 链表和队列链表和队列 班 级: 计算机 091 班 姓 名: 指导教师: 成 绩:_ 信息工程学院信息工程学院 2011 年 6 月 20 日 - 2 - 摘要摘要 问题描述:客户业务分为两种。第一种是申请从银行得到一笔资金,即取款 或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口, 相应的有两个队列。客户到达银行后先排第一个队。 处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而 得不到满足,则立即排入第二队等候,直至满足时才离开银行,否则业务处理完 后立即离开银行。 每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队 列的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。 注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一 个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理 了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队 列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所 有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟方法 求出客户在银行内逗留的平均时间。 关键字:关键字: 队列 链表 取款 借款 存款 还款 驱动模拟系统 平均时间 - 3 - 目录 1.1.引言引言 .- 4 - 2.2.需求分析需求分析 .- 4 - 3.3.概要设计概要设计 .- 5 - 1.单链表的抽象数据类型定义为:单链表的抽象数据类型定义为:.- 5 - 4.4.详细设计详细设计 .- 6 - 1、程序结构图、程序结构图.- 6 - 2、程序流程图、程序流程图.- 6 - 3 3、算法设计、算法设计.- 7 - 5.5.测试结果测试结果 .- 12 - 6.6.调试分析调试分析 .- 13 - 7.7.设计体会设计体会 .- 13 - 8.8.结束语结束语 .- 13 - 9.9.参考文献参考文献 .- 14 - 10.10.附录附录 .- 14 - - 4 - 1.1.引言引言 随着数据处理的不断进步和计算机网络的迅速发展,银行业务的处理速度 也越来越快,熟悉运用队列和链表编写程序和掌握现代信息系统的开发方法也显 得尤为重要。所以对于计算机专业的学生来说熟练掌握队列的运用是每个学生的 必备本领。本次课程设计就是以银行业务模拟问题为模型,运用 C 语言和数据结 构结合队列和链表开发的系统。 关键字:关键字:C 语言 数据结构 队列 链表 2.2.需求分析需求分析 基本功能:银行的办理业务模式。在与传统的各个窗口排队的方式相比现在 的打卡号的方式更加的科学和合理,对于这种方法的一种模拟就是本软件的要求。 在不同的时间来不同的人,在未知的情况下来的多少人和银行办理业务的资源的 冲突,还有不会因为个人的办理业务的时间长短而影响到其他人办理业务的时间 问题。对于银行流水线业务的模拟。利用等候区来缓冲在窗口使用为满时候的资 源和使用的冲突。在窗口结束工作以后排在队列最前端的顾客去进行办理业务。 输入输出形式:对于次题目是模拟银行运做的系统,而且时间是随即产生的, 关于输入方式。可以不用太多。也可以没有。个人可以在做界面的时候输入对应 的选项。而输出相应的结果。 必要输出:客户到达时间,客户进入的窗口。客户办理的业务。 测试数据:营业时间为 8 小时,其他模拟量自行设定。 测试数据为时间产生的随机数对于模拟银行中的时间和业务敷值。 关键字:关键字:基本功能 输入输出 测试数据 3.3.概要设计概要设计 1.单链表的抽象数据类型定义为: ADT eventlist 数据对象: D=qi|qiElemSet,i=1,2,n,n=o 数据关系: R=qi-1,qi|qi-1,qiD,i=2,3,n - 5 - 队列的抽象数据类型定义: ADT Queue 数据对象:D=ai|aiElemSet,i=1,2,n,n=o 数据关系:R=ai-1,ai|ai-1,aiD,i=2,3,n 基本操作: Initqueue(linkqueue /客户号 string type; /到达或离开 int beginTime; int endTime; int money; /正数为存款,负数为取款 service* next; ; 队列 2 struct queue /队列 service* head; service* rear; ; 入队算法 3 void push(queue temp-money = d; temp-next = NULL; if(NULL = q.head) /队列为空,初始化 q. head = temp; q. rear = temp; /if else /队列不为空,插入元素 d q. rear-next = temp; q. rear = q.rear-next; /else - 8 - 出队算法 4 void pop(queue temp = q. head; if(NULL =q. head-next) q.head = q. rear =NULL; else q. head=q. head-next; delete temp; 返回队首元素算法 5 service* front(queue 返回队尾元素算法 6 service* back(queue 处理事件算法 7 service* searchAndDel(queue /标记头节点 service* temp; while(NULL != q. head) if(-(q. head-money) next; / 首节点后移一位,返回原首节点 return temp; /else /while else /队首元首不能被处理 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 /else if(q. head = sign)/队列循环一周时停止 return NULL; return NULL; 客户到达事件 8 void arrive() /*到达函数 随机产生顾客,进入队列一 产生到达事件 进入事件队列*/ push(fq,(rand()% (2*dealMoney) -dealMoney); /随机产生顾客 加入第一队列 back(fq)-beginTime = currentTime; back(fq)-num = number; - 10 - push(eq,(back(fq)-money); /将产生事件加入事件队列 back(eq)-beginTime = currentTime; back(eq)-type = 到达; back(eq)-num = number; +number 处理存款或还款事件算法 9 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 - front(fq)-beginTime); / 更新逗留时间 pop(fq); /删除第一队列第一个业务 currentTimeOfDeal = back(eq)-endTime; state =0; 处理取款或借款事件算法 10 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); /if else - 11 - total += 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; currentTimeOfDeal = back(eq)-endTime; +counter; /更新客户总数 totalTime += ( back(eq)-endTime - back(fq)-beginTime ); /更新逗留时间 pop(fq); /删除第一队列第一个业务 state =0; /else void findAndDeal() /在队列中寻找可处理元素,对其进行处理 while( (temped= searchAndDel(sq,total) /更新资金总额 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 = NULL; - 12 - state = 0; 5.5.测试结果测试结果 初始界面: 图图 5-15-1 模拟界面: 图图 5-25-2 6.6.调试分析调试分析 - 13 - 1、我开始没有处理系统时间, 即直接使用随机生成的客户到达时间,经查 阅资料才知道,原来分钟用 ti/60 显示,秒用 ti%60 显示即可。 2、变成过程中犯了一个极其简单的错误,把栈和队列竟然弄反了,在运行 结果不对的情况下很难发现错误,花了我好长时间才找出来,我真是糊涂啊。 7.7.设计体会设计体会 本次课程设计我最大的体会是:编程能力怎么样要看能不能用编程来解决实 际生活当中的问题,简单说就是理论联系实际。开始接触这个题目的时候(银行 业务模拟)根本不知从何下手,银行业务怎么和编程联系得上呢?后来通过上网 了解一些实例后,慢慢的一步步上手,等完成以后才知道原来真的可以用编程来 解决一些实际当中的问题的。看来以后还要多多接触这样的问题,来提高自己的 实际能力。 8.8.结束语结束语 这个程序是在 C-Free5.0 版本下完成的。使用时只需直接双击 exe 文件即可。 9.9.参考文献参考文献 1、严蔚敏 吴伟民 著 数据结构(C 语言版) 清华大学出版社 2010 2、谭浩强 著 C 程序设计(第三版) 清华大学出版社 2005 10.10.附录附录 #include #include #include using namespace std; int total; /初始时银行现存资金总额 int closeTime; /营业结束时间 int arriveTime; /两个到达事件之间的间隔上限 int dealTime; /客户之间交易的时间上限 - 14 - int dealMoney = 5000; /交易额上限 int currentTime = 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 temp-money = d; temp-next = NULL; if(NULL = q.head) /队列为空,初始化 q. head = temp; q. rear = temp; /if else /队列不为空,插入元素 d q. rear-next = temp; q. rear = q.rear-next; - 15 - /else void pop(queue temp = q. head; if(NULL =q. head-next) q.head = q. rear =NULL; else q. head=q. head-next; delete temp; service* front(queue service* back(queue service* searchAndDel(queue /标记头节点 service* temp; while(NULL != q. head) if(-(q. head-money) next; / 首节点后移一位,返回原首节点 return temp; /else /while else /队首元首不能被处理 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 /else if(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); /随机产生顾客加入第一队列 back(fq)-beginTime = currentTime; back(fq)-num = number; - 17 - 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()%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(fq)-money ); back(sq)-beginTime = front(fq)-beginTime; back(sq)-num = front(fq)-num; pop(fq); /if else total += back(fq)-money; push(eq,front(fq)-money); /加入事件队列 离开 back(eq)-type = 离开; - 18 - 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; /else service* temped ; int randomTemp; void findAndDeal() /在对列中寻找可处理元素,对其进行处理 while( (temped= searchAndDel(sq,total) /更新资金总额 push(eq,temped-money); /加入事件队列训 离开 back(eq)-type = 离开; back(eq

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论