?? algo0307.cpp
字號:
// 程序中用到的主要變量
EventList ev; // 事件表
Event en; // 事件
LinkQueue q[5]; // 4個客戶隊(duì)列,q[0]未用
QElemType customer; // 客戶記錄
int TotalTime, CustomerNum; // 累計(jì)客戶逗留時間, 客戶數(shù)
int CloseTime;
//---------------- 算法 3.7 ------------------
int cmp(Event a, Event b) {
// 依事件a的發(fā)生時刻< 或= 或> 事件b的發(fā)生時刻分別返回-1或0或1
if (a.OccurTime < b.OccurTime) return -1;
if (a.OccurTime > b.OccurTime) return +1;
return 0;
}
void Random(int &durtime, int &intertime) { // 生成隨機(jī)數(shù)
durtime = random(2, 10);
intertime = random(10);
}
int Minimum(LinkQueue q[]) { // 求長度最短隊(duì)列
int minlen = QueueLength(q[1]);
int i = 1;
for (int j=2; j<=4; j++)
if (QueueLength(q[j]) < minlen) {
minlen = QueueLength(q[j]);
i = j;
}
return i;
}
void OpenForDay() {
// 初始化操作
TotalTime = 0; CustomerNum = 0; // 初始化累計(jì)時間和客戶數(shù)為0
InitList(ev); // 初始化事件鏈表為空表
en.OccurTime = 0; en.NType = 0; // 設(shè)定第一個客戶到達(dá)事件
OrderInsert(ev, en, cmp); // 按事件發(fā)生時刻的次序插入事件表
for (int i=1; i<=4; ++i) InitQueue(q[i]); // 置空隊(duì)列
} // OpenForDay
void CustomerArrived() {
// 處理客戶到達(dá)事件,en.NType=0
int durtime, intertime, i, t;
++CustomerNum;
printf("Customer %d arrived at %d and ", CustomerNum, en.OccurTime);
Random(durtime, intertime); // 生成隨機(jī)數(shù)
t = en.OccurTime + intertime; // 下一客戶到達(dá)時刻
if (t<CloseTime) // 銀行尚未關(guān)門,插入事件表
OrderInsert(ev, MakeElem(t, 0), cmp);
i = Minimum(q); // 求長度最短隊(duì)列
printf("enter the Queue %d\n", i);
EnQueue(q[i], MakeQElem(en.OccurTime, durtime));
if (QueueLength(q[i]) == 1) //設(shè)定第i隊(duì)列的一個離開事件并插入事件表
OrderInsert(ev, MakeElem(en.OccurTime+durtime, i), cmp);
} // CustomerArrived
void CustomerDeparture() {
// 處理客戶離開事件,en.NType>0
printf("Customer departure at %d\n", en.OccurTime);
int i = en.NType; DeQueue(q[i], customer); //刪除第i隊(duì)列的排頭客戶
TotalTime += en.OccurTime-customer.ArrivalTime; // 累計(jì)客戶逗留時間
if (!QueueEmpty(q[i])) { // 設(shè)定第i隊(duì)列的一個離開事件并插入事件表
GetHead (q[i], customer);
OrderInsert(ev, MakeElem(en.OccurTime+customer.Duration, i), cmp);
}
} // CustomerDeparture
void Bank_Simulation(int closetime) {
int i = 0;
BLink p;
CloseTime = closetime;
printf("Bank_Simulation( %d ) ----- 銀行業(yè)務(wù)模擬\n", closetime);
OpenForDay(); // 初始化
while (!ListEmpty(ev)) {
printList(ev);
if (DelFirst(GetHead(ev), p)) {
en = GetCurElem(p);
if (en.NType == 0)
CustomerArrived(); // 處理客戶到達(dá)事件
else CustomerDeparture(); // 處理客戶離開事件
}
if (++i % 9 == 0) {
printf("\n----- 按任意鍵,繼續(xù) -----");
getch();
printf("\n\n");
}
}
// 計(jì)算并輸出平均逗留時間
printf("\nThe Average Time is %f\n", (float)TotalTime/CustomerNum);
} // Bank_Simulation
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -