1、 数据结构 课程设计报告 1.银行业务模拟 1.需求分析 客户的业务分为两种:第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中 投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第 一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足, 则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一 个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予 以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于 或等于刚才第一个队
2、列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队 列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的 客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立刻离开银行。 要求:写一个上述银行业务的事件驱动模拟系统,模拟出并输出系统处理所有客户的流程,并计算 出所有客户在银行内逗留的平均时间。 2.设计 2.1 设计思想 本问题主要需要处理两个交易队列(fq,sq)和一个事件队列(eq) 。当有客户来交易时,让客户 先进队列一 fq,然后让事件队列 eq 记下客户随机产生的到达时间,如果客户办理存款,则更新银 行的资金并
3、且记下客户随机产生的逗留时间,办理完后让事件队列记录客户的离开时间,然后从队 列一中删除该客户的结点;如果客户办理取款,当银行此刻的金额可以满足该客户,则更新银行的 资金并且记下客户随机产生的逗留时间,办理完后让事件队列记录客户的离开时间,然后从队列一 中删除该客户的结点,当银行此刻的金额不能够满足该客户,则将该客户转移到队列二等待,直到 下一个办理存款的客户办理完存款后,从队列二的头结点开始搜索,看看有没有可以满足其取款的 客户,如果队列二的头结点客户能满足,则为其办理取款,然后从队列二中删除该节点,并让事件 队列记录该客户的离开时间,如果队列二的头结点客户仍然不能满足,则搜索下一个客户直到
4、将队 列二搜索完。等到银行的营业时间到了后,输出事件队列,需要办理两种业务的顾客数,已成功办 理两种业务的顾客数,两种业务的成功办理率,客户在银行内的平均逗留时间和下班时银行所剩余 的资金总额。 2 实现实现: 输入: 用户需要在程序运行开始时输入以下数据: 银行初始资金 total; 银行营业时间 closetime; 客户交易时间上下界 dealmaxtime 和 dealmintime,用于给随机数产生函数传递参数,产生一个介 于这两个值之间的值; 客户到达时间间隔上界 arrivemaxtime arrivemintime,用于给随机数产生函数传递参数,产生一 个介于这两个值之间的值;
5、 交易额的最大上限 dealMaxMoney.用于给随机函产生函数参数,产生一个介于-dealMaxMoney 和 dealMaxMoney 之间的值,作为顾客到银行办理业务的交易额, 。 输出: 本程序用 dos 界面模拟输出整个银行业务办理及排队的结果,最后给出一下数据: 分别列出需要办理两种业务的顾客数; 分别列出已成功办理两种业务的顾客数; 分别列出两种业务的成功办理率; 客户在银行内的平均逗留时间; 下班时银行所剩余的资金总额。 (1)数据结构设计: 结构体的定义如下:结构体的定义如下: struct service int num; /客户号 string type; /到达或离开
6、 int beginTime;/到达时间 int endTime;/离开时间 int money; /正数为存款,负数为取款 service* next;/指针域 ; 队列的抽象数据类型定义如下:队列的抽象数据类型定义如下: ADT Queue 数据对象:D ai | aiElemSet, i=1,2,.,n, n0 数据关系:R1 |ai-1, aiD, i=2,.,n 基本操作: void init_Q(Queue 操作结果:构造空队列 Q 3 int Q_empty(Queue Q); 初始条件:队列 Q 存在 操作结果:若 Q 为空队列,则返回 TRUE,否则 FALSE int Q_length(Queue Q); 初始条件:队列 Q 存在 操作结果:返回队列 Q 的元素个数,即队列长度 int gethead_Q(Queue Q); 初始条件:队列 Q 存在 操作结果:返回队列 Q 的队头元素 void en_Q(Queue 初始条件:队列 Q 存在 操作结果:插入元素 e 为 Q 的新的队尾元素。 void de_Q(Q