课程设计.docx
- 文档编号:29422406
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:20
- 大小:213.44KB
课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
课程设计
兰州商学院陇桥学院
信息工程系课程设计报告
设计题目:
银行业务模拟与离散事件模拟
系别:
信息工程系
专业(方向):
网络工程
年级、班:
13级网络工程
学生姓名:
秦文龙
学生学号:
20130672122
指导教师:
刘纯芳
2014年12月30日
目录
一、系统开发的背景3
二、系统分析与设计3
(一)系统功能要求3
(二)系统模块结构设计4
三、系统的设计与实现5
(一)测试CloseForDay()函数5
(二)测试CustomerArrived()函数5
四、系统测试7
五、总结9
六、附件(代码、部分图表)10
银行业务模拟与离散事件模拟
一、系统开发的背景
1.通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表)等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解;
2.将所学数据结构方面的知识与一门具体的语言相结合(语言)来进行实现,感受数据结构的强大作用,加深理解。
二、系统分析与设计
(一)系统功能要求
程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
使用到带头结点链表和结点,此链表用于存放客户的进入或者离开的事件,存放数据包括进入的时间,处理的时间,离开的时间。
使用一个队列和节点,此队列用于模拟进入银行后等待办理业务的客户排队情况。
其存储的数据有时间到达的时间和处理事物所需的时间。
包括函数调用,主要的程序在Main.cpp中,从main()进入调用。
首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等;
其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等;
再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能;
最后,编写主函数对每个实现进行按需调用,实现操作。
(二)系统模块结构设计
通过对系统功能的分析,银行业务模拟和离散事件模拟功能如图所示。
图1程序流程图
三、系统的设计与实现
(一)测试CloseForDay()函数
voidCloseForDay()
{
printf("***************************************\n");
printf("*\n");
printf("*所有顾客业务办理总时间:
%d分钟\n",TotalTime);
printf("*业务办理顾客数:
%d\n",CustomerNum);
printf("*平均每人办理时间:
%f\n",(float)TotalTime/(float)CustomerNum);
printf("*\n");
printf("***************************************\n");
}
图2测试CloseForDay()函数
(二)测试CustomerArrived()函数
StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen)
{
test("顾客到达处理<<<<<<<<");
CustomerNum++;
//产生随机数
//srand(54);
intdurtime=rand()%30+1;
intintertime=rand()%5+1;
//插入到达事件表
QCuEventenTemp;
intt=en.OccurTime+intertime;
enTemp.OccurTime=t;
enTemp.NType=0;
enTemp.next=NULL;
if(t printf("时间%d\n",t); //插入最短队 QEptrQ; Q=(QEptr)malloc(sizeof(QCuElem)); Q->ArrivalTime=en.OccurTime; Q->Duration=durtime; Q->next=NULL; inti=MinCuQueue(q); EnCuQueue(q[i],Q); //插入离开事件 enTemp.OccurTime=en.OccurTime+durtime; enTemp.NType=i; enTemp.next=NULL; if(QLength(q[i])==1)OrderInser(ev,enTemp); returnOK; } 图3测试CustomerArrived函数 四、系统测试 图4控制函数 图5测试函数 图6测试函数 图7测试函数 图8测试结果 五、总结 实验结果分析 利用随机产生的种子进行事件的模拟,即到达时间和办理业务的时间都是随机产生。 如果事件尚未到达下班时间,则将其插入到空队列或者是人数(元素)最少的队列,通过检验,算出在不同的服务窗口数下的等待时间以及服务时间,基本上实现了银行事件的模拟。 实验心得体会 数据结构是一门理论性较强且抽象的课程,经过一周的数据结构课程设计,至今我仍感受颇深,从选题到定稿,从理论到实践,在短短的一周时间里,虽然时间比较紧,但我学到了很多以前不知道的东西,同时不仅复习和巩固了以前所学过的知识,而且看到了和学到了很多在书本上所没有学到过的知识,使我懂得了理论必须和实践永远的结合起来,才能有质的飞跃,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到过很多问题,但我一直坚持着,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,现在觉得一定要把以前所学过的知识重新温故。 虽然我的算法不够完好,还有许多问题,但我一定会调试成功的。 六、附件(代码、部分图表) /*** *ExperimentofDataStructurefile * *Copyright(c)2014-2015,htucairangdunzhu.Allrightsreserved. * *Purpose: *实现了模拟银行的程序设计,并且包含每一个客户离开时间及统计,以及 *窗口排队的可视化模拟.运行测试通过. * *[Public] *2014.12才让顿珠于陇桥三号楼215宿舍 ****/ #defineOK1 #defineTRUE1 #defineFALSE0 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 typedefintStatus; //-----------------银行排队模拟 //事件和事件表 typedefstructQCuEvent { intOccurTime; intNType; structQCuEvent*next; }QCuEvent,*EventList; //窗口前队列元素 typedefstructQCuElem { intArrivalTime; intDuration; structQCuElem*next; }QCuElem,*QEptr; //窗口指针 typedefstruct{ QEptrfront; QEptrrear; }QCustomerp,*QCupp; //主要操作函数 StatusOpenForDay(EventList&ev,QCuEventen,QCupp&q);//开门 StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen);//顾客到达 StatusCustomerDeparture(EventList&ev,QCupp&q,QCuEventen);//顾客离开 voidCloseForDay(); //基本操作函数 StatusOrderInser(EventList&ev,QCuEventen);//按时间顺序插入事件到事件表 intQLength(QCustomerpqn);//求窗口队列长度 intMinCuQueue(QCuppq);//求队最短的窗口 StatusDelFirstEvent(EventList&ev);//删除事件表中的第一个事件 StatusInitCuQueue(QCustomerp&qn);//初始化窗口队列 StatusEnCuQueue(QCustomerp&qn,QEptrQ);//进入队列 StatusDeCuQueue(QCustomerp&qn,QCuElem&Q);//删除队列中的元素 StatusGetQHead(QCustomerpqn,QCuElem&Q);//获得队列中的第一个元素 StatusDestoryQueue(QCustomerpqn);//销毁队列 voidPtint_QStatus(QCustomerpQCu[]);//打印队列长度 voidBank_SimulationFunc(); voidtest(charstr[]); #include"stdio.h" #include"stdlib.h" #include"time.h" inti=0,e=0,counter=0; intTotalTime=0,CustomerNum=0;//累计客户逗留时间,客户数 intCloseTime;//关门时间 intwindowsnum=0; //主函数 voidmain(){ EventListev;//事件表 QCuEventen; QCuppQCu=NULL; OpenForDay(ev,en,QCu); while(ev->next) { en.NType=ev->next->NType; en.OccurTime=ev->next->OccurTime; DelFirstEvent(ev); if(en.NType==0) CustomerArrived(ev,QCu,en); else CustomerDeparture(ev,QCu,en); Ptint_QStatus(QCu); } CloseForDay(); } //主要功能子函数 StatusOpenForDay(EventList&ev,QCuEventen,QCupp&q) { inttemp=0; printf("请输入随机数种子(或输入0使用随机种子): "); scanf("%d",&temp); if(temp==0)srand((unsigned)time(NULL)); elsesrand(temp); printf("请输入营业时间(单位: 分钟): "); scanf("%d",&temp); CloseTime=temp; TotalTime=0; CustomerNum=0; en.OccurTime=0; en.NType=0; en.next=NULL; ev=(EventList)malloc(sizeof(QCuEvent)); ev->next=NULL; OrderInser(ev,en); printf("请输入办理业务的窗口数(至少1个): "); scanf("%d",&windowsnum); q=(QCustomerp*)malloc((windowsnum+1)*sizeof(QCustomerp)); for(inti=1;i<=windowsnum;i++) { InitCuQueue(q[i]); } returnOK; } StatusCustomerArrived(EventList&ev,QCupp&q,QCuEventen) { test("顾客到达处理<<<<<<<<"); CustomerNum++; //产生随机数 //srand(54); intdurtime=rand()%30+1; intintertime=rand()%5+1; //插入到达事件表 QCuEventenTemp; intt=en.OccurTime+intertime; enTemp.OccurTime=t; enTemp.NType=0; enTemp.next=NULL; if(t printf("时间%d\n",t); //插入最短队 QEptrQ; Q=(QEptr)malloc(sizeof(QCuElem)); Q->ArrivalTime=en.OccurTime; Q->Duration=durtime; Q->next=NULL; inti=MinCuQueue(q); EnCuQueue(q[i],Q); //插入离开事件 enTemp.OccurTime=en.OccurTime+durtime; enTemp.NType=i; enTemp.next=NULL; if(QLength(q[i])==1)OrderInser(ev,enTemp); returnOK; } StatusCustomerDeparture(EventList&ev,QCupp&q,QCuEventen) { test(">>>>>>>>顾客离开处理"); inti=en.NType; printf("离开时间%d\n",en.OccurTime); if(en.OccurTime>CloseTime) { DestoryQueue(q[i]); } else{ QCuElemcustomer; DeCuQueue(q[i],customer); //客户逗留时间 TotalTime+=en.OccurTime-customer.ArrivalTime; printf("总时间为%d\n",TotalTime); if(q[i].front->next) { GetQHead(q[i],customer); QCuEventenTemp; enTemp.OccurTime=en.OccurTime+customer.Duration; enTemp.NType=i; OrderInser(ev,enTemp); } } returnOK; } voidCloseForDay() { printf("***************************************\n"); printf("*\n"); printf("*所有顾客业务办理总时间: %d分钟\n",TotalTime); printf("*业务办理顾客数: %d\n",CustomerNum); printf("*平均每人办理时间: %f\n",(float)TotalTime/(float)CustomerNum); printf("*\n"); printf("***************************************\n"); } //功能实现子函数 StatusOrderInser(EventList&ev,QCuEventen) { EventListentemp,qtemp; entemp=(EventList)malloc(sizeof(QCuEvent)); entemp->OccurTime=en.OccurTime; entemp->NType=en.NType; entemp->next=NULL; if(! ev->next) { ev->next=entemp; returnOK; } qtemp=ev; while(qtemp->next&&qtemp->next->OccurTime { qtemp=qtemp->next; } entemp->next=qtemp->next; qtemp->next=entemp; returnOK; } intQLength(QCustomerpqn) { QEptrqtemp; inti=0; qtemp=qn.front->next; while(qtemp) { qtemp=qtemp->next; i++; } returni; } intMinCuQueue(QCuppq) { inti,min; for(i=1,min=1;i<=windowsnum;i++) { min=QLength(q[min])<=QLength(q[i])? min: i; } returnmin; } StatusDelFirstEvent(EventList&ev) { EventListp; p=ev->next; ev->next=p->next; free(p); returnOK; } StatusInitCuQueue(QCustomerp&qn) { qn.front=(QEptr)malloc(sizeof(QCuElem)); qn.front->next=NULL; qn.rear=qn.front; returnOK; } StatusEnCuQueue(QCustomerp&qn,QEptrQ) { qn.rear->next=Q; qn.rear=Q; returnOK; } StatusDeCuQueue(QCustomerp&qn,QCuElem&Q) { QEptrqtemp; qtemp=qn.front->next; Q.ArrivalTime=qtemp->ArrivalTime; Q.Duration=qtemp->Duration; qn.front->next=qtemp->next; if(qn.rear==qtemp)qn.rear=qn.front; free(qtemp); returnOK; } StatusGetQHead(QCustomerpqn,QCuElem&Q) { Q.ArrivalTime=qn.front->next->ArrivalTime; Q.Duration=qn.front->next->Duration; returnOK; } StatusDestoryQueue(QCustomerpqn) { QEptrp; while(qn.front->next) { p=qn.front->next; qn.front->next=p->next; free(p); } qn.front->next=NULL; qn.rear=qn.front; returnOK; } voidPtint_QStatus(QCustomerpQCu[]) { intl; for(inti=1;i<=windowsnum;i++) { l=QLength(QCu[i]); printf("队列%d: 长%d: ",i,l); for(intn=1;n<=l;n++) { printf("@"); } printf("\n"); } } voidtest(charstr[]) { printf("--%s--\n",str); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计