银行业务模拟系统课程设计_第1页
银行业务模拟系统课程设计_第2页
银行业务模拟系统课程设计_第3页
银行业务模拟系统课程设计_第4页
银行业务模拟系统课程设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、 石家庄经济学院 本科生课程设计报告书题 目 银行业务模拟系统 姓名 郑小波 学号410109030211 学 院信息工程学院 专业计算机 指导教师张友华 完成日期: 2012-7-4银行业务模拟系统1 需求分析11问题描述:客户业务分为两种。第一种是申请从银行得到一笔资金,即取款或借款。第二种是向银行投入一笔资金,即存款或还款。银行有两个服务窗口,相应的有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立即排入第二队等候,直至满足时才离开银行,否则业务处理完后立即离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如

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

3、交易时间deal time,5、 到达时间和每个客户要办理的款额随机产生。输出:1、顾客在银行内平均逗留时间。2、下班时银行剩余的资金总额。13系统的测试用例:输入:一天营业开始时银行拥有的款额为10000(元),营业时间为600(分钟),最大达到时间间隔20,最大交易时间5。(到达事件的间隔时间很长,而客户的交易时间很短。)客户逗留时间,到达时间,客户存取款金额由程序随机产生。客户序号 事件类型 时间 处理金额 1 到达 9:13 40001 离开 9:17 4000 2 到达 9:17 20002 离开 9:21 2000 3 到达 9:23 -15003 离开 9:25 -1500 4

4、到达 9:30 100004 离开 9:35 10000 5 到达 9:36 -30005 离开 9:38 -3000说明:正数代表存款金额,负数代表取款金额。输出:一天内客户的数目为5,下班时银行剩余资金总额为21500,顾客在银行内平均逗留时间为3.4。2 概要设计本题用队列的抽象数据类型登录排队等候办理业务的顾客情况。队列中的每个元素包括顾客进们的时刻和办理业务所需时间。1、队列的抽象数据类型定义为adt queue数据对象:d=ai|aielemset, i=1,2, ,n, n0数据关系:r=|ai-1,aid, i=1,2, ,n 基本操作: initqueue0211(linkq

5、ueue &a ) 操作结果:构造一个空队列a puch0211 ( queue &q,int d ) 初始条件:队列q已存在 操作结果:在队尾插入一个元素e pop0211 ( queue &q ) 初始条件:队列q已存在 操作结果:获取队列的队头service* front0211(queue &q)初始条件:队列q已存在 操作结果:返回队首元素service* back0211(queue &q)初始条件:队列q已存在 操作结果:返回队尾元素service* searchanddel0211(queue &q)初始条件:队列q已存在 操作结果:在队里寻找可处理元素adt queue2、自

6、定义函数:void putmoney0211 ()操作结果:处理存款事件void getmoney0211 ()操作结果:处理取款事件void arrive0211 ()初始条件:初始化操作完毕操作结果:处理客户到达事件 void findanddeal0211 ()操作结果:寻找可处理客户事件3、主函数设计void main() 输出主界面;选择操作:进入银行业务模拟系统退出程序;while(进入银行业务模拟窗口)openforday();进行初始化操作;输出格式控制; 银行业务模拟: while(有要处理的事件时) /有事件可处理 dequeue1(); /队列1出队列,并用en返回值 i

7、f(客户到达) customerarrived(); /处理客户到达事件 else customerdeparture(); /处理客户离开事件 计算出客户的平均逗留时间并输出返回主界面:选择操作:继续进行业务模拟退出程序;if(选择的是退出)退出程序;3 详细设计提示:根据概要设计,给出数据的存储表示(存储结构),完成相关算法的设计。存储结构:1、线性表结构体typedef struct int arrivetime; /到达时间 int occurtime; /事件发生时间 int ntype; /事件类型,0表示到达事件,1表示离开事件。同时用1表示存款,2表示取款。 int durat

8、ion; /办理业务时间 long int money;/交易金额event,elemtype1;2、队列结构体typedef struct int arrivetime; /到达时间 int duration; /办理业务时间 long int money; /交易金额wait,elemtype2;算法设计:1、进入队列void push0211(queue &q,int d)/ 插入元素d为q的新的队尾元素 service* temp = new service; temp-money = d; temp-next = null; if(null = q.head) /队列为空,初始化 q

