c语言银行排队事件模拟.doc_第1页
c语言银行排队事件模拟.doc_第2页
c语言银行排队事件模拟.doc_第3页
c语言银行排队事件模拟.doc_第4页
c语言银行排队事件模拟.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

/离散事件模拟,模拟银行营业时的排队情况/不考虑顾客中途离开,顾客到达事件随机,业务办理时间/长度随机,选择最短的队排队,不再换队/时间:2012年9月17日 #include #include #include #include#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0/*结构体*/ /事件表节点typedef struct Event int OccurTime; /事件发生时刻 int NType; /事件类型,0表示到达事件,1至n表示四个窗口的离开事件 struct Event *next;Event, *EventList;/队列节点typedef struct QElemType int ArriveTime;/到达时间 int Duration;/办理业务所需时间 struct QElemType *next;QElemType;/队列指针typedef struct QElemType *front;/头指针 QElemType *rear;/尾指针LinkQueue;/*函数申明*/事件表基本操作函数Event NewEvent(int occurT,int nType); /根据OccurTime和NType值,创建新事件int InitList();/初始化事件链表int OrderInsert(EventList L, Event e);/将事件e按发生时间顺序插入有序链表L中int ListEmpty(EventList L);/判断链表L是否为空,为空返回TRUE,否则返回FALSEint DelFirst(EventList L,Event *memorry); /链表L不为空,删除其首结点,用memorry返回,并返回OK;否则返回ERRORint ListTraverse(EventList L);/遍历链表/队列基本操作函数int InitQueue(LinkQueue *Q); /初始化队列Qint EmptyQueue(LinkQueue *Q); /若队列Q为空,返回TRUE,否则返回FALSEint DelQueue(LinkQueue *Q, QElemType *memrroy); /若队列Q不为空,首结点出队,用memrroy返回,并返回OK;否则返回ERRORint EnQueue(LinkQueue *Q, QElemType e);/结点e入队Qint QueueLength(LinkQueue *Q);/返回队列Q的长度,即元素个数int GetHead(LinkQueue *Q, QElemType *memorry);/若队列Q不为空,用memrroy返回其首结点,并返回OK,否则返回ERRORint QueueTraverse(LinkQueue *Q);/遍历队列Q/排队主操作函数int ShortestQueue();/获取最短队列的编号void OpenForDay(); /初始化操作void CustomerArrived();/顾客达到事件void CustomerDepature();/顾客离开事件void Bank_Simulation(); /银行排队模拟/显示函数void PrintEventList();/显示当前事件表void PrintQueue();/显示当前窗口队列/*全局变量*/#define MAXSIZE 20 /宏定义EventList ev;/事件指针变量Event en; /事件LinkQueue qMAXSIZE;/队列指针结构体数组QElemType customer;/队列节点int windows_num;/窗口个数int TotalTime,CustomerNum;/顾客总时间,顾客总人数int CloseTime=50;/关闭时间,即营业时间长度/*主函数*/int main() srand(unsigned)time(NULL);/设置随机种子 Bank_Simulation();/银行模拟排队 return 0;/*银行排队主操作函数*/银行开门初始化void OpenForDay()int i;/全局变量赋初值 TotalTime = 0; CustomerNum = 0; /建立空事件表 InitList(); /对一天中的第一个事件发生事件和类型赋初值 en.OccurTime=0; en.NType=0; /第一个事件发生预订,插入事件表 OrderInsert(ev,en);/得到用户输入窗口数printf(请输入排队窗口个数:);scanf(%d,&windows_num );while(windows_numMAXSIZE) printf(请输入1到20之间的数:); scanf(%d,&windows_num ); /得到用户输入银行关闭时间 printf(请输入银行关闭时间:);scanf(%d,&CloseTime); /建立若干个空队列 for(i = 0; i windows_num; i+) InitQueue(&qi);/初始化windows_no个窗口队列/客户到达事件处理void CustomerArrived() int durtime,intertime,i,t; QElemType e; +CustomerNum; intertime = rand()%5 + 1; /间隔时间在5分钟内 durtime = rand()%30 + 1; /办理业务时间在30分钟内 t = en.OccurTime + intertime;/下一客户到达的时间 /银行尚未关门 if(t CloseTime) /下一个顾客来的预订,插入事件表printf(n上一个顾客到达的时间:%d,现在也入列n,en.OccurTime);OrderInsert(ev, NewEvent(t,0);/顾客来到后入人数最少的队列e.ArriveTime = en.OccurTime;/入队时间e.Duration = durtime;/办理业务时间i = ShortestQueue();/得到最短队列编号EnQueue(&qi, e);/入队操作/如果入列后 排在队头,则发生离开事件的预订if(QueueLength(&qi) = 1)OrderInsert(ev, NewEvent(en.OccurTime + durtime, i+1);/窗口编号为队列序号加1 /银行关门(不再执行下一个来到事件的预订) else printf(n银行下班,不再接待新客户!); printf(n上一个顾客到达的时间:%d,现在也入列n,en.OccurTime); /顾客来到后入人数最少的队列e.ArriveTime = en.OccurTime;/入队时间e.Duration = durtime;/办理业务时间i = ShortestQueue();/得到最短队列编号EnQueue(&qi, e);/入队操作/如果入列后 排在队头,则发生离开事件的预订if(QueueLength(&qi) = 1)OrderInsert(ev, NewEvent(en.OccurTime + durtime, i+1);/窗口编号为队列序号加1return ;/顾客离开事件void CustomerDepature() int i = en.NType - 1;/队列编号为窗口编号减1/删除队列首节点 DelQueue(&qi, &customer); printf(n客户离开时间:%d,事件也删除n,en.OccurTime);/输出顾客离开时间 TotalTime += en.OccurTime - customer.ArriveTime;/如果队列不为空,则根据新的队列首节点,来确定离开事件预订 if(!EmptyQueue(&qi) GetHead(&qi, &customer); OrderInsert(ev, NewEvent(en.OccurTime + customer.Duration, i+1);/窗口编号为队列序号加1 return;/银行排队模拟void Bank_Simulation() OpenForDay(); while(!ListEmpty(ev)/直到事件表为空/删除事件表首结点,并得到首节点的数据作为判断依据 DelFirst(ev, &en); /类型为0则表示到达事件,类型为1、2、3、4.为离开事件 if(en.NType = 0) CustomerArrived(); else CustomerDepature(); PrintEventList(); PrintQueue();system(PAUSE);/用户暂停操作,用于调试 printf(n客户办理总时间为: %d 分钟,客户办理平均时间: %f 分钟n,TotalTime,(float)TotalTime/CustomerNum);/获取最短队列的编号int ShortestQueue() int i,min;int aMAXSIZE;min = 0; for(i = 0; i windows_num; i+) ai = QueueLength(&qi); for(i = 1; i windows_num; i+) if(ai amin) min = i; return min;/*显示函数*/显示当前队列状态void PrintQueue() int i; printf(n队列状态:n); for(i = 0; i next=NULL; ev = L;/得到空表的地址 return OK;/向事件表中按时间升序插入元素 int OrderInsert(EventList L, Event e) EventList p,q; q = L;p = L-next;while(p & e.OccurTime p-OccurTime) q = p; p = p-next; /q指向节点的后面挂新节点q-next = (EventList)malloc(sizeof(Event); /对新节点赋值q-next-OccurTime = e.OccurTime; q-next-NType = e.NType;q-next-next = p;return OK; /判断链表L是否为空,为空返回TRUE,否则返回FALSE int ListEmpty(EventList L) if(L-next = NULL) return TRUE; else return FALSE;/链表L不为空,删除其首结点,用e返回,并返回OK;否则返回ERROR int DelFirst(EventList L, Event *memorry) EventList p ;if(ListEmpty(L) = TRUE)printf(链表为空!n);return ERROR;elsep = L-next;L-next = p-next; /保存数值 *memorry = *p;free(p);returnOK;/遍历链表 int ListTraverse(EventList L) EventList p ;p = L; while(p-next)p = p-next; printf(时间:%d,类型:%dn,p-OccurTime,p-NType); printf(n); return OK;/*队列相关函数*/初始化队列Qint InitQueue(LinkQueue *Q) Q-front = Q-rear=(QElemType *)malloc(sizeof(QElemType); if(!Q-front) printf(内存分配失败!n); exit(-1); Q-front-next=NULL; return OK;/若队列Q为空,返回TRUE,否则返回FALSEint EmptyQueue(LinkQueue *Q) if(Q-front = Q-rear) return TRUE; else return FALSE;/若队列Q不为空,首结点出队,用memorry返回,并返回OK;否则返回ERRORint DelQueue(LinkQueue *Q, QElemType *memorry)QElemType *p ;/节点指针if(EmptyQueue(Q) printf(队列为空,不能再进行出列操作!n); return ERROR;else p = Q-front-next; *memorry = *p; Q-front-next = p-next; if(Q-rear = p) Q-rear = Q-front; free(p); return OK; /结点e入队Qint EnQueue(LinkQueue *Q, QElemType e) QElemType* p;/节点指针 p = (QElemType *)malloc(sizeof(QElemType); if(NULL = p) printf(内存分配失败!n); exit(-1); else *p = e; p-next = NULL; Q-rear-next = p; Q-rear = p; return OK;/返回

温馨提示

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

最新文档

评论

0/150

提交评论