银行业务模拟问题描述设计报告.doc_第1页
银行业务模拟问题描述设计报告.doc_第2页
银行业务模拟问题描述设计报告.doc_第3页
银行业务模拟问题描述设计报告.doc_第4页
银行业务模拟问题描述设计报告.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、数据结构课程设计报告数据结构课程设计报告银行业务模拟问题描述银行业务模拟问题描述-链表和队列链表和队列班 级: 计算机 091 班 姓 名: 王 威 指导教师: 董 跃 华、井福荣 成 绩:_ 信息工程学院信息工程学院 2011 年 6 月 20 日摘要摘要问题描述:客户业务分为两种.第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应的有两个队列.客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立即排入第二队等候,直至满足时才离开银行,否则业务处理完后立即离开银行。每接待完

2、一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口.假设检查不需要时间。营业时间结束时所有客户立即离开银行.写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。 关键字:关键字: 队列 链表 取款 借款 存款 还款 驱动模拟系统 平均时间目录1 1

3、。引言。引言. 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 -1010。附录。附录. 14 -1.1.引言引言 随着数据处理的不断进步和计算机网络的迅速发展,银

4、行业务的处理速度也越来越快,熟悉运用队列和链表编写程序和掌握现代信息系统的开发方法也显得尤为重要.所以对于计算机专业的学生来说熟练掌握队列的运用是每个学生的必备本领.本次课程设计就是以银行业务模拟问题为模型,运用 C 语言和数据结构结合队列和链表开发的系统。 关键字:关键字:C 语言 数据结构 队列 链表 2.2.需求分析需求分析 基本功能:银行的办理业务模式。在与传统的各个窗口排队的方式相比现在的打卡号的方式更加的科学和合理,对于这种方法的一种模拟就是本软件的要求。在不同的时间来不同的人,在未知的情况下来的多少人和银行办理业务的资源的冲突,还有不会因为个人的办理业务的时间长短而影响到其他人办

5、理业务的时间问题。对于银行流水线业务的模拟。利用等候区来缓冲在窗口使用为满时候的资源和使用的冲突。在窗口结束工作以后排在队列最前端的顾客去进行办理业务。 输入输出形式:对于次题目是模拟银行运做的系统,而且时间是随即产生的,关于输入方式。可以不用太多。也可以没有。个人可以在做界面的时候输入对应的选项。而输出相应的结果. 必要输出:客户到达时间,客户进入的窗口.客户办理的业务. 测试数据:营业时间为 8 小时,其他模拟量自行设定.测试数据为时间产生的随机数对于模拟银行中的时间和业务敷值。关键字:关键字:基本功能 输入输出 测试数据3 3。概要设计。概要设计1.单链表的抽象数据类型定义为: ADT

6、eventlist 数据对象: D=qiqiElemSet,i=1,2,,n,n=o 数据关系: R=qi1,qi|qi-1,qiD,i=2,3,,n 队列的抽象数据类型定义: ADT Queue 数据对象:D=aiaiElemSet,i=1,2,,n,n=o 数据关系:R=ai1,ai|ai-1,aiD,i=2,3,n 基本操作: Initqueue(linkqueue &q) 操作结果:构造一个空的队列 q; Initlist(linklist &ev) 操作结果:构造一个空的链表 ev; push(queue q,int d) 初始条件:队列数组已存在 操作结果:在队尾插

7、入一个元素 epop(queue q)初始条件:队列已存在 操作结果:获取队列 q 的队头 service* front(queue &q)初始条件:队列已存在 操作结果:返回队首元素service* back(queue &q)初始条件:队列已存在 操作结果:返回队尾元素service* searchAndDel(queue &q,int m)初始条件:队列已存在 操作结果:在队里寻找可处理元素void putMoney()操作结果:处理存款事件 void getMoney()操作结果:处理取款事件void arrive()初始条件:初始化操作完毕 操作结果:处理客户

8、到达事件 2本程序包含五个模块:主程序模块:Void main() 接受命令; 处理命令; 事件链表表单元模块实现链表的抽象数据类型; 队列单元模块-实现队列的抽象数据类型;事件结点结构单元模块-定义链表的结点结构; 队列结点结构单元模块-定义队列的结点结构; 各模块之间的调用关系如下:主程序模块链表、队列表单元模块 队列、链表结点结构单元模块。4 4。详细设计。详细设计1、该程序结构图主函数 Main()到达事件处理函数arrive()存款事件函数putMoney()处理客户事件函数findAndDeal()取款事件函数getMoney()产生随机数的函数Random()返回队尾函数back

9、(queue &q)出队函数pop()入队函数push()图图 312、该程序流程图办业务?开始到达结束存款还款?取款借款?否是是是是否否图图 323、算法设计:客户信息struct service int num; /客户号string type; /到达或离开int beginTime;int endTime;int money; /正数为存款,负数为取款service* next; ;Error!Error!队列struct queue /队列service* head;service rear; ; 入队算法,3void push(queue &q,int d) / 插

10、入元素 d 为 Q 的新的队尾元素service* temp = new service;tempmoney = d;temp-next = NULL;if(NULL = q。head) /队列为空,初始化q。 head = temp;q. rear = temp;/ifelse /队列不为空,插入元素 dq。 rearnext = temp;q. rear = q.rear-next;/else 出队算法void pop(queue &q) / 若队列不空,出队列函数service* temp;temp = q。 head;if(NULL =q。 headnext)q。head =

11、q。 rear =NULL;elseq. head=q。 headnext;delete temp; 返回队首元素算法service* front(queue &q) /返回队首元素return q。 head; Error!Error!返回队尾元素算法service back(queue &q) /返回队尾元素return q。 rear; Error!Error!处理事件算法service* searchAndDel(queue &q,int m) /在对列中寻找可处理元素service sign = q。 head; /标记头节点service* temp;whi