9、. head = temp; q. rear = temp; /if else /队列不为空,插入元素d q. rear-next = temp; q. rear = q.rear-next; /else2、出队列void pop0211 (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; 3、返回队首元素service* front0211 (queue &q)

10、return q. head;4、返回队尾元素service* back0211 (queue &q) return q. rear;5、在对列中寻找可处理元素service* searchanddel0211 (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)

11、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; /对列二 /初始化三个

12、队列6、到达函数 随机产生顾客,进入队列一产生到达事件 进入事件队列void arrive0211 () push(fq,(rand()% (2*dealmoney) -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;7、存款函数vo

13、id putmoney0211 () 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); /删除第一队列

14、第一个业务 currenttimeofdeal = back(eq)-endtime; state =0;8、取款函数void getmoney0211 () 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); /加入事件队列 离

15、开 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; /else9、在对

16、列中寻找可处理元素void findanddeal0211 () 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 ; currenttim

17、eofdeal += randomtemp; +counter; /更新客户总数 totaltime += ( back(eq)-endtime - temped-begintime ); /更新逗留时间 delete temped; /删除节点 temped = null; state = 0;10、菜单函数void menu() system(cls); /清屏函数printf( n); printf( *n); printf(* * *n); printf(* 欢迎进入银行模拟系统 * 姓名:郑小波 *n); printf(* * 学号:410109030211 *n); printf(

18、* * 学院:信息工程学院 *n); printf(* * 专业:计算机专业 *n); printf(* 1.开始模拟 0.退出 * *n); printf(*n); printf(*n);11、主函数int main () int n=1; while(n!=0) menu(); scanf(%d,&n); if(n=1) srand(time(null); /初始化随机函数 printf(输入银行的初始存款:n); scanf(%d,&total); printf(输入银行的营业时间:n); scanf(%d,&closetime); printf(输入最大到达时间间隔:n); scanf

19、(%d,&arrivetime); printf(输入最大的处理时间:n); scanf(%d,&dealtime); thearrivetime +=rand()%arrivetime + 1; /首次到达时间 while(currenttime closetime) +currenttime; if( currenttimeofdeal money = 0) putmoney(); findanddeal(); /if else getmoney(); /if printf(客户序列t事件类型t时间tt处理金额n); while( null != eq.head) /清除事件队列 if(e

20、q.head-type=离开) printf(%dtt离开tt%dtt%dn,eq.head-num,eq.head-endtime,eq.head-money); if(eq.head-type=到达) printf(%dtt到达tt%dtt%dn,eq.head-num,eq.head-begintime,eq.head-money); pop(eq); printf(未处理的客户:n); while( null != fq.head) /下班后未处理的客户 totaltime += ( closetime - fq.head-begintime ); /更新结束时第一队列中未处理的客户

21、printf (%dnfq.head-num ) ; +counter; pop(fq); /while printf(客户逗留平均时间为: ); cout 客户逗留平均时间为: totaltime/counter endl; printf(银行当前余额:); printf(%dn,total); system(pause); /if(n=1)if(n=0) printf(退出该程序n); else printf(输入错误,请重新输入n); /while(n!=0) return 0; /main()4 编码调试1、操作界面图4-1系统操作界面2、赋值操作测试用例: 输入:0,选择操作 输出:

22、退出该程序运行结果入图4-2所示。图4-2系统选择操作界面结果分析:输入0退出该系统,结果正确。3、赋值错误操作(0,1之外的数字)。测试用例: 输入:5,选择操作 输出:输入错误,请重新输入运行结果如图4-3所示。图4-3系统选择操作界面结果分析:输入5显示“输入错误,请重新输入”,结果正确。4、开始模拟并赋值操作1。测试用例:(最大到达时间间隔很长,而最大处理时间很短) 输入:1,开始模拟 10000,银行的初始存款 600,银行的营业时间 20,最大到达时间间隔 5,最大处理时间 输出:客户平均逗留时间为3,银行当前余额为15783。运行结果如图4-4,4-5,4-6,4-7,4-8所示

23、。图4-4模拟操作结果界面图4-5模拟操作结果界面图4-6模拟操作结果界面 图4-7模拟操作结果界面图4-8模拟操作结果界面结果分析:根据操作界面显示,完成了银行业务的模拟,共处理客户59人,客户平均逗留时间为3,银行当前余额为15783。5、开始模拟并赋值操作2。测试用例:(最大到达时间间隔很短,而最大处理时间很长) 输入:1,开始模拟 10000,银行的初始存款 600,银行的营业时间 8,最大到达时间间隔 30,最大处理时间 输出:客户平均逗留时间为7,银行当前余额为108765。运行结果如图4-9,4-10,4-11所示。图4-9模拟操作结果界面图4-10模拟操作结果界面由于数据太多所

24、以只截取最后一张图来显示结果。图4-11模拟操作结果界面结果分析:结果分析:根据操作界面显示,完成了银行业务的模拟,共处理客户127人,客户平均逗留时间为7,银行当前余额为108765。5 设计体会1. 本次课程设计各阶段所遇到的问题有:需求分析阶段:由于刚接触银行系统模拟问题,所以有一些地方不是很明确,在需求分析阶段的测试用类中卡了比较长的时间。在老师的指导下慢慢了解了需求分析的意义,并且完成了需求分析阶段的设计。为以后的课程设计打下基础。概要设计阶段:概要设计属于课程设计的前期准备时期,在这个阶段中,我查阅了大量的资料来理请自己的思路,明确了解决这个问题所需要的函数。并且画出了银行模拟系统

25、的蓝图,再老师的指点下完成了概要设计的阶段。详细设计阶段:根据需求分析和概要设计阶段的设计,再结合c语言的知识详细设计就顺理成章的出来了。在本次的课程设计中体会到了前期准备的重要性,和盲目的下手写程序相比,一步一步来从需求分析到概要设计再到详细的过程无疑简单许多,为以后编写更复杂的程序做铺垫。编码调试阶段:由于个人的原因,在编码调试阶段出现了很多错误,而其中大部分都是由于不细心导致的,而且由于是在程序编写好以后一起调试的所以这个阶段花了不少时间,通过编码调试的阶段让我认识到了细心在编写程序过程中的重要性,而良好的习惯更能为自己解决不少麻烦。比如在编写代码过程中“”和“”要一起打出来以免缺少“”而引起的错误。2. 测试结果分析。测试数据:银行的初始存款10000,银行的营业时间600,最大到达时间间隔20,最大处理时间5(最大到达时间间隔很长,而最大处理时间很短)。银行的初始存款10000,银行的营业时间600,最大到达时间间隔8,最大

温馨提示

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

评论

0/150

提交评论