?? algo3-13.cpp
字號:
// algo3-13.cpp 使用排隊機的銀行業務模擬
#define Qu 4 // 窗口數
#define Khjg 5 // 兩相鄰到達的客戶的時間間隔最大值
#define Blsj 30 // 每個客戶辦理業務的時間最大值
#include"func3-3.cpp" // 包含algo3-12.cpp和algo3-13.cpp共同用到的函數和變量等
LinkQueue q; // 排隊機隊列q
QElemType customer[Qu]; // Qu個客戶隊列元素, 存放正在窗口辦理業務的客戶的信息
//FILE *fq; // 文件型指針,用于指向c.txt文件
//int j=0; // 計數器,產生c.txt文件用到
Boolean chk[Qu]; // 窗口狀態,1為閑,0為忙
void OpenForDay()
{ // 初始化事件鏈表ev且插入第1個到達事件,初始化排隊機q,初始化Qu個窗口為1(空閑)
int i;
InitList(ev); // 初始化事件鏈表ev為空
en.OccurTime=0; // 設定第1位客戶到達時間為0(銀行一開門,就有客戶來)
en.NType=Qu; // 到達
OrderInsert(ev,en,cmp); // 將第1個到達事件en有序插入事件表ev中,在bo2-6.cpp中
InitQueue(q); // 初始化排隊機隊列q
for(i=0;i<Qu;i++)
chk[i]=1; // 初始化Qu個窗口為1(空閑)
}
int ChuangKou()
{ // 返回空閑窗口的序號(0~Qu-1),若有多個窗口空閑,返回序號最小的。若無空閑窗口,返回Qu
int i;
for(i=0;i<Qu;i++)
if(chk[i])
return i;
return i;
}
void CustomerArrived()
{ // 處理客戶到達事件en(en.NType=Qu),與algo3-12.cpp不同
QElemType f;
int durtime,intertime,i;
++CustomerNum; // 客戶數加1
Random(durtime,intertime); // 生成當前客戶辦理業務的時間和下一個客戶到達的時間間隔2個隨機數
et.OccurTime=en.OccurTime+intertime; // 下一客戶et到達時刻=當前客戶en的到達時間+時間間隔
et.NType=Qu; // 下一客戶到達事件
if(et.OccurTime<CloseTime) // 下一客戶到達時銀行尚未關門
OrderInsert(ev,et,cmp); // 按升序將下一客戶到達事件et插入事件表ev中,在bo2-6.cpp中
f.ArrivalTime=en.OccurTime; // 將當前客戶到達事件en賦給隊列元素f
f.Duration=durtime;
EnQueue(q,f); // 將當前客戶f入隊到排隊機
i=ChuangKou(); // 求空閑窗口的序號
if(i<Qu) // 有空閑窗口
{
DeQueue(q,customer[i]); // 刪去排隊機的排頭客戶(也就是剛入隊的f由排隊機到i號窗口)
// if(j++<20) // 輸出前20個客戶到達信息及處理業務窗口信息到文件c.txt中
// fprintf(fq,"客戶到達時刻=%3d,辦理業務的時間=%2d,所在窗口=%d\n",customer[i].ArrivalTime,customer[i].Duration,i);
et.OccurTime=en.OccurTime+customer[i].Duration; // 設定一個i號窗口的離開事件et
et.NType=i; // 第i號窗口的離開事件
OrderInsert(ev,et,cmp); // 將此離開事件et按升序插入事件表ev中
chk[i]=0; // i號窗口狀態變忙
}
}
void CustomerDeparture()
{ // 處理客戶離開事件en(en.NType<Qu),與algo3-12.cpp不同
int i;
i=en.NType; // 確定離開事件en發生的窗口序號i
chk[i]=1; // i號窗口狀態變閑
TotalTime+=en.OccurTime-customer[i].ArrivalTime; // 客戶逗留時間=離開事件en的發生時刻-該客戶的到達時間
if(!QueueEmpty(q))
{ // 第i窗口的客戶離開后,排隊機仍不空
DeQueue(q,customer[i]); // 刪去排隊機的排頭客戶并將其賦給customer[i](排隊機的排頭客戶去i窗口辦理業務)
// if(j++<20) // 輸出前20個客戶到達信息及處理業務窗口信息到文件c.txt中
// fprintf(fq,"客戶到達時刻=%3d,辦理業務的時間=%2d,所在窗口=%d\n",customer[i].ArrivalTime,customer[i].Duration,i);
chk[i]=0; // i號窗口狀態變忙
et.OccurTime=en.OccurTime+customer[i].Duration; // 設定customer[i]的離開事件et,客戶的離開時間=原客戶的離開時間+當前客戶辦理業務的時間
et.NType=i; // 第i號窗口的離開事件
OrderInsert(ev,et,cmp); // 將此離開事件et按升序插入事件表ev中
}
}
void main()
{
//fq=fopen("c.txt","w"); // 打開c.txt文件,用于寫入客戶到達信息
//fp=fopen("d.txt","w"); // 打開d.txt文件,用于寫入有序事件表的歷史記錄
printf("請輸入銀行營業時間長度(單位:分): ");
scanf("%d",&CloseTime);
//srand(time(0)); // 設置隨機數種子,以使每次運行程序產生的隨機數不同(time(0)是長整型數,與調用時間有關)
Bank_Simulation();
//fclose(fq); // 關閉c.txt
//fclose(fp); // 關閉d.txt
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -