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