- #include <stdio.h>
- #include <malloc.h>
- #include <windows.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include <windows.h>
- int first = 1;//用于生成随机到达时间模块,判断是否第一次生成随机到达时间;
- int hour;//用于生成随机到达时间,记入到达的小时;
- int minute;//用于生成随机到达时间,记入到达的分钟;
- int oldminute[10];//用于计算客户的等待时间的计数量,记入上一个客户到达时间的分钟;
- int n = 1;//标志oldminute[]的索引位置;
- int oldsever[10];//用于计算客户的等待时间的计数量,记入上一个客户的服务时间;
- int tice = 1;//标记计算等待时间是索引位置;
- int num = 1;//客户序号累加计数
- typedef struct qnode
- {
- int custmerNumber;//客户序号;
- char arriveTime[10];//客户到达时间;
- char waitTime[10];//客户等待时间;
- char serveTime[10];//客户服务时间;
- struct qnode *next;
- }CustmerQNode;
- typedef struct
- {
- CustmerQNode *front;//队列头指针,指向队头元素;
- CustmerQNode *rear;//队列胃指针,指向队尾元素;
- }LiQueue;
- /*初始化队列,不带头结点的队列链表;*/
- void InitQueue(LiQueue *&q)
- {
- q=(LiQueue*)malloc(sizeof(LiQueue));
- q->front=q->rear=NULL;
- }
- /*实现队列的入队;*/
- void enQueue(LiQueue *q)
- {
- //封装结点;
- CustmerQNode *s;
- s=(CustmerQNode*)malloc(sizeof(CustmerQNode));
- s->custmerNumber = num++;
- /*生成随机到达时间*/
- char time2[10];
- char time3[10];
- int ad;
- if(first == 1)
- {
- for(int k = 0 ; k<5; k++)
- {
- hour = ((int)(4*(rand()/(RAND_MAX+1.0)))+8);
- }
- first = 0;
- }
- itoa(hour,time3,10);//itoa:把整数转换为字符串;
- strcat(time3,"点");
- for(int m = 0; m<5; m++)
- {
- ad = ((int)(4*rand()/(RAND_MAX+1.0)));
- }
- minute += ad;
- minute += 2;
- oldminute[n++] = minute;
- itoa(minute,time2,10);//itoa:把整数转换为字符串;
- strcat(time3,time2);
- strcat(time3,"分");
- strcpy(s->arriveTime,time3);
- s->next=NULL;
- if(q->rear==NULL)
- {
- q->front =s;
- q->rear =s;
- }
- else
- {
- q->rear->next =s;
- q->rear =s;
- }
- }
- /*修改客户信息:完成客户等待时间和服务时间的修改;*/
- int revamp(LiQueue *q)
- {
- if(q->rear == NULL)
- return 0;
- else
- {
- //随机生成服务时间
- int sertime = 0;
- int temp;
- int wait;
- for(int i = 0; i<5; i++)
- {
- temp = ((int)(4*rand()/(RAND_MAX+1.0))+5);
- }
- sertime += temp;
- oldsever[tice] = sertime;
- itoa(sertime,q->front->serveTime,10);
- if(tice == 1)
- {
- wait = 0;
- itoa(wait,q->front->waitTime,10);
- strcat(q->front->waitTime,"分钟");
- }
- else
- {
- wait = oldsever[tice-1]-(oldminute[tice] - oldminute[tice - 1]);
- if(wait < 0)
- {
- itoa(0,q->front->waitTime,10);
- strcat(q->front->waitTime,"分钟");
- }
- else
- {
- itoa(wait,q->front->waitTime,10);
- strcat(q->front->waitTime,"分钟");
- }
- }
- tice++;
- return 1;
- }
- }
- /*出队函数:删除客户信息,并返回删除的客户的基本信息*/
- int deQueue(LiQueue *q,int &DecCustmerNumber, char *DecArriveTime, char *DecServeTime,char *DecWaitTime)
- {
- CustmerQNode *t;
- if(q->rear ==NULL)
- return 0;
- if(q->front == q->rear )//只有一个结点
- {
- t=q->front ;
- q->front =NULL;
- q->rear =NULL;
- }
- else
- {
- t=q->front;
- q->front=q->front->next;
- }
- DecCustmerNumber = t->custmerNumber;
- strcpy(DecArriveTime,t->arriveTime);
- strcpy(DecServeTime,t->serveTime);
- strcpy(DecWaitTime,t->waitTime);
- free(t);
- return 1;
- }
- void main()
- {
- LiQueue *q;
- int id;//deQueue函数返回的客户序号;
- char decarrive[10];//deQueue函数返回的客户到达时间;
- char decserve[10];//deQueue函数返回的客户服务时间;
- char decwait[10];//deQueue函数返回的客户等待时间;
- char choose;//服务选项;
- int bar = 1;//柜台号;
- int second;//延时程序的循环计数;
- InitQueue(q);
- srand(time(0));
- printf("银行叫号模拟系统\\n");//创建3个业务服务窗口,通过7个客户来测试模拟系统;
- printf("\\n");
- printf("=====================================\\n");
- printf("1. 客户取号(客户创建)\\n");
- printf("2. 叫号模拟(业务服务安排)\\n");
- printf("0. 退出\\n");
- printf("(按数字1、2、0,选择操作)\\n");
- printf("=====================================\\n");
- printf("\\n");
- while(1)
- {
- printf("请您输入服务选项:");
- scanf("%c",&choose);
- getchar();
- switch (choose)
- {
- case '1'://1. 客户取号(客户创建)
- enQueue(q);//客户加入队列;
- printf("客户号%d\\t到达时间:%s\\n",q->rear->custmerNumber,q->rear->arriveTime);
- printf("\\n");
- break;
- case '2'://2. 叫号模拟(业务服务安排)
- printf("请耐心等待...\\n");
- for(second = 0 ; second<5 ; second++)
- {
- Sleep(1000);//延时1秒
- }
- revamp(q);//修改客户的服务时间和等待时间;
- deQueue(q,id,decarrive,decserve,decwait);//将完成服务的客户移出队列;
- //客户业务处理完后,输出客户的状态信息(序号、到达时间、等待时间、服务时间)
- printf("第%d位客户, 到达时间为:%s, 服务时间为:%s, 等待时间为:%s\\n",id,decarrive,decserve,decwait);
- if(q->front != NULL)//判断队列中是否还有等待的客户;
- {
- printf("请%d客户到第%d柜台\\n",q->front->custmerNumber,bar++);
- }
- else
- {
- printf("已无等待客户\\n");
- }
- printf("\\n");
- if(bar == 4)
- {
- bar = 1;
- }
- break;
- case '0'://0. 退出
- printf("谢谢您的使用!\\n");
- exit(1);
- default :
- printf("您输入的选择有误,请重新输入。\\n");
- break;
- }
- }
- }
- //该片段来自于http://www.codesnippet.cn/detail/090120148476.html
来源: http://www.codesnippet.cn/detail/090120148476.html