ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:119.58KB ,
资源ID:3677518      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3677518.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(银行业务模拟问题描述链表和队列.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

银行业务模拟问题描述链表和队列.docx

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

2、待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立即离开银行。写一个上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的平均时间。 关键字: 队列 链表 取款 借款 存款 还款 驱动模拟系统 平均时间目录1.引言 - 4 -2.需求分析 - 4 -3.概要设计 - 5 -1.单链表的抽象数据类型定义为: - 5 -4.详细设计 - 6 -1、程序结构图 - 6 -2、程序流程图 - 6 -3、算法设计 - 7 -5.测试结果 - 12 -

3、6.调试分析 - 13 -7.设计体会 - 13 -8.结束语 - 13 -9.参考文献 - 14 -10.附录 - 14 -1.引言 随着数据处理的不断进步和计算机网络的迅速发展,银行业务的处理速度也越来越快,熟悉运用队列和链表编写程序和掌握现代信息系统的开发方法也显得尤为重要。所以对于计算机专业的学生来说熟练掌握队列的运用是每个学生的必备本领。本次课程设计就是以银行业务模拟问题为模型,运用C语言和数据结构结合队列和链表开发的系统。 关键字:C语言 数据结构 队列 链表 2.需求分析 基本功能:银行的办理业务模式。在与传统的各个窗口排队的方式相比现在的打卡号的方式更加的科学和合理,对于这种方

4、法的一种模拟就是本软件的要求。在不同的时间来不同的人,在未知的情况下来的多少人和银行办理业务的资源的冲突,还有不会因为个人的办理业务的时间长短而影响到其他人办理业务的时间问题。对于银行流水线业务的模拟。利用等候区来缓冲在窗口使用为满时候的资源和使用的冲突。在窗口结束工作以后排在队列最前端的顾客去进行办理业务。 输入输出形式:对于次题目是模拟银行运做的系统,而且时间是随即产生的,关于输入方式。可以不用太多。也可以没有。个人可以在做界面的时候输入对应的选项。而输出相应的结果。 必要输出:客户到达时间,客户进入的窗口。客户办理的业务。测试数据:营业时间为8小时,其他模拟量自行设定。测试数据为时间产生

5、的随机数对于模拟银行中的时间和业务敷值。关键字:基本功能 输入输出 测试数据3.概要设计1.单链表的抽象数据类型定义为: ADT eventlist 数据对象: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) 操作结果

6、:构造一个空的链表 ev; push(queue &q,int d) 初始条件:队列数组已存在 操作结果:在队尾插入一个元素 epop(queue &q)初始条件:队列已存在 操作结果:获取队列 q 的队头 service* front(queue &q)初始条件:队列已存在 操作结果:返回队首元素service* back(queue &q)初始条件:队列已存在 操作结果:返回队尾元素service* searchAndDel(queue &q,int m)初始条件:队列已存在 操作结果:在队里寻找可处理元素void putMoney()操作结果:处理存款事件 void getMoney()

7、操作结果:处理取款事件void arrive()初始条件:初始化操作完毕 操作结果:处理客户到达事件 2本程序包含五个模块:主程序模块:Void main() 接受命令; 处理命令; 事件链表表单元模块实现链表的抽象数据类型; 队列单元模块实现队列的抽象数据类型;事件结点结构单元模块定义链表的结点结构; 队列结点结构单元模块定义队列的结点结构; 各模块之间的调用关系如下:主程序模块链表、队列表单元模块 队列、链表结点结构单元模块。4.详细设计1、该程序结构图图3-12、该程序流程图图3-23、算法设计:客户信息struct service int num; /客户号 string type;

8、/到达或离开 int beginTime; int endTime; int money; /正数为存款,负数为取款 service* next;队列struct queue /队列 service* head; service* rear; 入队算法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; /if else

9、 /队列不为空,插入元素d q. rear-next = temp; q. rear = q.rear-next; /else 出队算法 void pop(queue &q) / 若队列不空,出队列函数 service* temp; temp = q. head; if(NULL =q. head-next) q.head = q. rear =NULL; else q. head=q. head-next; delete temp; 返回队首元素算法service* front(queue &q) /返回队首元素 return q. head;返回队尾元素算法service* back(qu

10、eue &q) /返回队尾元素 return q. rear; 处理事件算法service* searchAndDel(queue &q,int m) /在对列中寻找可处理元素 service* sign = q. head; /标记头节点 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.

11、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; 客户到达事件void arrive() /*到达函数 随机产生顾客,进入队列一产生到达事件 进入事件队列*/ push(fq,(rand()% (2*dealMoney) -dealMoney); /随机产生顾客加入第一队列 back(fq)-beginTime = currentTime; back(fq)-num

12、 = 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 = 离开; back(eq)-num = front(fq)-num;back(eq)-end

13、Time = (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)-mone

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

15、meOfDeal = back(eq)-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-mo

16、ney); /加入事件队列训 离开 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; state =

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

18、完成以后才知道原来真的可以用编程来解决一些实际当中的问题的。看来以后还要多多接触这样的问题,来提高自己的实际能力。8.结束语 这个程序是在C-Free5.0版本下完成的。使用时只需直接双击exe文件即可。9.参考文献 1、严蔚敏 吴伟民 著 数据结构(C语言版) 清华大学出版社 2010 2、谭浩强 著 C程序设计(第三版) 清华大学出版社 200510.附录#include #include #include using namespace std;int total; /初始时银行现存资金总额int closeTime; /营业结束时间int arriveTime; /两个到达事件之间的间

19、隔上限int dealTime; /客户之间交易的时间上限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* hea

20、d; service* rear;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; /if else /队列不为空,插入元素d q. rear-next = temp; q. rear = q.rear-next; /elsevoid pop(queue &q) / 若队列不空,出队列函数 service* temp

21、; temp = q. head; if(NULL =q. head-next) q.head = q. rear =NULL; else q. 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; whi

22、le(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

23、;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; push(eq,

24、(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 +

25、 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)-begin

26、Time; back(sq)-num = front(fq)-num; pop(fq); /if else 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;

27、 /更新客户总数 totalTime += ( back(eq)-endTime - back(fq)-beginTime ); /更新逗留时间 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(eq)-num = temped-num; randomTemp = rand()%dealTime +1; back(eq)-endTime = currentTime + randomTemp ; currentTimeOfDeal += randomTemp;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1