?? algo3-12.c
字號(hào):
/* algo3-12.c 銀行業(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<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */
#include<process.h> /* exit() */
/* 函數(shù)結(jié)果狀態(tài)代碼 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因?yàn)樵趍ath.h中已定義OVERFLOW的值為3,故去掉此行 */
typedef int Status; /* Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等 */
typedef int Boolean; /* Boolean是布爾類型,其值是TRUE或FALSE */
typedef struct /* 定義ElemType為結(jié)構(gòu)體類型 */
{
int OccurTime; /* 事件發(fā)生時(shí)刻 */
int custmorid;//客戶ID
int NType; /* 事件類型,Qu表示到達(dá)事件,0至Qu-1表示Qu個(gè)窗口的離開事件 */
}Event,ElemType; /* 事件類型,有序鏈表LinkList的數(shù)據(jù)元素類型 */
typedef struct LNode /* 結(jié)點(diǎn)類型 */
{
ElemType data;
struct LNode *next;
}LNode,*Link,*Position;
typedef struct LinkList /* 鏈表類型 */
{
Link head,tail; /* 分別指向線性鏈表中的頭結(jié)點(diǎn)和最后一個(gè)結(jié)點(diǎn) */
int len; /* 指示線性鏈表中數(shù)據(jù)元素的個(gè)數(shù) */
}LinkList;
typedef LinkList EventList; /* 事件鏈表類型,定義為有序鏈表 */
#include"bo2-6.c" /* 使用已有的鏈表基本操作 */
typedef struct
{
int ArrivalTime; /* 到達(dá)時(shí)刻 */
int custmorid;//客戶ID
int Duration; /* 辦理事務(wù)所需時(shí)間 */
}QElemType; /* 定義QElemType(隊(duì)列的數(shù)據(jù)元素類型)為結(jié)構(gòu)體類型; */
#include"c3-2.h"
#include"bo3-2.c" /* 使用已有的隊(duì)列基本操作 */
/* 程序中用到的主要變量(全局)。算法3.7 */
EventList ev; /* 事件表 */
Event en; /* 事件 */
Event et; /* 臨時(shí)變量 */
LinkQueue q[Qu]; /* Qu個(gè)客戶隊(duì)列 */
QElemType customer; /* 客戶記錄 */
int TotalTime=0,CustomerNum=0; /* 累計(jì)客戶逗留時(shí)間,客戶數(shù)(初值為0) */
int CloseTime; /* 銀行營(yíng)業(yè)時(shí)間(單位是分) */
int cmp(Event a,Event b)
{ /* 依事件a的發(fā)生時(shí)刻<、=或>事件b的發(fā)生時(shí)刻分別返回-1、0或1 */
if(a.OccurTime==b.OccurTime)
return 0;
else
return (a.OccurTime-b.OccurTime)/abs(a.OccurTime-b.OccurTime);
}
void OpenForDay()
{ /* 初始化操作 */
int i;
InitList(&ev); /* 初始化事件鏈表為空 */
en.OccurTime=0; /* 設(shè)定第一個(gè)客戶到達(dá)事件 */
en.custmorid=CustomerNum+1;
en.NType=Qu; /* 到達(dá) */
OrderInsert(&ev,en,cmp); /* 插入事件表 */
for(i=0;i<Qu;++i) /* 置空隊(duì)列 */
InitQueue(&q[i]);
}
void Random(int *d,int *i)
{
*d=rand()%Blsj+1; /* 1到Blsj之間的隨機(jī)數(shù) */
*i=rand()%Khjg+1; /* 1到Khjg之間的隨機(jī)數(shù) */
}
int Minimum(LinkQueue Q[]) /* 返回最短隊(duì)列的序號(hào) */
{
int l[Qu];
int i,k;
for(i=0;i<Qu;i++)
l[i]=QueueLength(Q[i]);
k=0;
for(i=1;i<Qu;i++)
if(l[i]<l[0])
{
l[0]=l[i];
k=i;
}
return k;
}
void CustomerArrived()
{ /* 處理客戶到達(dá)事件,en.NType=Qu */
QElemType f;
int durtime,intertime,i;
++CustomerNum;
Random(&durtime,&intertime); /* 生成隨機(jī)數(shù) */
et.OccurTime=en.OccurTime+intertime; /* 下一客戶到達(dá)時(shí)刻 */
et.custmorid=CustomerNum+1;
et.NType=Qu; /* 隊(duì)列中只有一個(gè)客戶到達(dá)事件 */
if(et.OccurTime<CloseTime) /* 銀行尚未關(guān)門,插入事件表 */
OrderInsert(&ev,et,cmp);
i=Minimum(q); /* 求長(zhǎng)度最短隊(duì)列的序號(hào),等長(zhǎng)為最小的序號(hào) */
f.ArrivalTime=en.OccurTime;
f.custmorid=CustomerNum;
f.Duration=durtime;
printf("客戶%d在時(shí)間%d到達(dá)\n",f.custmorid,en.OccurTime);
EnQueue(&q[i],f);
if(QueueLength(q[i])==1)
{
GetHead_Q(q[i],&customer);
et.OccurTime=en.OccurTime+durtime;
et.custmorid=customer.custmorid;//有誤
et.NType=i;
OrderInsert(&ev,et,cmp); /* 設(shè)定第i隊(duì)列的一個(gè)離開事件并插入事件表 */
}
}
void CustomerDeparture()
{ /* 處理客戶離開事件,en.NTyPe<Qu */
int i;
i=en.NType;
DeQueue(&q[i],&customer); /* 刪除第i隊(duì)列的排頭客戶 */
printf("客戶%d在時(shí)間%d離開\n",customer.custmorid,en.OccurTime);
TotalTime+=en.OccurTime-customer.ArrivalTime; /* 累計(jì)客戶逗留時(shí)間 */
if(!QueueEmpty(q[i]))
{ /* 設(shè)定第i隊(duì)列的一個(gè)離開事件并插入事件表 */
GetHead_Q(q[i],&customer);
et.OccurTime=en.OccurTime+customer.Duration;
et.custmorid=customer.custmorid;
et.NType=i;
OrderInsert(&ev,et,cmp);
}
}
void Bank_Simulation()
{
Link p;
OpenForDay(); /* 初始化 */
while(!ListEmpty(ev))
{
DelFirst(&ev,GetHead(ev),&p);
en.OccurTime=GetCurElem(p).OccurTime;
en.custmorid==GetCurElem(p). custmorid;
en.NType=GetCurElem(p).NType;
if(en.NType==Qu)
{
CustomerArrived(); /* 處理客戶到達(dá)事件 */
}
else
{
CustomerDeparture(); /* 處理客戶離開事件 */
}
} /* 計(jì)算并輸出平均逗留時(shí)間 */
printf("顧客總數(shù):%d, 所有顧客共耗時(shí):%d分鐘, 平均每人耗時(shí): %d分鐘\n",CustomerNum,TotalTime,TotalTime/CustomerNum);
}
void main()
{
printf("請(qǐng)輸入銀行營(yíng)業(yè)時(shí)間長(zhǎng)度(單位:分)\n");
scanf("%d",&CloseTime);
Bank_Simulation();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -