?? algo3-12.cpp
字號(hào):
// algo3-12.cpp 銀行業(yè)務(wù)模擬。實(shí)現(xiàn)算法3.6、3.7的程序
#define Qu 4 // 客戶隊(duì)列數(shù)
#define Khjg 5 // 兩相鄰到達(dá)的客戶的時(shí)間間隔最大值
#define Blsj 30 // 每個(gè)客戶辦理業(yè)務(wù)的時(shí)間最大值
#include"func3-3.cpp" // 包含algo3-12.cpp和algo3-13.cpp共同用到的函數(shù)和變量等
LinkQueue q[Qu]; // Qu個(gè)客戶隊(duì)列
QElemType customer; // 客戶記錄,臨時(shí)變量
//FILE *fq; // 文件型指針,用于指向a.txt文件
void OpenForDay()
{ // 初始化事件鏈表ev且插入第1個(gè)到達(dá)事件,初始化Qu個(gè)隊(duì)列
int i;
InitList(ev); // 初始化事件鏈表ev為空
en.OccurTime=0; // 設(shè)定第1位客戶到達(dá)時(shí)間為0(銀行一開門,就有客戶來)
//fprintf(fq,"首位客戶到達(dá)時(shí)刻=%3d,",en.OccurTime);
en.NType=Qu; // 到達(dá)
OrderInsert(ev,en,cmp); // 將第1個(gè)到達(dá)事件en有序插入事件表ev中,在bo2-6.cpp中
for(i=0;i<Qu;++i) // 初始化Qu個(gè)隊(duì)列
InitQueue(q[i]);
}
int Minimum(LinkQueue Q[])
{ // 返回最短隊(duì)列的序號(hào),若有并列值,返回隊(duì)列序號(hào)最小的
int l[Qu];
int i,k=0;
for(i=0;i<Qu;i++)
l[i]=QueueLength(Q[i]);
for(i=1;i<Qu;i++)
if(l[i]<l[0])
{
l[0]=l[i];
k=i;
}
return k;
}
void CustomerArrived()
{ // 處理客戶到達(dá)事件en(en.NType=Qu)
QElemType f;
int durtime,intertime,i;
++CustomerNum; // 客戶數(shù)加1
Random(durtime,intertime); // 生成當(dāng)前客戶辦理業(yè)務(wù)的時(shí)間和下一個(gè)客戶到達(dá)的時(shí)間間隔2個(gè)隨機(jī)數(shù)
et.OccurTime=en.OccurTime+intertime; // 下一客戶et到達(dá)時(shí)刻=當(dāng)前客戶en的到達(dá)時(shí)間+時(shí)間間隔
et.NType=Qu; // 下一客戶到達(dá)事件
i=Minimum(q); // 求長(zhǎng)度最短隊(duì)列的序號(hào),等長(zhǎng)為最小的序號(hào)(到達(dá)事件將入該隊(duì))
//if(CustomerNum<=20) // 輸出前20個(gè)客戶到達(dá)信息到文件a.txt中
// fprintf(fq,"辦理業(yè)務(wù)的時(shí)間=%2d,所排隊(duì)列=%d\n下一客戶到達(dá)時(shí)刻=%3d,",durtime,i,et.OccurTime);
if(et.OccurTime<CloseTime) // 下一客戶到達(dá)時(shí)銀行尚未關(guān)門
OrderInsert(ev,et,cmp); // 按升序?qū)⑾乱豢蛻舻竭_(dá)事件et插入事件表ev中,在bo2-6.cpp中
f.ArrivalTime=en.OccurTime; // 將當(dāng)前客戶到達(dá)事件en賦給隊(duì)列元素f
f.Duration=durtime;
EnQueue(q[i],f); // 將f入隊(duì)到第i隊(duì)列(i=0~Qu-1)
if(QueueLength(q[i])==1) // 該元素為隊(duì)頭元素
{
et.OccurTime=en.OccurTime+durtime; // 設(shè)定一個(gè)離開事件et
et.NType=i;
OrderInsert(ev,et,cmp); // 將此離開事件et按升序插入事件表ev中
}
}
void CustomerDeparture()
{ // 處理客戶離開事件en(en.NType<Qu)
int i;
i=en.NType; // 確定離開事件en發(fā)生的隊(duì)列序號(hào)i
DeQueue(q[i],customer); // 刪除第i隊(duì)列的排頭客戶
TotalTime+=en.OccurTime-customer.ArrivalTime; // 客戶逗留時(shí)間=離開事件en的發(fā)生時(shí)刻-該客戶的到達(dá)時(shí)間
if(!QueueEmpty(q[i]))
{ // 刪除第i隊(duì)列的排頭客戶后,第i隊(duì)列仍不空
GetHead(q[i],customer); // 將第i隊(duì)列新的排頭客戶賦給customer
et.OccurTime=en.OccurTime+customer.Duration; // 設(shè)定離開事件et,新排頭的離開時(shí)間=原排頭的離開時(shí)間+新排頭辦理業(yè)務(wù)的時(shí)間
et.NType=i; // 第i個(gè)隊(duì)列的離開事件
OrderInsert(ev,et,cmp); // 將此離開事件et按升序插入事件表ev中
}
}
void main()
{
//fq=fopen("a.txt","w"); // 打開a.txt文件,用于寫入客戶到達(dá)信息
//fp=fopen("b.txt","w"); // 打開b.txt文件,用于寫入有序事件表的歷史記錄
printf("請(qǐng)輸入銀行營(yíng)業(yè)時(shí)間長(zhǎng)度(單位:分): ");
scanf("%d",&CloseTime);
//srand(time(0)); // 設(shè)置隨機(jī)數(shù)種子,以使每次運(yùn)行程序產(chǎn)生的隨機(jī)數(shù)不同(time(0)是長(zhǎng)整型數(shù),與調(diào)用時(shí)間有關(guān))
Bank_Simulation();
//fclose(fq); // 關(guān)閉a.txt
//fclose(fp); // 關(guān)閉b.txt
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -