1、 问题描述

直到到达指定的一个模拟时钟提供接听电话服务的时间(以分钟计),然后这个时钟将循环地自增1(分钟),时间为止。在时钟的每个“时刻”,就会执行一次检查来看看当前电话的服务是否已经完成,如果是,这个电话从电话队列中删除,模拟服务将从队列中取出下一个电话(如果有)继续开始。同时还需要执行一个检查来判断是否有一个新的电话到达,如果有将其到达的时间记录下来,并为其产生一个随机服务时间,这个服务时间也被记录下来,然后将这个电话放入电话队列中,客户服务人员空闲时,按照先来先服务的方式处理这个队列。当时钟到达指定时间时,不会再接当听新电话,但是服务将继续,直到队列中所有电话得到处理为止。

2、 要求

(1) 程序需要处理的初始数据包括:客户服务人员的人数、时间限制,电话到达的速率,平均服务时间。

(2) 程序产生的结果包括:处理的电话数,每个电话的平均等待时间



#include"stdio.h"
#include"stdlib.h"
#include"time.h"

int server[10];
int total;
int count = 1;
float sum = 0;
int reachtime;
int temp[10];


typedef struct quene
{
    int reach;
    struct quene *next;
}que;

que *head = NULL;
que *last = NULL;

#if 0
time_t t;
time(&t);
struct tm *t1;
#endif

void create()
{
    que *p = (que *)malloc(sizeof(que));
    if(head == NULL)
    {
        p->reach = reachtime;
 head = p;
 last = p;
    }
    else
    {
        p->reach = reachtime;
 last->next = p;
 last = p;
    }
    last->next = NULL;
}

void deque()
{
    if(head == NULL)
    {
        printf("处理剩余的客户完成\n");
 printf("共接待%d个客户,平均等待时间为%f分钟/个\n",count-1,sum/(count-1));
 printf("欢迎使用本电话客服模拟系统,see you!\n");
 exit(-1);
    }
    else
    {
        printf("正在接入第%d个客户\n",count);
        que *q = head;
 head = head->next;
 sum = sum + (reachtime-q->reach);
 free(q);
 q = NULL;
    }
}

int main()
{
    int x;
    int i;
    char get;
    int reach;
    int maxtime;
    int j;
    while(1)
    {
        printf("请输入 y 开始模拟\n");
        scanf(" %c",&get);
 if( get == 'y')
 {
     printf("开始模拟\n");
     break;
 }
 else
 {
     printf("输入有误,请重新输入\n");
 }
    }
    printf("本程序服务时间以秒计\n");
    printf("请输入有多少个客服1-10个\n");
    scanf("%d",&total);
    printf("下面开始定义每个客服的平均服务时间\n");
    for(i=1;i<=total;i++)
    {
        printf("请定义第%d个客服平均服务时间:",i);
 scanf("%d",&server[i]);
 temp[i] = server[i];
    }
    printf("定义成功\n");
    printf("请定义每分钟来几个电话:\n");
    scanf("%d",&reach);
    printf("请定义开放本系统时间:");
    scanf("%d",&maxtime);
    printf("初始化系统完成\n");
    for(i = 1;i <= maxtime;i++)
    {
        reachtime = i;
        printf("第%d分钟时刻,来到%d个电话\n",i,reach);
 x = reach;
 while(x)
 {
     create();
     x--;
 }

 printf("正在查询是否有客服空闲\n");
 if(i == 1)
 {
     for(j = 1;j <= total;j++)
            {
         printf("第%d个客服空闲,",j);
  if(head == NULL)
  {
      printf("但队列已空,所以等待用户接入\n");
      server[j] = 0 ;
  }
  else
  {
      deque();
      count++;
  }
     }
 }
 else
 {
     for(j=1;j <= total;j++)
     {
  if(server[j] == 0 || server[j] == -1)
  {
      printf("第%d个客服空闲,",j);
      if(head == NULL)
      {
          printf("但队列已空,所以等待用户接入\n");
   server[j] = 0;
      }
      else
      {
                 deque();
          count++;
          server[j] = temp[j];
      }
  }
     }
 }
 for(j = 1;j <= total;j++)
 {
     server[j]--;
 }
      }
    printf("系统关闭,处理队列中剩余的元素\n");
    while( head != NULL)
    {
        reachtime++;
        for(j = 1;j<=total;j++)
 {
     if(server[j] == 0)
     {

         printf("第%d个客服空闲,",j);
                deque();
  count++;
  server[j] = temp[j];
     }
 }
 for(j =1;j<=total;j++)
 {
     server[j]--;
 }
    }
    printf("共接待%d个客户,平均等待时间为%f分钟/个\n",count-1,sum/(count-1));
    printf("欢迎使用本电话客服模拟系统,see you!\n");
    #if 0
    printf("服务开始时间为:");
    t1 = localtime(&t);
    printf("%d年%d月%d日%d时%d分%d秒\n",t1->tm_year,t1->tm_mon,t1->tm_mday,t1->tm_hour,t1->tm_min,t1->tm_sec);
    #endif
    return 0;
}