《山东理工大学计算机学院课程设计任务书及成绩评定33535.docx》由会员分享,可在线阅读,更多相关《山东理工大学计算机学院课程设计任务书及成绩评定33535.docx(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、山东理工大大学计算机机学院课 程 设 计(数据结构构)班 级级姓 名名学 号号 指导教师师二一一年年一月二十日课程设计任任务书及成成绩评定课题名称 银银行业务模模拟系统、题目的的目的和要要求: 1、设设计目的巩固和加深深对数据结结构的理解解,通过上上机实验、调调试程序,加加深对课本本知识的理理解,最终终使学生能能够熟练应应用数据结结构的知识识写程序。(1)通过过本课程的的学习,能能熟练掌握握几种基本本数据结构构的基本操操作。(2)能针针对给定题题目,选择择相应的数数据结构,分分析并设计计算法,进进而给出问问题的正确确求解过程程并编写代代码实现。2、设计题题目要求: 1.客户户业务分为为两种:第
2、一种是是申请从银银行得到一一笔资金,即取款或或借款;第二种是是向银行投投入一笔资资金,即存款或或还款。2.银行行有两个服服务窗口,相应地有有两个队列列。客户到达达银行后先排第一一个队。处理每个个客户业务务时,如果属于于第一种,且申请额额超出银行行现存资金金总额而得得不到满足足时,则立即排入第第二个队等等候,直至满足足时才离开开银行, 否则业业务处理完完后立即离开银银行。3.每接接待完一个个第二种业务的的客户,则顺序检检查和处理理第二个队队列中的客客户,对能能满足的申申请者予以以满足,不能满足足者重新排排到第二个个队列的队队尾。4.假设检检查不需要要时间,在在此检查过过程中,一一旦银行资资金总额
3、少少于或等于于刚才第一一个队列中中最后一个个客户(第第二种业务务)被接待待之前的数额额,或者本次次已将第二二个队列检检查或处理理了一遍,就停止检检查(因为为此时已不不可能还有有满足者),转而继续接待第一个队列的客户。 5.任何何时刻都只只开一个窗窗口,营业业时间结束束时所有客客户立即离离开银行。通通过离散的的模拟方法法求出客户户在银行内内逗留的平平均时间。、设计进进度及完成成情况日 期内 容容1.10-1.11选取参考书书,查阅有有关文献资资料,完成成资料搜集集和系统分分析工作。1.121.14创建相关数数据结构,录入源程程序。1.171.19调试程序并并记录调试试中的问题题,初步完完成课程设
4、设计报告。1.201.21上交课程设设计报告打打印版并进进行课程设设计答辩,要要求每个同同学针对自自己的设计计回答指导导教师3-4个问题题。考核结束后后将课程设设计报告和和源程序的的电子版交交班长统一一刻光盘上上交。、主要参参考文献及及资料1 严严蔚敏 数数据结构(CC语言版)清清华大学出出版社 119992 严严蔚敏 数数据结构题题集(C语语言版)清清华大学出出版社 119993 谭谭浩强 C语言程程序设计 清华大大学出版社社4 与与所用编程程环境相配配套的C语语言或C+相关的的资料、成绩评评定:设计成绩: (教师师填写)指导老师: (签字字)二一一 年 一 月 二 十一 日目 录第一章 概
5、概述1第二章 系系统分析2第三章 概概要设计3第四章 详详细设计6第五章 运运行与测试试24第六章 总总结与心得得28参考文献:29 第一章 概概述课程设计是是实践性教教学中的一一个重要环环节,它以以某一课程程为基础,可可以涉及和和课程相关关的各个方方面,是一一门独立于于课程之外外的特殊课课程。课程程设计是让让同学们对对所学的课课程更全面面的学习和和应用,理理解和掌握握课程的相相关知识。数数据结构是是一门重要要的专业基基础课,是是计算机理理论和应用用的核心基基础课程。数据结构课课程设计,要要求学生在在数据结构构的逻辑特特性和物理理表示、数数据结构的的选择和应应用、算法法的设计及及其实现等等方面
6、,加加深对课程程基本内容容的理解。同同时,在程程序设计方方法以及上上机操作等等基本技能能和科学作作风方面受受到比较系系统和严格格的训练。在这次的课课程设计中中我选择的的题目是银银行业务模模拟系统。一般某个银行在某个地区营业前,都要进行市场调查与分析。通过调查,分析开多少个窗口使效率最高,而且不会产生较大的冗余。做此项调查通常要花费大量的人力物力,因此我借助计算机系统产生的随机数(时间间隔,每个客户办理的款数以及处理时间)对银行客户的离散事件进行预测,通过银行业务模拟系统计算出客户在银行逗留的总时间并计算出客户在银行的平均逗留时间。通过计算机模拟的方法减少实际调查的劳动量,资金及时间耗费,轻松的
7、得到高效的方法。第二章 系系统分析1银行业业务模拟程程序的主要要处理对象象是“事件”,事件的的主要信息息是事件的的类型和事事件的发生生时刻。算算法中处理理的事件有有两类:一一类是客户户到达事件件;另一类类是客户离离开事件。前前一类事件件发生的时时刻随客户户的到来自自然形成;后一类事事件发生的的时刻由客客户办理业业务所需时时间和等待待时间而定定。由于程程序驱动是是按事件发发生时刻的的先后顺序序进行的,所所以事件表表应是有序序表,其主主要操作是是插入和删删除事件,用用一个单链链表表示。2银行业业务模拟程程序中需要要的另一数数据结构是是表示客户户排队的队队列,由于于假设银行行有2个窗口,因因此程序中
8、中需要2个队列,队队列中有关关客户的信信息是客户户到达的时时间和客户办办理业务所所需要的时时间。队列列中的队头头客户即为为正在窗口口办理事务务的客户,他他办完业务务离开队列列的时刻影影响着即将将发生的客客户离开事事件的时刻刻,我们要要记录前一一客户的离离开时间。这就是说,对每个队头客户都存在一个将要驱动的客户离开事件。因此在任何时刻即将发生的事伯只有4种可能:1)新的客户到达;2)队列1队头客户办完业务离开;3)队列1取款客户由于得不到满足而转至队列2;4)队列2队头客户办完业务离开; 3. 为了使编编写的程序序具有通用用性,在编编程序时将将银行的营营业时间、初始存款客户办理业业务的最长长时间
9、及两两个客户到到达的最大大时间间隔隔都设置成成程序运行行时动态输输入,但是是客户办理理业务的时时间和两个个客户到达达的时间间间隔用随机机函数产生生的随机数数表示。这这样可以对对程序进行行理性的分析析,从而实现真真正离散事事件的模拟拟。4. 测试试数据。 客户的存存取款金额,不不大于5000元元客户办理理业务所要要时间,不不大于20分钟下个客户户到达的时时间间隔,不不大于30分钟当然,系统统的模拟性性能完全不不受这些规规定的限制制,用户完完全可以根根据实际需需要作简单单的修改和和调整而而且以上各各模拟量均均由随机函函数给出,符符合离散事事件要求第三章 概概要设计1、 银行业务模模拟程序流流程图结
10、束进入队列1排队服务并离开能否满足客户服务并离开进队2等待接待1个存款业务顺序检查队2能否满足取队头队头是否存在时间到?开始客户到达 否 否 是是 是是 否 2、 本本程序包含含三个模块块主程序序模块:void mainn() 输出主界面面;选择操作:进入银行行业务模拟拟系统退出出程序;Whilee(进入银行业务模模拟窗口)OpenFForDaay();进行初始始化操作;输出格式控控制; 银行行业务模拟拟: whiile(有有要处理的的事件时) /有事件件可处理 DeQQueuee1(); /队列1出出队列,并并用en返返回值 iff(客户到到达) CusttomerrArriived();
11、/处理客户户到达事件件 elsse CusttomerrDepaarturre(); /处理客客户离开事事件 计算算出客户的的平均逗留留时间并输输出返回主界面面:选择操作:继续进行行业务模拟拟退出程程序;If(选择择的是退出出)退出程序;客户到达达事件处理理模块实现客户户信息队列列的抽象数数据类型客户离开开事件处理理模块实现有序序事件链表表的抽象数数据类型3、 函函数调用关关系如图所示:主函数调用客户到达事件处理模块调用客户到达事件处理模块4、 设设定客户信信息队列的的抽象数据据类型定义义:ADT LinkkQueuue 数据对象: D=ai|aaiQueuueEleem,i=1,2,nn,
12、n0数据关系: R1=|aai-1,aiQueuueEleem ,ii=2,33, ,n 基本操作:InitQQueuee(&Q)操作结结果:构造造一个空队队列。destrroyquueue(&Q)初始条件件:队列已已存在。操作结果果:销毁队队列,此队队列不再存存在。EnQueeue(&Q,enn )初始条件件:队列已已存在。操作结果果:新元素素en入队队列。DeQueeue(&Q,&een)初始条件件:队列已已存在。操作结果果:队头元元素出队列列,并以een返回其其值。QueueeLenggth(QQ)初始条件:队列已存存在。操作结果:返回队列列中元素的的个数,即即队列长度度。 ADTT L
13、iinkQuueue 第四章 详详细设计 1源文件中中所包含的的头文件#incllude #incllude#incllude #incllude2.宏定义义#defiine MMONEYY 50000 /个个人业务值值,交易额额上限 #defiine OOK 1 #defiine EERRORR 0 #defiine OOVERFFLOW -2 typeddef iint sstatuus;3.定义的的结构体typeddef sstrucct intt arrrivettime; /到到达时间 intt OcccurTiime; /事件件发生时间间 intt NTyype; /事件件类型,0
14、0表示到达达事件,11表示离开开事件。同同时用1表表示存款,22表示取款款。 intt durratioon; /办理业业务时间 lonng innt mooney;/交易易金额Evennt,EllemTyype1;typeddef sstrucct /等待队队列元素 intt arrrivettime; /到到达时间 intt durratioon; /办理理业务时间间 lonng innt mooney; /交交易金额waitt,EleemTyppe2;typeddef sstrucct QNNode11ElemmTypee1 daata;struuct QQNodee1 *nnext;Q
15、Nodde1,*Queuue1;typeddef sstrucct QNNode22ElemmTypee2 daata;struuct QQNodee2 *nnext;QNodde2,*Queuue2;typeddef sstrucct Queeue1 fronnt; Queeue1 rearr;LinkkQueuue1;typeddef sstrucct Queeue2 fronnt; Queeue2 rearr;LinkkQueuue2;4.全局变变量long int totaal_mooney; /银银行现存资资金总额int ttotall_timme; /客客户逗留总总时间int uu
16、se_ttime;/每个个顾客所用用时间int mmoneyy;/每每个顾客办办理的款数数int ccloseetimee;/银银行营业时时间int IINTERRTIMEE; /下一用户户到达的时时间间隔int DDURATTION; /办办理业务所所需时间int nnumbeer; /办办理业务的的次序int ttime11; /系统现现在时间LinkQQueuee1 Q11;LinkQQueuee2 Q22;Eventt en; /事事件wait en1; /列表表2元素5.初始化化队列1statuus InnitQuueue11()Q1.ffrontt=Q1.rearr=(Quueue
17、11)mallloc(sizeeof(QQNodee1); iif(!QQ1.frront)exitt(OVEERFLOOW); QQ1.frront-nexxt=NUULL; rreturrn OKK;6.初始化化队列2statuus InnitQuueue22()Q2.ffrontt=Q2.rearr=(Quueue22)mallloc(sizeeof(QQNodee2); iif(!QQ2.frront)exitt(OVEERFLOOW); QQ2.frront-nexxt=NUULL; rreturrn OKK;7.销毁队队列1statuus deestrooyqueeue1()whi
18、lle(Q11.froont) Q1.rrear=Q1.ffrontt-neext; freee(Q1.fronnt); Q1.ffrontt=Q1.rearr; retuurn OOK;8.销毁队队列2statuus deestrooyqueeue2()whille(Q22.froont) Q2.rrear=Q2.ffrontt-neext; freee(Q2.fronnt); Q2.ffrontt=Q2.rearr; retuurn OOK;9.队列11入队列statuus EnnQueuue1() Queeue1 p,r,r1; p=(QQueuee1)maallocc(sizzeof(
19、QNodde1); if(!p)exxit(OOVERFFLOW); p-ddata.arriivetiime=een.arrriveetimee; p-ddata.OccuurTimme=enn.OcccurTiime; p-ddata.NTyppe=enn.NTyype; p-ddata.duraationn=en.duraationn; p-ddata.moneey=enn.monney; r=Q11.froont-nextt; whille(r)if(p-ddata.arriivetiime dataa.arrrivettime) if(r=QQ1.frront-nexxt) p-nn
20、ext=r; Q1.ffrontt-neext=pp; ellserr1-nnext=p; p-nnext=r; rr1=r;r=r-nexxt;if(!rr) if(QQ1.frront-nexxt=NNULL) Q11.froont-nextt=p; Q11.reaar=p; Q11.reaar-nnext=NULLL; elssep-nexxt=NUULL; Q11.reaar-nnext=p; Q11.reaar=p; returrn OKK;10.队列列2入队列列statuus EnnQueuue2()Queuue2 pp; p=(QQueuee2)maallocc(sizzeof(
21、QNodde2); if(!p)exxit(OOVERFFLOW); p-ddata.arriivetiime=een1.aarrivvetimme; p-ddata.duraationn=en11.durratioon; p-ddata.moneey=enn1.mooney; p-nnext=NULLL; Q2.rrear-nexxt=p; Q2.rrear=p; retuurn OOK;11.若队队列1不空空,则删除除Q1的队队头元素,并并用en返返回其值statuus DeeQueuue1() Quueue11 p; if(Q1.ffrontt=Q11.reaar) rreturrn E
22、RRROR; p=Q11.froont-nextt; en.aarrivvetimme=p-datta.arrriveetimee; en.OOccurrTimee=p-dataa.OcccurTiime; en.NNTypee=p-dataa.NTyype; en.ddurattion=p-ddata.duraationn; en.mmoneyy=p-dataa.monney; Q1.ffrontt-neext=pp-neext; if(QQ1.reear=p) QQ1.reear=QQ1.frront; /只有一一个人时 freee(p); retuurn OOK;12.若队队列2不空空,
23、则删除除Q2的队队头元素,并并用en11返回其值值statuus DeeQueuue2() Queeue2 p;if(Q22.froont=Q2.rrear)retuurn EERRORR; p=Q22.froont-nextt; en1.arriivetiime=pp-daata.aarrivvetimme; en1.duraationn=p-dataa.durratioon; en1.moneey=p-datta.mooney; Q2.ffrontt-neext=pp-neext; if(QQ2.reear=p) QQ2.reear=QQ2.frront; /只有一个个人时 freee(p
24、);returrn OKK;13.营业业时间结束束,全部客客户离开银银行void freee_syystemm() ddestrroyquueue11(); ddestrroyquueue22(); 14.产生生随机数statuus raand_aar(innt *iinterrtimee,lonng innt *mmoneyy, innt *ddurattion,int *NTyype)*inttertiime=rrand()%INNTERTTIME+1; /下个客户户到达的时时间间隔,不不大于INNTERTTIME *moneey=raand()%MONNEY+11; /每个个顾客办理理的
25、款数,不不大于MOONEY *duraationn=rannd()%DURAATIONN+1; /客户办理理业务所要要时间,不不大于DUURATIION *NTyppe=raand()%2; /事事件类型分分为0和11两种 rreturrn OKK;15.初始始化操作void OpennForDDay() prinntf( 请输入入银行的初初始存款:); sscanff(%dd,&ttotall_monney); pprinttf( 请输入银银行的营业业时间(分分钟):); sscanff(%dd,&ccloseetimee); pprinttf( 请输入最最大到达时时间间隔(分分钟):);
26、sscanff(%dd,&IINTERRTIMEE); pprinttf( 请输入最最大的处理理时间(分分钟):); sscanff(%dd,&DDURATTION); ttotall_timme=0; /客客户逗留总总时间(初初始值) nnumbeer=0; /办理理业务的次次序(初始始值) IInitQQueuee1(); /初始化化队列1 IInitQQueuee2(); /初始化化队列2 een.arrriveetimee=0; /到达时间间 een.OcccurTTime=0; /事事件发生时时间 een.NTType=0; /事件类型型,暂时值值en.mmoneyy=0; /交易金
27、金额,暂时时值en.ddurattion=0; /办办理业务时时间,暂时时值EnQuueue11(); /事件进进队列16.查找找上一离开开事件的发发生时间int ffind_leavve() Queeue1 p; intt i=00; p=QQ1.frront-nexxt;whille(p!=NULLL) if(pp-daata.NNTypee!=0) i=p-datta.OcccurTTime; p=p-nexxt; retuurn ii;17.处理理客户到达达事件void CusttomerrArriived()int inteertimme;int i;timee1=enn.Occcu
28、rTiime;randd_ar(&inttertiime,&(en.moneey), &(enn.durratioon),&(en.NTyppe);/设置置一离开事事件插入事事件表en.NNTypee+; /0变1,11变2i=fiind_lleavee(); /查找找上一离开开事件的发发生时间if(ii=0) /第第一位顾客客 een.OcccurTTime=en.aarrivvetimme+enn.durratioon; ellse if(ii=enn.arrrivettime)/本事事件到达时时上一事件件还未离开开 enn.OcccurTiime=ii+en.duraationn; /则
29、此事件件的离开时时间=上一一事件的离离开时间+本事件处处理时间 ellse /上上一事件离离开之后,本本事件才到到达 en.OOccurrTimee=en.arriivetiime+een.duuratiion;/则此事事件的离开开时间=本本事件到达达时间+本本事件处理理时间 EnnQueuue1(); /设置下一一用户到达达事件插入入队列1 enn.arrrivettime=en.aarrivvetimme+innterttime; /下下一客户到到达时间 enn.OcccurTiime=een.arrriveetimee; enn.NTyype=00; /暂暂时值 enn.monney=0
30、0; /暂暂时值 enn.durratioon=0; /暂时值值 EnnQueuue1();18.返回回队列2的的长度int ggetloong_qq2()int i=0; Queuue2 pp; p=Q22.froont-nextt; whille(p) ii+; pp=p-nextt; retuurn ii;19.顺序序检查队列列2是否有有满足条件件者statuus chheck_q2() int i,j,z=0; i=geetlonng_q22(); /用i返回回队列2长长度 for(j=1;j=ii;j+) DDeQueeue2(); /队列2出出队,用een1返回回其值 iif(en
31、n1.mooney=tottal_mmoneyy) /若若队列2出出队元素的的要交易的的金额clossetimme) prinntf(-ttt%ddttt%dttt%ddttt%dtt%dnn,z,use_timee,nummber,z,(een1.aarrivvetimme),een1.mmoneyy); ellse timme1=ttime11+en11.durratioon; /更更新系统当当前时间 use_timee=timme1-een1.aarrivvetimme; totaal_tiime+=use_timee; /更新新逗留时间间 totaal_mooney-=en11.mon
32、ney; /更新资金金总额 numbber+; /更新新实现交易易的客户数数 prinntf(%ldtt%dtt%dtt%dtt%dt-%ddn,totaal_mooney,use_timee,nummber,timee1,(een1.aarrivvetimme),(en1.moneey); elsee /若若队列2出出队元素的的要交易的的金额银银行现存金金额,不能能办理if(timee1cllosettime) prrintff(-ttt%dttt%ddttt%dttt%ddt%ddn,z,usse_tiime,nnumbeer,z,(en11.arrrivettime),en11.monn
33、ey); ellse EnQuueue22(); /继续插入入队列2的的队尾,继继续等待 retuurn OOK;20.队列列1离开事事件减duuratiion(办办理业务时时间) int ccut_ddurattion(int e) /e即形形参办理业业务的时间间 Queuue1 pp,q,rr; ElemmTypee1 enn; p=Q11.froont-nextt; r=Q11.froont; if(pp) iif(p-datta.NTType!=0) q=p-nexxt; r-nnext=q; /删除结结点 en.aarrivvetimme=p-datta.arrriveetimee;
34、 /到达达时间 en.OOccurrTimee=p-dataa.OcccurTiime-ee; /事件件发生时间间 en.NNTypee=p-dataa.NTyype; /事事件类型 en.ddurattion=p-ddata.duraationn; /办理理业务时间间 en.mmoneyy=p-dataa.monney; /数数额 freee(p); EnQuueue11(); retuurn OOK;21.处理理客户离开开事件void CusttomerrDepaarturre() iint ii; ii=en.NTyppe; /业业务类型,11表示存款款,2表示示取款 ttime11=e
35、n.OccuurTimme-enn.durratioon; iif(i=OK) /是是否是办理理存款 if(een.OcccurTTimeclossetimme) /营业结结束,全部部客户离开开银行 frree_ssysteem(); ellse /营业业时间没有有结束,继继续办理 usee_timme=enn.OcccurTiime-een.arrriveetimee; ttotall_timme+=uuse_ttime; /更新新逗留的总总时间 ttotall_monney=ttotall_monney+een.mooney;/更新新资金总额额 nnumbeer+; /更更新服务的的客户数
36、 ttime11=en.OccuurTimme; /更新新系统当前前时间 pprinttf(%ldttt%ddttt%dttt%ddttt%dtt%dnn,tootal_moneey,usse_tiime,nnumbeer,enn.OcccurTiime,een.arrriveetimee,en.moneey); ccheckk_q2(); /检查队队列2是否否有满足条条件者 eelse /办理理取款 iff(en.moneeytootal_moneey) /办理取取款,当申申请金额不不能满足时时,离开队队列1进入入队列2等等待 cuut_duuratiion(een.duuratiion);
37、/从队队列1中删删除该结点点 en1.arriivetiime=een.arrriveetimee; en1.duraationn=en.duraationn; en1.moneey=enn.monney; EnQuueue22(); /进入队列列2继续等等待 eelse /办理理取款,当当能满足所所申请金额额时进行队队列1 iff(en.OccuurTimmecllosettime)/营业业结束,全全部客户离离开银行 frree_ssysteem(); elsee uuse_ttime=en.OOccurrTimee-en.arriivetiime;/顾客所所用时间=事件发生生时间-事事件到达时时间 ttotall_timme+=uuse_ttime;/更新新逗留的总总时间 totaal_mooney-=en.m