电话客户服务模拟

问题描述:

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

C语言编写,使用VS2008.

哎,一个这个作业,写了两天才搞出来,最后100多行代码实现了,感觉还可以。

以后要好好学习数据结构了,不想解释怎么写的,直接上源代码

源代码:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      

#define NumServer 5
#define AverageServiceTime 3
#define MaxRunTime 15


typedef struct queue
{
	int ReatchTime;//到达时间
	int RandServiceTime;//随机服务时间段
	int XuHao;//到来的序号
	struct queue *next;
}Customer;

//初始化队列
Customer *front = NULL;
Customer *rear = NULL;

int Server[NumServer+1];//里面只有一个元素,判断是否空闲。0为空闲,大于0为繁忙

int main()
{
	int ReatchSpeed;//每分钟到来的电话数
	float SumWaitTime = 0.0;
	int i;
	int j;
	int k;
	int n;
	int t;
	int b = 1;
	int count = 1;//电话序号
	int NotOrYesCustomerIdle = 1;//“是否有任意的客服空闲”参数,-1表示没有,1表示有 
	for(n=0;n
      
      
       
       ReatchTime = i;
					TempCustomer->RandServiceTime = rand()%AverageServiceTime+1 ;//[1,AverageServiceTime ]之间的整型随机数
					TempCustomer->XuHao = count;

					front = TempCustomer;
					rear = TempCustomer;
					rear->next = NULL;
				}
				else
				{
					TempCustomer->ReatchTime = i;
					TempCustomer->RandServiceTime = rand()%AverageServiceTime+1 ;//[1,AverageServiceTime ]之间的整型随机数
					TempCustomer->XuHao = count;

					rear->next = TempCustomer;
					rear = TempCustomer;
					rear->next = NULL;
				}

				count++;//每创建一个,序号+1
				ReatchSpeed--;
			}
		}
		else if(b==1)
		{
			printf("现在时间为%d,已到系统限制时间,不再接受新的电话到来,接下来只处理等待队列中的电话\n",i);
			b = -1;
		}

		NotOrYesCustomerIdle = 1;//每一次i的循环,都视为有客服空闲,这样才能往下进行检查,
								 //下面while中NotOrYesCustomerIdle>0是循环几次的条件。而NotOrYesCustomerIdle = 1是为了让循环能够初始进行

		//任务分配
		if(front == NULL)
			printf("等待电话接入. . .\n");
		else
		{
			while( (front != NULL) && (NotOrYesCustomerIdle>0) )//非空才分配任务
			{
				NotOrYesCustomerIdle = -1;
				for(j=0;j
       
       
         XuHao,front->RandServiceTime); Server[j] = front->RandServiceTime; SumWaitTime = SumWaitTime + (i - front->ReatchTime); //数据处理完后,进行删除 //Customer *Temp = front; front = front->next; //free(Temp); } } } //置客服为空闲函数 for(k=0;k 
        
          0) Server[k]--; } if( (i>MaxRunTime) && (front == NULL) ) { printf("共接听%d个电话,所有电话的等待时间之和为%3.1f分钟,平均等待时间为%4.3f分钟\n\n",count-1,SumWaitTime,SumWaitTime/(count-1)); printf("电话客服模拟程序运行结束,感谢使用!\n\n"); break; } } return 0; } 
         
       
      
      
     
     
    
    
   
   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值