数据结构 银行系统的实验报告.doc_第1页
数据结构 银行系统的实验报告.doc_第2页
数据结构 银行系统的实验报告.doc_第3页
数据结构 银行系统的实验报告.doc_第4页
数据结构 银行系统的实验报告.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

软件学院综合性实验报告专业: 年级/班级 20132014学年第一学期课程名称指导教师本组成员学号姓名实验地点实验时间项目名称银行业务模拟系统的设计与实现实验类型综合性一、 实验目的1)通过实验掌握对离散事件模拟的认识;2)进一步理解队列的实现与应用;3)对链表的操作有更深层次的理解;该实验涉及到线性表的建立、插入、删除等操作,涉及到了队列的建立、插入、删除,涉及到了离散事件的应用思想,还涉及到了排序的概念。完成这个实验对线性表、队列及C语言编程等多方面的知识将是一个很好的利用,对离散事件也将有一个初步的认识。二、 实验仪器或设备学院提供公共机房,1台/学生微型计算机。三、 总体设计(设计原理、设计方案及流程等)1 问题描述假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若四个窗口均有客户所占,他便会排在人数最少的队伍后面。现在需要编制程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。2一个完整的系统应具有以下功能:1) 初始化(OpenForDay),模拟银行开门时各数据结构的状态。2) 事件驱动(EventDrived), 对客户到达和离开事件做相应处理。3) 下班处理(CloseForDay), 模拟银行关门时的动作,统计客户平均逗留时间 。四、 实验步骤(包括主要步骤、代码分析等) 1)C语言代码#include #include #include #include int Cks=4; / 银行办理业务的窗口数,默认值为:4;最大值不超过20;int Qu ; / 客户队列数Qu=Cksint Khjg=5; / 两相邻到达客户的时间间隔最大值,默认值为:5int Blsj=30; / 每个客户办理业务的时间最大值,默认值为:30typedef struct int OccurTime; int NType; / 事件类型,Qu表示到达事件,0至Qu-1表示Qu个窗口的离开事件 Event,ElemType; typedef struct LNode ElemType data ;struct LNode *next; LNode, *LinkList; typedef LinkList EventList; / 事件链表类型,定义为有序链表typedef struct int ArrivalTime; int Duration; QElemType; typedef struct QNode QElemType data ;struct QNode *next; QNode, *Queue; typedef struct Queue head; Queue tail; LinkQueue;LinkQueue *q; / Qu个客户队列EventList ev; Event en; Event et; QElemType customer; int TotalTime=0,CustomerNum=0; / 累计客户逗留时间,客户数(初值为0)int CloseTime; / 银行营业时间(单位是分)void InitList(EventList &L) L=(EventList)malloc(sizeof(LNode); L-next=NULL;int ListLength(EventList L)/求事件表的长度int i=0; EventList p;p=ev-next;while(p) p=p-next;i+;return i;int ListEmpty(EventList ev)/判事件表是否空return(ev-next=NULL);void Gethead(EventList ev,Event &en) EventList q; q=ev-next; en=q-data; ev-next=q-next;free(q);void InitQueue( LinkQueue &Q)Q.head=Q.tail=(Queue)malloc(sizeof(QNode);Q.head-next=NULL;int cmp(Event a, Event b) / 依事件a的发生时刻事件b的发生时刻分别返回-1、0或1 if(a.OccurTime=b.OccurTime) return 0; else return (a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime); void Insert_EventList(EventList &L, Event a)/将事件a插入到有序的事件链表中,保持有序性不变 EventList p=L,q;while(p-next& cmp(p-next-data, a)next; q=(EventList)malloc(sizeof(LNode);q-data=a;q-next=p-next; p-next=q;void EnQueue(LinkQueue &Q ,QElemType a)/将一个客户a插入到队列Q中Queue p;p=(Queue)malloc(sizeof(QNode); /产生客户结点p-data=a;p-next=NULL;Q.tail-next=p;Q.tail=p; void DelQueue(LinkQueue &Q ,QElemType &a)Queue p;a=Q.head-next-data; p=Q.head-next; Q.head-next=Q.head-next-next;if(Q.tail=p) Q.tail=Q.head;free(p);int QueueEmpty(LinkQueue Q )/判队列空return(Q.head=Q.tail);void Random(int &d,int &i) /产生两个随机数 d=rand()%Blsj+1; i=rand()%Khjg+1; int QueueLength(LinkQueue Q)/求队列的长度int i=0; Queue p;p=Q.head-next;while(p) p=p-next;i+;return i; /返回队列的长度void GetHead_q(LinkQueue &Q,QElemType &a)/从非空队列中取一个元素 a=Q.head-next-data;int Minimum(LinkQueue Q) / 返回最短队列的序号 int l20; int i,k; for(i=1;iQu+1;i+) li=QueueLength(Qi); k=1; for(i=2;iQu+1;i+) if(lilk) k=i; return k; void OpenForDay() /模拟银行开门的动作,即初始化操作 int i; InitList(ev); / 初始化事件链表为空 en.OccurTime=0; / 设定第一个客户到达事件 en.NType=0; / 客户到达事件 Insert_EventList(ev, en);/插入事件 q=(LinkQueue*)malloc(Qu+1)*sizeof(LinkQueue);/为队列申请Qu+1个队头指针,第0个不用 for(i=1;iQu+1;+i) / 置空队列 InitQueue(qi); void CustomerArrived() QElemType f; int durtime,intertime,i; +CustomerNum; Random(durtime,intertime); / 生成随机数 /printf(%d %dn,durtime,intertime); et.OccurTime=en.OccurTime+intertime; / 下一客户到达时刻 et.NType=0; / /printf(%d %dn,et.NType,et.OccurTime); if(et.OccurTimenext; while(p) printf(%d ,%d)-,p-data.NType,p-data.OccurTime);p=p-next; printf(n);void output_q(LinkQueue Q)/输出队列中的元素,看各队列中元素的变化情况Queue p;p=Q.head-next;while(p) printf(%d ,%d)-,p-data.ArrivalTime,p-data.Duration);p=p-next; printf(n);void Bank_Simulation() OpenForDay(); while(!ListEmpty(ev) Gethead(ev,en); /printf(事件%d %dn ,en.NType,en.OccurTime); if(en.NType=0) CustomerArrived(); / 处理客户到达事件 else CustomerDeparture(); / 处理客户离开事件 / 计算并输出平均逗留时间 printf(顾客总数:%d, 所有顾客共耗时:%d分钟, 平均每人耗时: %d分钟n,CustomerNum,TotalTime,TotalTime/CustomerNum); void Bank() printf(请输入银行营业时间长度(单位:分)CloseTime=); scanf(%d,&CloseTime); printf(请输入银行办理业务所开窗口数Cks=); scanf(%d,&Cks); printf(请输入客户办理业务的最长时间Blsj=); scanf(%d,&Blsj); printf(请输入两个相邻客户到达银行的时间间隔的最大值Khjg=); scanf(%d,&Khjg); Qu=Cks; /给Qu赋值为窗口数Cks Bank_Simulation(); /模拟银行业务void main() Bank(); 2) 代码分析 因为客户达到的时间及办理业务的时间是随机的所以用产生随机数模拟,设定第一个客户进来的时间为0时刻,即是程序处理的第一个事件,之后每个客户到达的时刻在前一个客户到达时设定。因此在客户到达事件发生时程序产生两个随机数,刚到达的客户需要插入当前所含元素最少的队列,若该队列在插入前为空,则产生一个客户离开插入时间表。 客户离开的事件则先求出客户逗留的时间,然后从队列中删除该

温馨提示

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

评论

0/150

提交评论