数据结构课程设计——题目四电话模拟

一、课程设计题目:

赵斌是一个信管专业的学生,大学四年顺利毕业了。在毕业季,他也像其他学子一样,投身于求职大军,投出一份又一份求职简历,在苦苦地等待之后,他接到了中国移动通信公司广东分司的面试通知书,通知他于本月110点到公司面试。当天,晴空万里,艳阳高照,他身着西装,高兴地早早来到公司楼下等待。10点钟整,他和其他新人一起,坐到公司的面试现场。他领取的一一份程序设计题: 假如你是我公司一名客服技术人员,现请你选择自己熟悉的语言,来设计一个程序,管理客户向公司打进来的咨询电话。请事行分析析使用方法和工具,说明自己的思路方法,写一份完整的程序,并实例测试。

二、问题描述:

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

三、要求:

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

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

四、功能分析:

设客户服务人员的人数a、时间限制b,电话到达的速率c,平均服务时间d。

这个题目深入分析下来其实可以看成是一个大的循环,循环随着时刻转动, 这里我们呢可以定义3个数据结构,两个队列跟一个链表,具体内容及思路如下:

1,定义一个队列存放待接的电话数,每次循环加入c个结点队列中,其中数据为当前时刻(记录接入时刻方便求得等待时间)。

2,定义一个队列存放当前空闲服务人员,其中数据随意;

3,定义一个链表存放当前正在工作人员,其中数据均存入d,存入d并在循环中对其做“--”操作,当其中数值为0时表示此次服务结束,定义链表是便于查找为0结点并删除;

具体循环思路 : 先将所有服务人员加入空闲人员队列。然后设置依时刻循环,先将来电存入队列,将工作人员数据做“--”操作,然后找出数据为0的并删除,记录删除个数k。

在空闲人员队列中加入k个结点(工作完成的服务人员到空闲队列中);

判断空闲人员队列与来电队列是否都不为空,若都为空则两队列都出队一个元素直到有一个队列为空(空闲人员与来电必须一对一配置),在出队时拿当前时刻减去取出元素数

据段就得到该来电等待时间,定义sum求和,并记录出对个数l,因为出去的工作人员

要加入正在工作链表中;在正在工作链表中加入l个元素。并取数据段值为d;总共的接入数=b*c,平均等待时间=sum/(b*c)

 五、代码:

#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;  

}  

六、效果截图:

 

七、收获和不足:

这次的课程设计做得有些仓促,一方面忙着考试复习,一方面考完试后又忙着学习其他语言来做数据库的课程设计,因为它提前要交了,导致做课程设计的时间更赶了,可能这次学习会没有什么大的收获,有很多不足,但是我也还是希望自己能多督促自己学习,不要再临时抱佛脚了。

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值