12、le(NULL != q。 head) if((q. headmoney) 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;back(fq

13、)-num = number;push(eq,(back(fq)-money)); /将产生事件加入事件队列back(eq)beginTime = currentTime;back(eq)-type = 到达;back(eq)num = number;+number Error!Error!处理存款或还款事件算法void putMoney() /存款函数total += front(fq)-money; /更新资金总额push(eq,front(fq)-money); /加入事件队列 离开back(eq)type = 离开;back(eq)-num = front(fq)-num;back(e

14、q)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 )

15、;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 = ”离开” ;back(eq)-num = front(fq)num;back(eq)-endTime=(front(fq)beginTime + rand()%dealTime +1);back(eq)-beginTime = 0;currentTimeOfDeal = back(e

16、q)endTime;+counter; /更新客户总数 totalTime += ( back(eq)endTime back(fq)beginTime ); /更新逗留时间pop(fq); /删除第一队列第一个业务state =0;/elsevoid findAndDeal() /在队列中寻找可处理元素,对其进行处理while( (temped= searchAndDel(sq,total)&NULL != temped ) /查找可处理取款total += temped-money; /更新资金总额push(eq,temped-money) ; /加入事件队列训 离开back(eq

17、)type = ”离开” ;back(eq)-num = tempednum;randomTemp = rand()%dealTime +1;back(eq)endTime = currentTime + randomTemp ;currentTimeOfDeal += randomTemp;+counter; /更新客户总数totalTime += ( back(eq)endTime - temped-beginTime ) ; /更新逗留时间 delete temped; /删除节点temped = NULL;state = 0;5.5.测试结果测试结果初始界面:图图 5-15-1模拟界面

18、:图图 5-25-26 6。调试分析。调试分析1、我开始没有处理系统时间, 即直接使用随机生成的客户到达时间,经查阅资料才知道,原来分钟用 ti/60 显示,秒用 ti60 显示即可。2、变成过程中犯了一个极其简单的错误,把栈和队列竟然弄反了,在运行结果不对的情况下很难发现错误,花了我好长时间才找出来,我真是糊涂啊.7 7。设计体会。设计体会本次课程设计我最大的体会是:编程能力怎么样要看能不能用编程来解决实际生活当中的问题,简单说就是理论联系实际。开始接触这个题目的时候(银行业务模拟)根本不知从何下手,银行业务怎么和编程联系得上呢?后来通过上网了解一些实例后,慢慢的一步步上手,等完成以后才知道

19、原来真的可以用编程来解决一些实际当中的问题的。看来以后还要多多接触这样的问题,来提高自己的实际能力。8 8。结束语。结束语这个程序是在 C-Free5.0 版本下完成的。使用时只需直接双击 exe 文件即可。9 9。参考文献。参考文献1、严蔚敏 吴伟民 著 数据结构(C 语言版) 清华大学出版社 20102、谭浩强 著 C 程序设计(第三版) 清华大学出版社 20051010。附录。附录#include #include next = NULL;if(NULL = q。head) /队列为空,初始化q. head = temp;q. rear = temp;/ifelse /队列不为空,插入元

20、素 dq. rear-next = temp;q。 rear = q。rearnext;/elsevoid pop(queue &q) / 若队列不空,出队列函数service* temp;temp = q。 head;if(NULL =q. headnext)q。head = q. rear =NULL;elseq. head=q。 headnext;delete temp;service* front(queue &q) /返回队首元素return q. head;service back(queue &q) /返回队尾元素return q. rear;servic

21、e searchAndDel(queue q,int m) /在对列中寻找可处理元素service* sign = q。 head; /标记头节点service temp;while(NULL != q. head) if((q。 headmoney)) 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/

22、whileelse /队首元首不能被处理if(q. head = q. rear)else /首节点移到队列尾部q. rear-next = q。 head; q. rear = q. rearnext;q。 head =q。 head-next;q。 rearnext = NULL;/else/elseif(q。 head = sign)/队列循环一周时停止return NULL;return NULL;bool state =1; /用于判断是否有窗口在处理int currentTimeOfDeal = 0;int theArriveTime = 0;queue eq; /事件队列queu

23、e fq; /队列一queue sq; /对列二/初始化三个队列void arrive() /*”到达函数 随机产生顾客,进入队列一产生到达事件 进入事件队列*/push(fq, (rand()% (2dealMoney) -dealMoney); /随机产生顾客加入第一队列back(fq)beginTime = currentTime;back(fq)-num = number;push(eq,(back(fq)money)); /将产生事件加入事件队列back(eq)-beginTime = currentTime;back(eq)type = 到达;back(eq)-num = numb

24、er;+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); /删除第一队列

25、第一个业务currentTimeOfDeal = back(eq)endTime; state =0;void getMoney() /取款函数if( (fq。headmoney) 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 = ”离开

26、”;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;/elseservice temped ;int randomTemp;vo

27、id findAndDeal() /在对列中寻找可处理元素,对其进行处理while( (temped= searchAndDel(sq,total)&NULL != temped ) /查找可处理取款total += temped-money; /更新资金总额push(eq,temped-money) ; /加入事件队列训 离开back(eq)-type = ”离开;back(eq)num = tempednum;randomTemp = rand()dealTime +1;back(eq)-endTime = currentTime + randomTemp ;currentTimeOfDeal += randomTemp;+counter; /更新客户总数totalTime += ( back(eq)-endTime - tempedbeginTime ); /更新逗留时间 delete temped; /删除节点

温馨提示

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

评论

0/150

提交评论