【数据结构】银行业务模拟报告_第1页
【数据结构】银行业务模拟报告_第2页
【数据结构】银行业务模拟报告_第3页
【数据结构】银行业务模拟报告_第4页
【数据结构】银行业务模拟报告_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

【数据结构】银行业务模拟报告*;东北大学信息科学与工程学院数据结构课程设计报告题目银行业务模拟课题组长侯永跃课题组成员林浩成李博然韩硕专业名称计算机科学与技术班级计1307指导教师杨雷 2015年1月【数据结构】银行业务模拟报告全文共62页,当前为第1页。

【数据结构】银行业务模拟报告全文共62页,当前为第1页。【数据结构】银行业务模拟报告全文共62页,当前为第2页。课程设计任务书【数据结构】银行业务模拟报告全文共62页,当前为第2页。题目:银行业务模拟问题描述:银行有N个窗口对外接待客户。从早晨银行营业开始到晚间营业终止不断有客户办理业务。银行门口设有取号机,分为一般业务和特殊业务,设每个一般业务不超过5分钟,每个特殊业务不超过15分钟。客户在等候区内等候叫号。设计要求:设计银行客户业务的模拟程序。(1)采用有序链表、队列等数据结构。(2)分类统计一天内客户在银行逗留的平均时间和人数。(3)若特殊业务窗口空闲,可办理一般业务。(4)可以随机或人工输入客户到达银行的时间。(5)其它完善性功能。指导教师签字:年月日目录1课题概述 41.1课题任务 41.2课题原理 41.3相关知识 52需求分析 52.1课题调研 52.2用户需求分析 63方案设计 63.1总体功能设计 63.2数据结构设计 93.3函数原型设计 103.4主算法设计 113.5用户界面设计 14【数据结构】银行业务模拟报告全文共62页,当前为第3页。4方案实现 15【数据结构】银行业务模拟报告全文共62页,当前为第3页。4.1开发环境与工具 154.2程序设计关键技术 164.3个人设计实现(按组员分工)4.3.1侯永跃设计实现 164.3.2李博然设计实现 234.3.3林浩成设计实现 284.3.4韩硕设计实现 325测试与调试 355.1个人测试 355.1.1侯永跃测试 355.2组装与系统测试 385.3系统运行 416课题总结 436.1课题评价 436.2团队协作 446.3下一步工作 446.4个人设计小结(按组员分工) 446.4.1侯永跃设计小结 44【数据结构】银行业务模拟报告全文共62页,当前为第4页。6.4.2李博然设计小结 45【数据结构】银行业务模拟报告全文共62页,当前为第4页。6.4.3林浩成设计小结 456.4.4韩硕设计小结 467附录A课题任务分工 46A-1课题程序设计分工 46A-2课题报告分工 49附录B课题设计文档(光盘) 49B-1课程设计报告(电子版) 49B-2源程序代码(*.H,*.CPP) 49B-3工程与可执行文件) 49B-4屏幕演示录像文件(可选) 49附录C用户操作手册(可选) 49C.1运行环境说明 49C.2操作说明 49【数据结构】银行业务模拟报告全文共62页,当前为第5页。【数据结构】银行业务模拟报告全文共62页,当前为第5页。1课题概述1.1课题任务银行业务模拟【问题描述】银行有N个窗口对外接待客户。从早晨银行营业开始到晚间营业终止不断有客户办理业务。银行门口设有取号机,分为一般业务和特殊业务,设每个一般业务不超过5分钟,每个特殊业务不超过15分钟。客户在等候区内等候叫号。【设计要求】设计银行客户业务的模拟程序。(1)采用有序链表、队列等数据结构。(2)分类统计一天内客户在银行逗留的平均时间和人数。(3)若特殊业务窗口空闲,可办理一般业务。(4)可以随机或人工输入客户到达银行的时间。(5)其它完善性功能。通过本实验理解并掌握数据结构及其应用,巩固程序设计基础知识,初步学习软件工程、可视化程序设计的知识,提高编程水平和分析问题、解决问题的能力,增强学习能力和合作能力。1.2课题原理【数据结构】银行业务模拟报告全文共62页,当前为第6页。 本程序主要采用链表、队列等数据结构,链表定义为有序链表,实现了事件之间的联系。本设计关键在于对事件的处理,将银行业务模拟分为客户到达银行办理业务事件、办理业务结束离开银行事件。客户到达银行、离开银行等事件的信息都存入链表中,对链表可以进行插入、写入文件等操作。【数据结构】银行业务模拟报告全文共62页,当前为第6页。 另外我们将银行办理业务的不同窗口定义为不同的数组,客户在各自窗口前排队成为队列,银行有N个窗口,各自为不同的数组,在各个窗口前,每个队列的队头是正在窗口办理业务的客户,队头出队的时刻就是客户离开银行的时刻,也即客户离开事件的发生,此时可以利用对有序表的处理引入下一名客户到达事件。 程序主要通过模拟银行一天从早到晚客户到达、客户入队、客户离开的事件来完成程序的功能。通过合理的随机模拟,模拟出一天内银行的总客户数、客户累计逗留时间、客户平均逗留的时间、一般业务与特殊业务的办理次数等。这些信息写入到文件中,便于查找和统计。1.3相关知识对有序链表的构造和处理。对离散事件的模拟,理解动态规划的有关概念。对队列中元素的插入,删除等操作。对文件的操作。一定的MFC有关知识。2需求分析 2.1课题调研调研结果:在实际生活中,人们经常去银行办理业务,如何能够正确有效地安排客户的顺序成为关键。所以程序应注重高效性。【数据结构】银行业务模拟报告全文共62页,当前为第7页。另外,银行大多有办理不同种业务的窗口。银行开设的窗口有一般业务窗口和特殊业务窗口,特殊业务窗口往往较少。【数据结构】银行业务模拟报告全文共62页,当前为第7页。客户办理业务时的情况分为两种,一种是客户到来时恰好有合适的办理业务的窗口,另一种是客户不全在办理业务(即等待)。银行办理一般业务与特殊业务的客户数量肯定会相差很多,一般业务往往比特殊业务的客户数多。因此,如果特殊窗口无人办理业务,可以让办理一般业务的客户去特殊窗口办理。另外,客户叫号后几乎没有在等待过程中离开的,因此程序中忽略客户叫号后离开不办理业务的情形。2.2用户需求分析 用户分为两类:银行客户和银行职员。程序的用户操作端分为客户端和银行端,客户端由银行客户操作,银行客户通过客户端叫号,等待或者去窗口办理业务(程序中的客户到达时间由此决定,这些操作通过随机模拟实现);银行端由银行窗口的职员操作,主要办理业务、设置业务窗口数(程序中的客户离开时间由此决定,这些操作也通过模拟实现)。银行端还可以对当日的业务人数以及办理的时间等信息进行统计和分析,将其与之前模拟的信息比较,得出有关的业务情况。【数据结构】银行业务模拟报告全文共62页,当前为第8页。3方案设计【数据结构】银行业务模拟报告全文共62页,当前为第8页。3.1总体功能设计经过讨论,我们决定程序总体可以实现以下功能:能够模拟银行一天内的客户办理业务的事件。统计银行业务的客户数、办理业务的时间等信息。可以查询以往模拟的信息。可以实现数据的输入来更改其中的信息。当前窗口的人员分布情况动态显示。界面要求达到有合理的提示,根据提示可以完成相关功能要求。具体分析:程序主要通过模拟银行一天从早到晚客户到达事件、离开的时刻、逗留时间,可通过保存、查询、打印以上信息,来完成程序的功能。通过合理的随机模拟,模拟出一天内银行的总客户数、客户累计逗留时间、客户平均逗留的时间、一般业务与特殊业务的办理次数,一般业务与特殊业务的办理人数和逗留时间。这些信息写入到文件中,用户可以再次查询、打印、统计。并且,在应用MFC之后,这些有关数据可以在界面中得以直观显示。以下是可视化UML图:【数据结构】银行业务模拟报告全文共62页,当前为第9页。【数据结构】银行业务模拟报告全文共62页,当前为第9页。基于MFC可视化的UML类图以下是银行业务模拟的相应流程图:【数据结构】银行业务模拟报告全文共62页,当前为第10页。【数据结构】银行业务模拟报告全文共62页,当前为第10页。【数据结构】银行业务模拟报告全文共62页,当前为第11页。【数据结构】银行业务模拟报告全文共62页,当前为第11页。3.2数据结构设计程序的数据结构包括链表、队列和有关的数组等。事件链表记录客户的事件,窗口队列记录客户排队的信息,记录信息链表将所有的客户信息按照不同的类别保存到链表中。银行窗口q[5]是一个数组,保存窗口队列头结点。//事件结构体typedefstructEvent_Node{intOccurTime;//事件发生时刻intNType;//事件类型,-1表示到达,0-4代表在那个窗口离开inttype;//0-4Event_Node*next;//指向下一个}Event_Node,*Event;//事件类型,有序链表LinkList的数据元素类型//队列结构体typedefstructQueue_Node{intArrivalTime;//到达时刻intDuration;//办业务持续时间inttype;//客户的真实业务类型0-4Queue_Node*next;//指向下一个结点}Queue_Node,*Queue,LinkList_Node,*LinkList;//队列的数据元素类型【数据结构】银行业务模拟报告全文共62页,当前为第12页。//客户信息记录链表【数据结构】银行业务模拟报告全文共62页,当前为第12页。typedefstructEndLinkList_node{intOrderNum;//编号intArrivalHour;//到达小时数intArrivalMin;//到达分钟数intDepartureHour;//离开小时数intDepartureMin;//离开分钟数EndLinkList_node*next;}EndLinkList_Node,*EndLinkList;3.3函数原型设计事件结点类成员函数原型:OrderInsertEv(Event_Node*e);//按序插入事件表中EmptyEve();//判断事件表是否为空DeletefirEve();//删除事件表的第一个结点队列结点类成员函数原型:OutQueue();//出队列函数EnQueue(Queue_Node*p);//入队列函数EmptyQue();//判断队列是否为空Queue_Node*Getfirnode();//获取队列第一个结点QueueLength();//队列的长度【数据结构】银行业务模拟报告全文共62页,当前为第13页。信息记录结点类成员函数原型:【数据结构】银行业务模拟报告全文共62页,当前为第13页。Record_Linklist();事件类成员函数原型:Simulate();CustomArrived();//客户到达事件函数CustomerDeparture();//处理客户离开事件,en.NType>0Bank_Simulation();//银行业务模拟函数OpenForDay();//准备函数InitAll();//初始化函数Random(int&durtime,int&intertime,int&type);//随机函数Minimum();//查找最小队列RecordLinkList(inti,intj);//记录客户的信息链表,分别记录不同窗口的信息ChangeForm();//客户信息转化函数Output();//输出模拟完的结果Print_former();//输出以前信息菜单函数Print_current();//输出当前信息菜单函数StoreFile();//永久保存到文件中StoreTotempfile();//保存到临时文件中3.4主算法设计【数据结构】银行业务模拟报告全文共62页,当前为第14页。//初始化函数【数据结构】银行业务模拟报告全文共62页,当前为第14页。voidInitAll(){TotalTime=0;//总时间CustomerNum=0;//总人数spetotaltime=0;//办理特殊业务的总逗留时间comtotaltime=0;//办理一般业务的总逗留时间EV=newEvent_Node;//事件表创建头结点//初始化三种链表以及队列InitQueue(q[i]);//i=0,1,2,3,4a[j]=newLinkList_Node;b[k]=newEndLinkList_Node;//k=0,1,2,3,4,5}//客户到达事件函数voidCustomArrived(){intdurtime;//逗留时间intintertime;//下一个客户到达的时间inttype;//窗口类型intt;//记录下一个客户到达的时刻【数据结构】银行业务模拟报告全文共62页,当前为第15页。Evente;//事件变量【数据结构】银行业务模拟报告全文共62页,当前为第15页。Eventtemp=newEvent_Node;Queues=newQueue_Node;//队列结点变量inti;//最小的队列的下标Random(durtime,intertime,type);//产生随机值:逗留时间,下一个客户到达时间,以及下一个客户的业务类型t=en->OccurTime+intertime;//下一个客户到达的具体时间if(t<CloseTime){++CustomerNum;//号数增加TotalTime+=durtime;e=CreateEvNode(t,-1,type);//构造下一个客户的事件OrderInsert(e);//插入到事件链表中s->ArrivalTime=en->OccurTime;//当前事件的到达时间s->Duration=durtime;//当前事件的逗留时间s->next=NULL;s->type=en->type;if(en->type==0){i=0;spe++;【数据结构】银行业务模拟报告全文共62页,当前为第16页。spetotaltime+=durtime;【数据结构】银行业务模拟报告全文共62页,当前为第16页。EnQueue(q[i],s);}//如果当前结点的业务类型是特殊业务,则入到第0个队列里else{i=Minimum();//否则查找最小的队列com++;comtotaltime+=durtime;EnQueue(q[i],s);//将其插入到队列中}if(QueueLength(q[i])==1){temp->NType=i;temp->OccurTime=s->ArrivalTime+s->Duration;temp->type=en->type;temp->next=NULL;OrderInsert(temp);}}}//处理客户离开事件,en.NType>-1【数据结构】银行业务模拟报告全文共62页,当前为第17页。voidCustomerDeparture()【数据结构】银行业务模拟报告全文共62页,当前为第17页。{ inti=en->NType,j=en->type; Queuep=newQueue_Node; Evente=newEvent_Node; RecordLinkList(a[j],q[i]);//记录客户事件outQueue(q[i]); if(!(QueueEmpty(q[i])))//判断事件表是否为空 { p=GetHead(q[i]); e->OccurTime=p->ArrivalTime+p->Duration; e->NType=i; e->type=p->type; OrderInsert(e); }}//银行业务模拟函数voidBank_Simulation(){ OpenForDay(); inti=6; while(!EmptyEventList())【数据结构】银行业务模拟报告全文共62页,当前为第18页。 {【数据结构】银行业务模拟报告全文共62页,当前为第18页。 en=EV->next;DelFirstNode(); if(en->NType==-1)//判断事件类型 CustomArrived(); else CustomerDeparture(); } ChangeForm();StoreTofile();//将模拟的信息保存到文件中 Output();}3.5用户界面设计概要设计原理:【数据结构】银行业务模拟报告全文共62页,当前为第19页。本实验基于MFC的界面的设计,是通过创建对话框类来实现,在窗口的控件中定义一些事件对象,来调用其成员函数模拟,信息查询需要创建一个子窗口,在此窗口中,需要使用MFC中的文件类来打开文件,然后将相应的模拟信息输出。最后回到主窗口,退出或者模拟。此件需要用到按钮控件,编辑框控件,还有显示框控件等控件。【数据结构】银行业务模拟报告全文共62页,当前为第19页。4方案实现4.1开发环境与工具开发环境:windows7开发工具:VC++6.04.2程序设计关键技术根据我们的理解,本实验主要有以下要点:(一)如何对客户发生的事件处理。我们采用了将这些事件记录在有序的链表当中,将客户的到达,离开这些事件定义为结点,然后插入事件表中,构建事件表,然后对每一个事件进行处理,要么到达,要么入队列,要么离开。通过这种方式,我们不需要在产生客户事件的时候去不停的判断窗口的状态。这是一个动态的过程。【数据结构】银行业务模拟报告全文共62页,当前为第20页。(二)如何产生随机的事件,比如随机时间,随机逗留时间,随机窗口类型。我们在随机函数中设置了一个sleep()函数,用来暂停一段时间,让函数产生的随机数更准确,不重复。我们也设置了每两个客户之间的时间间隔。这些数据设置对产生的随机数有很大的影响。比如,如果我们将暂停时间设置得非常小,那么产生的随机数重复的概率就会大大的增加,以此我们不停的模拟,然后设置,还有是两个客户之间的时间间隔也会影响窗口的客户数量,我们模拟然后设置后发现将此间隔时间设置为10-15分钟之间时,客户在每个窗口的数量会比较均匀。【数据结构】银行业务模拟报告全文共62页,当前为第20页。4.3个人设计实现(按组员分工)4.3.3侯永跃程序设计实现main(){menu();return0;}//输出当前信息函数voidPrint_current(){inti;system("cls");system("color8a");cout<<"\t\t\t\t输出本次模拟的客户信息\n\n\n"<<endl;cout<<"0.输出本次模拟的特殊窗口的客户信息"<<endl;cout<<"1.输出本次模拟的1号一般窗口的客户信息"<<endl;cout<<"2.输出本次模拟的2号一般窗口的客户信息"<<endl;cout<<"3.输出本次模拟的3号一般窗口的客户信息"<<endl;cout<<"4.输出本次模拟的4号一般窗口的客户信息"<<endl;【数据结构】银行业务模拟报告全文共62页,当前为第21页。cout<<"5.输出本次模拟的一整天的客户信息(客户编号,客户到达时间,客户离开时间)\n\n\n"<<endl;【数据结构】银行业务模拟报告全文共62页,当前为第21页。cin>>i;while(1){if(i>=0&&i<=5){switch(i){case0:Print_file(0);break;case1:Print_file(1);break;case2:Print_file(2);break;case3:Print_file(3);break;case4:Print_file(4);break;case5:Print_file(5);break;}break;}else{cout<<"你的输入有问题,请重新输入!"<<endl;cin>>i;}【数据结构】银行业务模拟报告全文共62页,当前为第22页。}【数据结构】银行业务模拟报告全文共62页,当前为第22页。}//输出信息菜单voidPrint_fun(){inti;//选择system("cls");system("color9a");cout<<"\t\t\t\t模拟的信息输出\n\n\n\n";cout<<"\t\t\t1.以前模拟客户信息输出\t2.当前模拟客户信息输出\n\n\n";cin>>i;while(1){if(i==1){//Print_former();break;}elseif(i==2){Print_current();【数据结构】银行业务模拟报告全文共62页,当前为第23页。break;【数据结构】银行业务模拟报告全文共62页,当前为第23页。}else{cout<<"\t\t\t你的选择有误,请重新输入!"<<endl;cin>>i;}}}//打印文件信息voidPrint_file(intnum)//打印文件信息,num代表文件的编号{FILE*fp;charch;switch(num){case0:fp=fopen("0本次模拟特殊窗口客户信息文件.txt","r");break;case1:fp=fopen("1本次模拟1号一般窗口客户信息文件.txt","r");break;case2:fp=fopen("2本次模拟2号一般窗口客户信息文件.txt","r");break;【数据结构】银行业务模拟报告全文共62页,当前为第24页。case3:fp=fopen("3本次模拟3号一般窗口客户信息文件.txt","r");break;【数据结构】银行业务模拟报告全文共62页,当前为第24页。case4:fp=fopen("4本次模拟4号一般窗口客户信息文件.txt","r");break;case5:fp=fopen("5本次模拟客户所有信息文件.txt","r");break;default:cout<<"\n\n\t\t\t你的的输入有问题,请重新输入!";fclose(fp);return;}if(fp==NULL){cout<<"\t\t\t\t文件内容为空!"<<endl;fclose(fp);return;}while(!feof(fp)){//cin.sync();fscanf(fp,"%c",&ch);putchar(ch);}fclose(fp);}【数据结构】银行业务模拟报告全文共62页,当前为第25页。//菜单显示【数据结构】银行业务模拟报告全文共62页,当前为第25页。voidmenu(){system("cls");system("color9a");inti;cout<<"\t\t\t***********银行模拟系统***********\n\n\n\n\n";cout<<"\t\t\t1.银行模拟"<<"\t\t2.打印信息"<<endl;cin>>i;switch(i){case1:Bank_Simulation();//模拟函数Sleep(3000);menu();break;case2:Print_fun();Sleep(3000);menu();break;default:【数据结构】银行业务模拟报告全文共62页,当前为第26页。cout<<"您的输入有误!请重新输入:"<<endl;【数据结构】银行业务模拟报告全文共62页,当前为第26页。Sleep(1000);menu();break;}}//输出模拟完的结果voidOutput(){system("cls");system("coloraa");cout<<"\t\t\t\t模拟的结果显示如下:\n\n\n";cout<<"*银行这一天7:00--19:00,客户逗留时间和是:"<<TotalTime<<"分钟"<<endl; cout<<"*这一天总的客户人数是:"<<CustomerNum<<endl; cout<<"*平均每个客户逗留的时间是:"<<(double)TotalTime/CustomerNum<<"分钟"<<endl; cout<<"*办理特殊业务的总人数是:"<<spe<<endl; cout<<"zongshijian:"<<spetotaltime<<endl; cout<<"*办理普通业务的总人数是:"<<com<<endl<<"zongshinjian:"<<comtotaltime<<endl<<endl; system("pause");【数据结构】银行业务模拟报告全文共62页,当前为第27页。}【数据结构】银行业务模拟报告全文共62页,当前为第27页。//初始化函数voidInitAll(){TotalTime=0;CustomerNum=0;spetotaltime=0;//办理特殊业务的总逗留时间comtotaltime=0;//办理一般业务的总逗留时间EV=newEvent_Node;EV->next=NULL;//初始化三种链表以及队列for(inti=0;i<5;i++){InitQueue(q[i]);}for(intj=0;j<6;j++){a[j]=newLinkList_Node;a[j]->next=NULL;}【数据结构】银行业务模拟报告全文共62页,当前为第28页。for(intk=0;k<6;k++)【数据结构】银行业务模拟报告全文共62页,当前为第28页。{b[k]=newEndLinkList_Node;b[k]->next=NULL;}}//创建事件结点EventCreateEvNode(intOccurTime,intNType,inttype)//创建结点{Evente;e=newEvent_Node;if(!e)return0;e->next=NULL;e->OccurTime=OccurTime;e->NType=NType;e->type=type;returne;}//初始化队列voidInitQueue(Queue&q){【数据结构】银行业务模拟报告全文共62页,当前为第29页。q=newQueue_Node;【数据结构】银行业务模拟报告全文共62页,当前为第29页。q->next=NULL;q->ArrivalTime=0;q->Duration=0;}4.3.2李博然程序设计实现//读取文件信息intreadFilec(har*filename){intx=0,y=0;charline[szLINE];intlines=0;FILE*f=fopen(filename,"r");while(!feof(f)){memset(line,0,szLINE);fgets(line,szLINE-1,f);sscanf(line,"%d|%d",&x,&y);//这里取到了x和y,用SetWindowText输出即可printf("%d#\t=%d\n",x,y);lines++;}//endwhilefclose(f);【数据结构】银行业务模拟报告全文共62页,当前为第30页。returnlines;【数据结构】银行业务模拟报告全文共62页,当前为第30页。}//endreadFile:voidCustomArrived();//客户到达事件函数voidRandom(int&durtime,int&intertime,int&type);//随机函数voidStoreTofile();//保存到文件中//客户到达事件函数voidCustomArrived(){intdurtime;//逗留时间intintertime;//下一个客户到达的时间inttype;//窗口类型intt;//记录下一个客户到达的时刻Evente;//事件变量Eventtemp=newEvent_Node;Queues=newQueue_Node;//队列结点变量inti;//最小的队列的下标Random(durtime,intertime,type);//产生随机值:逗留时间,下一个客户到达时间,以及下一个客户的业务类型t=en->OccurTime+intertime;//下一个客户到达的具体时间if(t<CloseTime)【数据结构】银行业务模拟报告全文共62页,当前为第31页。{【数据结构】银行业务模拟报告全文共62页,当前为第31页。++CustomerNum;//号数增加TotalTime+=durtime;e=CreateEvNode(t,-1,type);//构造下一个客户的事件OrderInsert(e);//插入到事件链表中s->ArrivalTime=en->OccurTime;//当前事件的到达时间s->Duration=durtime;//当前事件的逗留时间s->next=NULL;s->type=en->type;if(en->type==0){i=0;spe++;spetotaltime+=durtime;EnQueue(q[i],s);}//如果当前结点的业务类型是特殊业务,则入到第0个队列里else{i=Minimum();//否则查找最小的队列com++;comtotaltime+=durtime;【数据结构】银行业务模拟报告全文共62页,当前为第32页。//s->truetype=;【数据结构】银行业务模拟报告全文共62页,当前为第32页。EnQueue(q[i],s);//将其插入到队列中}if(QueueLength(q[i])==1){temp->NType=i;temp->OccurTime=s->ArrivalTime+s->Duration;temp->type=en->type;temp->next=NULL;OrderInsert(temp);}}}//随机函数voidRandom(int&durtime,int&intertime,int&type)//产生逗留时间,产生下一个客户时间间隔,产生业务类型{//限制逗留时间一般业务为5分钟,特殊业务15分钟。都不低于1分钟,下一个客户到达时间不低于1分钟,不超过15分钟。Sleep(100);inti;srand((unsigned)time(NULL));【数据结构】银行业务模拟报告全文共62页,当前为第33页。type=rand()%5;【数据结构】银行业务模拟报告全文共62页,当前为第33页。if(type==0){durtime=rand()%15+1;intertime=rand()%15+1;}else{durtime=rand()%5+1;intertime=rand()%15+1;}}//入事件链表函数voidOrderInsert(Evente){Eventp=EV;if(!p->next){p->next=e;return;}if(p->next->OccurTime<e->OccurTime)【数据结构】银行业务模拟报告全文共62页,当前为第34页。p=p->next;【数据结构】银行业务模拟报告全文共62页,当前为第34页。e->next=p->next;p->next=e;}///查找最小队列intMinimum(){inti=1,t=3;Queuetemp;intre[5];for(intw=1;w<5;++w)re[w]=0;if(q[0]->next==NULL)//特殊窗口无人return0;else{for(intj=1;j<5;++j){temp=q[j]->next;while(temp){temp=temp->next;【数据结构】银行业务模拟报告全文共62页,当前为第35页。re[j]++;【数据结构】银行业务模拟报告全文共62页,当前为第35页。}}}if(re[1]>re[2])i=2;if(re[3]>re[4])t=4;if(re[i]>re[t])returnt;elsereturni;}intQueueLength(Queueq){inti=0;Queuetemp=q;while(temp->next){i++;temp=temp->next;}【数据结构】银行业务模拟报告全文共62页,当前为第36页。returni;【数据结构】银行业务模拟报告全文共62页,当前为第36页。}4.3.3林浩成程序设计实现//开始准备模拟voidOpenForDay(){InitAll();Eventp=newEvent_Node;p->NType=-1;p->OccurTime=0;p->type=0;p->next=NULL;EV->next=p;spe=com=0;}//银行业务模拟函数voidBank_Simulation(){system("cls");【数据结构】银行业务模拟报告全文共62页,当前为第37页。system("color9b");【数据结构】银行业务模拟报告全文共62页,当前为第37页。 OpenForDay(); inti=6; while(!EmptyEventList()) { en=EV->next;DelFirstNode(); if(en->NType==-1) CustomArrived(); else CustomerDeparture(); } ChangeForm();StoreTofile();//将模拟的信息保存到文件中 Output();}//客户信息格式转化,保存在链表。voidCForm(inti){intj=0;LinkListp;EndLinkListq;【数据结构】银行业务模拟报告全文共62页,当前为第38页。EndLinkListm;【数据结构】银行业务模拟报告全文共62页,当前为第38页。p=a[i];q=b[i];while(p->next){j++;p=p->next;m=newEndLinkList_Node;m->OrderNum=j;m->ArrivalHour=p->ArrivalTime/60+7;m->ArrivalMin=p->ArrivalTime%60;m->DepartureHour=(p->ArrivalTime+p->Duration)/60+7;m->DepartureMin=(p->ArrivalTime+p->Duration)%60;m->next=NULL;q->next=m;q=q->next;}q->next=NULL;}voidChangeForm(){inti;【数据结构】银行业务模拟报告全文共62页,当前为第39页。for(i=0;i<6;i++)【数据结构】银行业务模拟报告全文共62页,当前为第39页。CForm(i);}//判断事件链表是否为空intEmptyEventList(){if(EV->next==NULL)return1;elsereturn0;}//入队列函数voidEnQueue(Queueq,Queuee){Queuep;p=q;while(p->next)p=p->next;p->next=e;}//出队列函数voidoutQueue(Queueq)【数据结构】银行业务模拟报告全文共62页,当前为第40页。{【数据结构】银行业务模拟报告全文共62页,当前为第40页。 Queuep;p=q->next; q->next=p->next; deletep;} //保存到文件中,num代表文件的编号voidStoreTofile(){FILE*fp[6];fp[0]=fopen("0本次模拟特殊窗口客户信息文件.txt","w");fp[1]=fopen("1本次模拟1号一般窗口客户信息文件.txt","w");fp[2]=fopen("2本次模拟2号一般窗口客户信息文件.txt","w");fp[3]=fopen("3本次模拟3号一般窗口客户信息文件.txt","w");fp[4]=fopen("4本次模拟4号一般窗口客户信息文件.txt","w");fp[5]=fopen("5本次模拟客户所有信息文件.txt","w");//写入第一个文件EndLinkListtemp;for(inti=0;i<6;++i){temp=b[i]->next;while(temp)【数据结构】银行业务模拟报告全文共62页,当前为第41页。{【数据结构】银行业务模拟报告全文共62页,当前为第41页。fprintf(fp[i],"%d\t到达时间:%d:%d\t离开时间:%d:%d\n",temp->OrderNum,temp->ArrivalHour,temp->ArrivalMin,temp->DepartureHour,temp->DepartureMin);temp=temp->next;}}for(intt=0;t<6;t++){fclose(fp[t]);//关闭文件}}//获取队列的头结点QueueGetHead(Queuep){Queueq=newQueue_Node;q=p->next;returnq;}//删除(当前)第一个结点voidDelFirstNode(){【数据结构】银行业务模拟报告全文共62页,当前为第42页。Eventp;【数据结构】银行业务模拟报告全文共62页,当前为第42页。p=EV->next;EV->next=p->next;}4.3.4韩硕程序设计实现//处理客户离开事件,en.NType>-1voidCustomerDeparture(){ inti,j; Queuep; Evente; p=newQueue_Node; e=newEvent_Node; i=en->NType; j=en->type; RecordLinkList(a[j],q[i]);outQueue(q[i]); if(!(QueueEmpty(q[i]))) { p=GetHead(q[i]); e->OccurTime=p->ArrivalTime+p->Duration;【数据结构】银行业务模拟报告全文共62页,当前为第43页。 e->NType=i;【数据结构】银行业务模拟报告全文共62页,当前为第43页。 e->type=p->type; OrderInsert(e); }}//记录客户的信息链表,分别记录不同窗口的信息voidRecordLinkList(LinkListp,Queueq){LinkListm=newLinkList_Node;LinkListm2=newLinkList_Node;LinkListtemp=a[5];LinkListtemp1=p;while(temp1->next)temp1=temp1->next;m2->ArrivalTime=m->ArrivalTime=q->next->ArrivalTime;m2->Duration=m->Duration=q->next->Duration;m2->next=m->next=NULL;m2->type=m->type=q->next->type;temp1->next=m;while(temp->next)temp=temp->next;【数据结构】银行业务模拟报告全文共62页,当前为第44页。temp->next=m2;【数据结构】银行业务模拟报告全文共62页,当前为第44页。}//出队列voidoutQueue(Queueq){ Queuep;p=q->next; q->next=p->next; deletep;}//判断队列是否为空intQueueEmpty(Queueq){ if(!(q->next)) return1; else return0;}【数据结构】银行业务模拟报告全文共62页,当前为第45页。【数据结构】银行业务模拟报告全文共62页,当前为第45页。5测试与调试5.1个人测试组长测试:主对话框显示基于DOS界面下的测试:模拟之前:在此处选择进行模拟或是输出信息图5.1.2.1模拟前截图2.选择银行模拟之后的运行结果:图5.1.2.1模拟结果截图【数据结构】银行业务模拟报告全文共62页,当前为第46页。运行结果:在银行模拟过程中,通过对以上函数的调用,将客户信息以如下格式保存在了链表里。【数据结构】银行业务模拟报告全文共62页,当前为第46页。模拟信息(部分)截图菜单界面(menu()函数)如图,银行业务模拟结果,是输出模拟结果函数Output()的直接运行结果。【数据结构】银行业务模拟报告全文共62页,当前为第47页。事件创建函数CreateEvNode(intOccurTime,intNtype,inttype)、初始化队列函数InitQueue(Queue&q)、初始化函数InitAll()、银行开业(准备)函数OpenForDay()都是程序总体的初始化操作。【数据结构】银行业务模拟报告全文共62页,当前为第47页。删除第一个结点函数DelFirstNode()使用在银行模拟、发生客户到达赫尔离开事件之前,用于删除全局变量事件EV的第一个结点。若不删除,则无法显示模拟结果。如果判断空队列的函数:QueueEmpty(Queueq)、获取队列头结点函数:GetHead(Queuep)、获取队列长度函数:QueueLength(Queueq)这三个函数无法运行或运行有误,则模拟过程中会因客户队列有问题而无法得出模拟结果。银行业务模拟结果 如下图所示为输出本次模拟的客户信息菜单运行结果,是输出菜单函数Print_current()的运行结果。【数据结构】银行业务模拟报告全文共62页,当前为第48页。查找最小队列函数Minimum()如果运行有误或无法运行,则无法使客户安排到窗口最小队列,最终导致客户整天集中在第一个窗口办理业务。则图中显示功能2至4选项对应的窗口客户信息为空。【数据结构】银行业务模拟报告全文共62页,当前为第48页。输出本次模拟的客户信息菜单(Print_current()函数) 如下图所示,是在图5.1.3.3的基础上选择了“3”的结果,是函数Print_current()和Print_file(intnum)的运行结果。该窗口的客户信息5.2组装与系统测试将所有的函数,写好以后,我们先是在VC++6.0下运行测试。然后将所有的函数作为结点类的成员函数,或者事件类的成员函数。在MFC可视化测试运行。【数据结构】银行业务模拟报告全文共62页,当前为第49页。系统测试包括两部分,一部分是DOS界面的银行模拟系统的测试记录,另一部分是可视化界面的银行模拟系统的测试记录。【数据结构】银行业务模拟报告全文共62页,当前为第49页。【数据结构】银行业务模拟报告全文共62页,当前为第50页。表5.2.1银行业务模拟系统测试记录【数据结构】银行业务模拟报告全文共62页,当前为第50页。操作名称具体操作操作结果和输出运行程序点击文件运行程序银行模拟系统显示主菜单。进行银行业务模拟输入数字“1”,按下回车。显示了当前银行业务模拟结果,其中包括银行客户逗留时间和、总客户数、客户平均逗留时间、办理特殊业务的总人数、特殊业务办理总时间、一般业务总人数、一般业务办理总时间等信息,并提示按任意键继续。进入打印信息按任意键继续后,在主菜单界面输入数字“2”,按下回车显示“模拟信息输出”界面,提醒进入当前模拟客户信息输出。进入输出客户信息的菜单按下回车。显示输出本次模拟的客户信息的主菜单,提醒用户根据选项进行操作。输出本次模拟特殊窗口的客户信息输入数字“0”,按下回车按列表显示特殊窗口的客户编号、到达时间、离开时间,并提示“按Enter继续”。输出本次模拟1号一般窗口的客户信息再次进入输出客户菜单,输入数字“1”,按下回车按列表显示1号一般窗口的客户编号、到达时间、离开时间,并提示“按Enter继续”。输出本次模拟2号一般窗口的客户信息再次进入输出客户菜单,输入数字“2”,按下回车按列表显示2号一般窗口的客户编号、到达时间、离开时间,并提示“按Enter继续”。输出本次模拟3号一般窗口的客户信息再次进入输出客户菜单,输入数字“3”,按回车按列表显示3号一般窗口的客户编号、到达时间、离开时间,并提示“按Enter继续”。输出本次模拟4号一般窗口的客户信息再次进入输出客户菜单,输入数字“4”,按回车按列表显示4号一般窗口的客户编号、到达时间、离开时间,并提示“按Enter继续”。【数据结构】银行业务模拟报告全文共62页,当前为第51页。输出本次模拟的整天的客户信息【数据结构】银行业务模拟报告全文共62页,当前为第51页。再次进入输出客户菜单,输入数字“5”,按下回车按列表显示银行一整天所有的客户编号、到达时间、离开时间,并提示“按Enter继续”。返回主菜单再次进入输出客户菜单,输入数字“6”,按回车程序显示主菜单输入非法值在各菜单下输入除选项数字以外的非法值。主菜单提示“您的输入有误!请重新输入!”,并可以重新输入。表5.2.2银行业务模拟系统(MFC可视化界面)测试记录操作名称具体操作操作结果与输出打开程序鼠标点击编译器运行按钮显示主对话框界面。界面上包含“计算”,“退出”两个按钮。银行业务模拟鼠标点击“计算”按钮过一段时间(具体视随机函数设置的sleep时间和客户间隔时间值为情况),每一个框里面显示本次模拟的基本信息。退出程序鼠标点击“退出”按钮退出程序测试结束5.3系统运行【数据结构】银行业务模拟报告全文共62页,当前为第52页。以下是windows界面下和MFC可视化界面下的运行,可以对照:【数据结构】银行业务模拟报告全文共62页,当前为第52页。界面主菜单截图界面随机模拟结果显示截图【数据结构】银行业务模拟报告全文共62页,当前为第53页。【数据结构】银行业务模拟报告全文共62页,当前为第53页。可视化界面人数模拟结果显示截图【数据结构】银行业务模拟报告全文共62页,当前为第54页。具体到达与离开模拟信息显示截图【数据结构】银行业务模拟报告全文共62页,当前为第54页。6课题总结6.1课题评价 该课题与实际联系紧密,通过对银行在一天内从开业到关门的一段时间中客户到达与客户离开的事件进行模拟,可以估算出每个银行的工作窗口的业务量进行估算,并且同时得到银行营业一天内,办理特殊业务与一般业务的人数情况进行分析,从而为银行的人员工作分配提供具有参考价值的数据。另外,本程序的基本思路是对离散事件的模拟,从对程序稍加修改,还可以对其他离散事件进行有效模拟,例如十字路口的车流量问题,电梯的上下过程中用户的数量等等,进而使本课题不仅仅局限在对银行的模拟。还有,本程序采用MFC可视化界面,加入对文件的操作使得程序应用起来方便灵活。6.2团队协作在本次实验的编写过程中,首先组长本人出现了理解性的错误,后来在组员的提示和老师的帮助下得以解决。程序需要学习可视化的知识,并且本程序需要两个非常重要的处理函数,一个是处理事件到达函数,一个是处理事件离开函数。这两个函数是本程序的核心,实际过程中在这两点上面出的问题也是最多的。所以在理解了要点之后,组长分配了相应的任务。两个核心的函数由两个队员编写,第三名成员负责对整个事件的模拟。最后我们讨论界面的问题,界面的设计,在困难的时候通过讨论解决了许多的问题。6.3下一步工作【数据结构】银行业务模拟报告全文共62页,当前为第55页。 整理并保存此次实验过程的问题记录,保存程序设计的源代码、工程文件等。【数据结构】银行业务模拟报告全文共62页,当前为第55页。继续加深MFC的有关知识。继续测试运行,不停的改变随机函数暂停的时间值,以及改变客户之间的时间间隔,然后统计信息,与以往的模拟记录进行比较,或者作出曲线图。通过数学知识,计算出最佳的暂停时间值和客户间隔值。进一步将程序优化。6.4个人设计心得(按组员分工)6.4.1侯永跃设计心得我觉得有两点值得我去注意:要尽快理解题意。要真正理解动态规划。在刚开始阅读A类题目时,没有很好地理解题意,总以为应该以时间作为入队列的条件,然而始终无从下手。我一直认为必须要计算该窗口当前需要等待的时间,用来处理窗口的队列的长度和出队,入队的事件,并以此选择最佳的窗口。后来在询问指导老师之后,我了解到对队列的处理应当以实际人数作为判断条件。解决了这个问题以后,开始编写程序。在编写随机函数的时候,发现产生的时间有很多的重复的地方。最后改变了暂停的时间值,运行以后发现,重复的变得少了。然后一步一步的测试,最后找到了一个相对比较合适的暂停时间值。6.4.2李博然设计心得【数据结构】银行业务模拟报告全文共62页,当前为第56页。本次课程设计我主要负责可视化的设计,以及编写客户到达事件。通过查资料,自学了一点MFC知识。学会了文件类cfile的一部分使用,学会了对话框的控件的设置,学会了自己在里面编写类,类数据成员,类成员函数,学会了子窗口创建以及和主窗口的连接,学会了一部分控件的使用,以及怎么在上面显示信息,学会了怎么将文件的内容显示在编辑框里,学会了MFC里面字符与数字的转换等等。【数据结构】银行业务模拟报告全文共62页,当前为第56页。最后,我终于将本程序的基本可视化界面实现了。虽然感觉确实很累,但是也感觉非常值得,因为我的自学为我打开了学习windows程序设计的大门。我已经了解了windows的一部分知识了,了解了它的基本运作,这是非常值得的,非常重要的。感谢这次课程设计,它让我看到了自己的不足,也让我学到了很多的新的知识。6.4.3林浩成设计心得 作为一名转专业的同学,我自身基础比较薄弱。首先说在专业知识方面的收获:通过本次编程,是我对c/c++等基础编程语言有了更加深刻的理解。对于在原来学习过程中存在的知识盲区、漏洞等进行了很好地弥补。在知识方面的收获太多了,不能一一列举,就以此为例,例如,在程序分工中,我负责对整个离散事件进行模拟,这对于我来说是很难的。因为需要用到客户到达和客户离开事件的情况,可是我总是不知道如何把它们联系起来,最后导致耗费了大量时间去调试,另外再本程序编写过程中,要对链表,队列不断进行操作,反复用到指针,在这个过程中就涉及到如何运用全局变量与局部变量才能使程序编写过程不易出错且运用方便,使我对这块知识有了更深的认识以及对指针在函数应用过程中得到充分的理解。【数据结构】银行业务模拟报告全文共62页,当前为第57页。还有,就是对团队合作有了更深的认识。团队合作不仅仅是对一个课题的分工执行那么简单,对于一个课题,每一部分内容都是环环相扣紧密联系的,不可能仅仅通过一个人就能完成,必须建立在其他团队成员的工作的基础之上。作为一个团队,就应该互帮互助,及时不是自己分内的事,作为一个团队,也应该在必要的时候伸出援助之手。还

温馨提示

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

评论

0/150

提交评论