综合性设计性实验报告
- 格式:doc
- 大小:60.50 KB
- 文档页数:10
计算机与信息技术学院综合性、设计性实验报告专业:计算机科学与技术年级/班级: 10级 2011—1:假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。
由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。
现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。
2.一个完整的系统应具有以下功能:1)初始化(OpenForDay),模拟银行开门时各数据结构的状态。
2)事件驱动(EventDrived), 对客户到达和离开事件做相应处理。
3)下班处理(CloseForDay), 模拟银行关门时的动作,统计客户平均逗留时间。
一、实验目的:1)通过实验掌握对离散事件模拟的认识;2)进一步理解队列的实现与应用;3)对链表的操作有更深层次的理解;该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,涉及到了离散事件的应用思想,还涉及到了排序的概念。
完成这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的利用,对离散事件也将有一个初步的认识。
二、实验仪器或设备:计算机。
三:实验步骤:1:整体设计。
包括初始化(OpenForDay),事件驱动(EvenDrived),下班处理(CloseForDay)初始化的代码主要完成的工作是建立一个银行工作系统的框架,把实际问题数字化,利用“事件”来描述系统程序,其中包括变量客户人数、累计时间、客户到达成为事件的一个部分,当然每个窗口看做是一个队列。
算法如下:void OpenForDay(){ // 初始化操作int i;InitList(ev); // 初始化事件链表为空en.OccurTime=0; // 设定第一个客户到达事件en.NType=Qu; // 到达OrderInsert(ev,en,cmp); // 插入事件表for(i=0;i<Qu;++i) // 置空队列InitQueue(q[i]);}接下来,客户进入,进行客户到达后的处理要做的操作有:客户人数加1—>记录到达的时刻—>加入事件列表—>查找队列最短的窗口—>客户插入—>办理业务—>离开—>记录办理业务需要的时间。
算法如下:void CustomerArrived(){ // 处理客户到达事件,en.NType=QuQElemType f;intdurtime,intertime,i;++CustomerNum;Random(durtime,intertime); // 生成随机数et.OccurTime=en.OccurTime+intertime; // 下一客户到达时刻et.NType=Qu; // 队列中只有一个客户到达事件if(et.OccurTime<CloseTime) // 银行尚未关门,插入事件表OrderInsert(ev,et,cmp);i=Minimum(q); // 求长度最短队列的序号,等长为最小的序号f.ArrivalTime=en.OccurTime;f.Duration=durtime;EnQueue(q[i],f);if(QueueLength(q[i])==1){et.OccurTime=en.OccurTime+durtime;et.NType=i;OrderInsert(ev,et,cmp); // 设定第i队列的一个离开事件并插入事件表}}void CustomerDeparture(){ // 处理客户离开事件,en.NTypeint i;i=en.NType; DeQueue(q[i],customer); // 删除第i队列的排头客户TotalTime+=en.OccurTime-customer.ArrivalTime; // 累计客户逗留时间if(!QueueEmpty(q[i])){ // 设定第i队列的一个离开事件并插入事件表GetHead(q[i],customer);et.OccurTime=en.OccurTime+customer.Duration;et.NType=i;OrderInsert(ev,et,cmp);}}2:详细代码,完善代码,添加相应的子函数://主要功能子函数int OpenForDay(EventList &ev, Event en, QCupp &q){int t = 0;int time;printf("请输入随机数种子:");scanf("%d",&t);srand(t);printf("请输入营业时间(单位:分钟):");scanf("%d",&time);CloseTime = time;TotalTime = 0;CustomerNum = 0;en.OccurTime = 0;en.NType = 0;en.next = NULL;ev = (EventList) malloc(sizeof(Event));ev->next = NULL;OrderInsert(ev, en);printf("请输入办理业务的窗口数(至少1个):");scanf("%d",&windows);q = (QCustomerp *) malloc((windows+1)*sizeof(QCustomerp));//多申请一个内存空间,0号窗口不用for (int i=1;i<=windows;i++){InitCuQueue(q[i]);}return OK;}int CustomerArrived(EventList &ev, QCupp &q, Event en){//printf("****顾客到达处理****");CustomerNum ++;// 产生随机数int durtime = rand()%30+1; //办理业务时间不大于30分int intertime = rand()%5+1; //两个相邻客户到达银行的时间间隔不大于5分// 插入到达事件表Event enNew;enNew.OccurTime=en.OccurTime+intertime;enNew.NType=0;enNew.next=NULL;if(enNew.OccurTime<CloseTime) //新客户在下班前才处理OrderInsert(ev,enNew);//printf("时间%d\n",enNew.OccurTime);//printf("时间%d\n",t);// 插入最短队QEptr Q;Q = (QEptr) malloc(sizeof(QCuElem));Q->ArrivalTime = en.OccurTime;Q->Duration = durtime;Q->next = NULL;int i = MinCuQueue(q);EnCuQueue(q[i],Q);// 将离开事件插入时间表enNew.OccurTime = en.OccurTime + durtime;enNew.NType = i;enNew.next = NULL;if(QLength(q[i]) == 1)OrderInsert(ev, enNew);return OK;}int CustomerDeparture(EventList &ev, QCupp &q, Event en){//printf("****顾客离开处理****");int i = en.NType;//printf("离开时间%d\n",en.OccurTime);if(en.OccurTime>CloseTime){DestoryQueue(q[i]);}else{QCuElem customer;DeCuQueue(q[i],customer);// 客户逗留时间TotalTime += en.OccurTime - customer.ArrivalTime;//printf("总时间为%d\n",TotalTime);if (q[i].front->next){GetQHead(q[i],customer);Event enNew;enNew.OccurTime = en.OccurTime + customer.Duration;enNew.NType = i;OrderInsert(ev, enNew);}}return OK;}void CloseForDay(){printf("\n***************************************\n");printf("*\n");printf("* 所有顾客业务办理总时间:%d分钟\n", TotalTime);printf("* 业务办理顾客数:%d\n", CustomerNum);printf("* 平均每人办理时间:%f\n",(float)TotalTime/(float)CustomerNum);printf("*\n");printf("***************************************\n");}//功能实现子函数int OrderInsert(EventList &ev, Event en){EventList entemp,qtemp;entemp = (EventList) malloc(sizeof(Event));entemp->OccurTime = en.OccurTime;entemp->NType = en.NType;entemp->next = NULL;if (!ev->next){ev->next = entemp;return OK;}qtemp = ev;while(qtemp->next&&qtemp->next->OccurTime < en.OccurTime){qtemp = qtemp->next;}entemp->next = qtemp->next;qtemp->next = entemp;return OK;}int QLength(QCustomerp qn){QEptr qtemp;int i=0;qtemp = qn.front->next;while(qtemp){qtemp = qtemp->next;i++;}return i;}int MinCuQueue(QCupp q){int i,min; for (i=1,min=1;i<=windows;i++){if(QLength(q[i])<QLength(q[min])) min=i;}return min;}int DelFirstEvent(EventList &ev){EventList p;p = ev->next;ev->next = p->next;free(p);return OK;}int InitCuQueue(QCustomerp &q){q.front=q.rear=(QEptr) malloc(sizeof(QCuElem));if(!q.front) exit(OVERFLOW);q.front->next = NULL;return OK;}int EnCuQueue(QCustomerp &qn,QEptr Q){qn.rear->next = Q;qn.rear = Q;return OK;}int DeCuQueue(QCustomerp &qn,QCuElem &Q){QEptr qtemp;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);return OK;}int GetQHead(QCustomerp qn,QCuElem &Q){Q.ArrivalTime = qn.front->next->ArrivalTime;Q.Duration = qn.front->next->Duration;return OK;}int DestoryQueue(QCustomerp qn){QEptr p;while(qn.front->next){p = qn.front->next;qn.front->next = p->next;free(p);}qn.front->next =NULL;qn.rear = qn.front;return OK;}/*void Print(QCustomerp QCu[]){int l;for(int i=1;i<=windowsnum;i++){l = QLength(QCu[i]);printf("队列%d:长%d:",i,l);for (int n=1;n<=l;n++){printf("@");}printf("\n");}}*/3:结果分析:本实验是一个综合性的实验,所以要考察学生的对数据类型的恰当使用,以及对事件的处理。