救护车调度模拟系统课程设计报告_救护车课程设计报告
救护车调度模拟系统课程设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“救护车课程设计报告”。
数据结构课程设计
说 明 书
学 院: 信息科学与工程学院 班 级: 计算机11-3
完 成 人:
姓 名: 徐海杰
学 号: 201101050323 姓 名: 薛德利 学 号: 201101050324 指导教师:
山 东 科 技 大 学
2010年××月××日
实验题目
救护车调度模拟系统
需求分析
1.问题描述
设计实现一个用事件驱动的“救护车调度”离散模型,模拟120急救中心响应每个 病人的呼救信号统一调度救护车运行的情况。
我们对问题作适当简化,假设:某城市共有m个可能的呼救点(居民小区、工厂、学校、公司、机关、单位等),分布着n所医院(包含在m个点中),有k辆救护车分派在各医 院待命,出现呼救病人时,由急救中心统一指派救护车接送至最近的医院救治。救护车 完成一次接送任务后即消毒,并回原处继续待命。假定呼救者与急救中心、急救中心与 救护车之间的通讯畅通无阻,也不考虑道路交通堵塞的影响。可以用m个顶点的无向 网来表示该城市的各地点和道路。时间可以分钟为单位,路段长可表示为救护车行驶化 费的分钟数。
2.要求
模拟每一起病人呼救—派车往救—接人回院的过程:显示每辆救护车的状态(待命、往救、送院{可能还有返点})和每个病人的状态(待派车、待接、送院途中),显示各医院 的待命救护车队列,实时显示当前的病人平均接送时间和平均派车延迟时间以及已送达 病人数。救护车应按最快的路线接送病人。
呼救事件发生的间隔时间和地点都是随机的(其发生频度先给一个省缺值,可实时 调整)。点数m、点名、路段数e和每段长度以及医院点的名称都由教师以文本文件形 式给出,格式为:
m n e
ABCDEFGH… …
(m个点名称,大小写代表不同点)
AEGHK… …
(n个医院名称)
AB11,AC15,EG9, … … FK24,(e条路段及长度)
救护车总数及分派方案在运行前从键盘输入。
3.提示
可以设3种事件:病人呼救,救护车到病人家,救护车到医院。一个事件队列,一 个呼救等待队列,n个救护车待命队列。
初始化时设置第一个病人呼救事件插入事件队列,以启动系统运行。处理病人呼救 事件时,将这个呼救排入呼救等待队列,同时产生下一个病人呼救事件。
无向网可用邻接多重表。求出每个医院到其他各点的最短路径,每个点设一个由近 到远的医院列表。
参考教科书中第3章第5节:离散事件模拟。
设计说明
#include #include #include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define OVERFLOW_-2 #define INFINITY_ 9999 #define MAX_VERTEX_NUM 52 #define Status int #define VertexType int //定点类型
//**********************定义结构体**********************// typedef struct
//医院 {
char hospital_name;
int hospital_Num;} hospital_stc;hospital_stc hospitals[10];
typedef struct
//呼救 {
int Num;
int name;} Call_stc;Call_stc call_vex[52];
typedef struct
//呼救地点与医院距离矩阵 {
int distance;
int Num;
int name;} Call_Hos_stc;Call_Hos_stc Hos_Call_matrix[10][52];Call_Hos_stc Call_Hos_matrix[52][10];typedef struct
// 地点 {
char vex_name;
int vex_Num;} Node_stc;Node_stc vertices[52];
typedef struct
//路段 {
char v1_name;
char v2_name;
int v1_Num;
int v2_Num;
int distance_v12;} section_Node;section_Node sections[90];
typedef struct ArcCell
//路径矩阵 {
int adj;
int w;} ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;} MGraph;MGraph G;
typedef struct ambulance //救护车 {
int Num;
int NowStatus;
char termini_name;
int wait_time;} CHE;
typedef struct QNode {
CHE che;
struct QNode *next;} QNode,*QueuePtr;
typedef struct
//救护车队列 {
QueuePtr front;
QueuePtr rear;} LinkQueue;LinkQueue AmbuQueue[10];
typedef struct event
//事件 {
int AidNo;
int CallTime;
int DealTime;
int EventType;
char OccurName;
int Occur_GNum;
int interval;
int Hos_Num;
int Che_Num;
struct event *next;} EVENT;EVENT *EventList;EVENT *CallWaitList;
//**********************定义变量**********************// int short_path_matrix[99][99];//最短路径矩阵
int VexNum,HosNum,ArcNum,CheNum,Call_VexNum;
// 地点数,医院数,路段数,救护车数,呼救地点数; int num[20];int nearest_Hos[99];// 最近医院 int freqMOD=0,delayMOD=500;int AidEvent_Num=0;int EndTime=999;// 结束时间 int CurrentTime;
// 当前时间
int ServicedNum;
//已送达病人数
int TotalDelayTime,TotalWaitTime,TotalDealTime,road_length;//总延迟,等待,处理事件,路段长度
float DelayAverage,WaitAverage,DealAverage;//平均延迟,等待,处理
//**********************定义函数**********************// void start();void ready();int GName_GNum(MGraph,char);
void readfile();//读文件函数
void CreateGraph(MGraph *);// 创建矩阵 void arrange_ambulances();// 安排救护车
void InitAmbu();// 初始化救护车队列 Status InitQueue(LinkQueue *);// 初始化 Status EnQueue(LinkQueue *,CHE);// 进队 Status DeQueue(LinkQueue *);// 出队 CHE GetAmbu(LinkQueue);Status IsEmptyQueue(LinkQueue);//判断队列是否为空 Status Display_Queue(LinkQueue);// 显示队列
EVENT * InsertEvent(EVENT *,EVENT);// 插入事件队列 EVENT * DeleteEvent(EVENT *);// 删除事件 EVENT GetEvent(EVENT *);// 获取事件
void Event_Call();
// 事件函数 void Event_ArriveHome();void Event_ArriveHos();
void Display_WaitingAmbu();
// 显示函数 void Display_Patient_Status(EVENT *,EVENT *);void Display_Ambulance_Status(EVENT *);void Display_All();
int main()
//主函数 {
system(“cls”);
// 清屏
loop:
printf(“请输入结束时间(h
scanf(”%d“,&EndTime);
if(EndTime>999)
{
printf(”无效输入,请再次输入!n“);
goto loop;
}
ready();
InitAmbu();
start();} void ready(){
int l,k,i,j,not_hos,temp;
int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],D[MAX_VERTEX_NUM];
system(”cls“);
readfile();
//读文件
arrange_ambulances();
//安排救护车
CreateGraph(&G);
//创建矩阵
G.vexnum=VexNum;
G.arcnum=ArcNum;
for(k=0;k
//最短路径
{
Short_Path(G,k,P,D);
for(i=0;i
{
short_path_matrix[k][i]=D[i];
}
}
printf(”nPre any key to continue...n“);
getch();
system(”cls“);
for(i=0,k=0;i
// 筛选出呼救地点和医院地点
{
not_hos=0;
for(j=0;j
{
if(i!=hospitals[j].hospital_Num)not_hos++;
else break;
}
if(not_hos==HosNum)
{
call_vex[k].Num=i;
call_vex[k].name=vertices[call_vex[k].Num].vex_name;
k++;
}
}
for(i=0;i
// 医院距离呼救地点距离
{
for(j=0,l=0;j
{
not_hos=0;
for(k=0;k
{
if(j!=hospitals[k].hospital_Num)not_hos++;
else break;
}
if(not_hos==HosNum)
{
Hos_Call_matrix[i][l].distance=short_path_matrix[hospitals[i].hospital_Num][j];
Hos_Call_matrix[i][l].name=call_vex[l].name;
Hos_Call_matrix[i][l].Num=call_vex[l].Num;
l++;
}
}
}
for(i=0;i
//呼救地点距离医院的距离
{
for(j=0;j
{
Call_Hos_matrix[i][j].distance=Hos_Call_matrix[j][i].distance;
Call_Hos_matrix[i][j].name
=hospitals[j].hospital_name;
Call_Hos_matrix[i][j].Num
=hospitals[j].hospital_Num;
}
}
for(k=0;k
//按距离排序
{
for(i=1;i
for(j=0;j
{
if(Call_Hos_matrix[k][j].distance>Call_Hos_matrix[k][j+1].distance)
{
temp=Call_Hos_matrix[k][j].distance;
Call_Hos_matrix[k][j].distance=Call_Hos_matrix[k][j+1].distance;
Call_Hos_matrix[k][j+1].distance=temp;
temp=Call_Hos_matrix[k][j].Num;
Call_Hos_matrix[k][j].Num=Call_Hos_matrix[k][j+1].Num;
Call_Hos_matrix[k][j+1].Num=temp;
temp=Call_Hos_matrix[k][j].name;
Call_Hos_matrix[k][j].name=Call_Hos_matrix[k][j+1].name;
Call_Hos_matrix[k][j+1].name=temp;
}
}
} }
void InitAmbu()
//救护车初始化 {
int i,j,counter=0;
CHE che;
for(i=0;i
{
InitQueue(&AmbuQueue[i]);
for(j=0;j
{
che.wait_time=-1;
che.NowStatus=0;
che.termini_name=' ';
che.Num=counter++;
EnQueue(&AmbuQueue[i],che);
}
} }
void start(){
EVENT hold;
int rand_num,key_num;
srand((unsigned)time(NULL));//初始化随机函数种子
rand_num=rand()%(G.vexnum-HosNum);// 随机产生病人
srand((unsigned)time(NULL));
hold.DealTime=rand()%10;
hold.OccurName=call_vex[rand_num].name;
hold.Occur_GNum=call_vex[rand_num].Num;
hold.AidNo=0;
hold.EventType=0;
hold.interval=-1;
hold.Che_Num=-1;
hold.Hos_Num=-1;
EventList=InsertEvent(EventList,hold);
for(CurrentTime=0;CurrentTime
{
while(CurrentTime==GetEvent(EventList).DealTime)
{
switch(GetEvent(EventList).EventType)
{
case 0:
Event_Call();
break;
case 1:
Event_ArriveHome();
break;
case 2:
Event_ArriveHos();
break;
}
}
if(!kbhit())
{
Ambu_WaitTime();
Display_All();
Sleep((long)(2*delayMOD));
CurrentTime++;
}
else
switch(getch())
{
case 'd':
if(delayMOD==0);
else delayMOD--;
break;
case 'a':
if(delayMOD==1000);
else delayMOD++;
break;
case 27:
exit(0);
case 's':
if(freqMOD==0);
else freqMOD--;
break;
case 'w':
if(freqMOD==100);
else freqMOD++;
break;
}
} }
//********************** ready有关 函数 **********************// void readfile()//读文件 {
FILE * fp;
int i,j;
char ch,* ch_p1,* ch_p2;
char str[8]=” “;
system(”cls“);
if((fp=fopen(”D:data.txt“,”r“))==NULL)
{
printf(”cannot open filen“);
exit(0);
}
for(i=0;i
i=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch
else break;
}
VexNum=atoi(str);
//atoi:转化成长整数型
printf(”给定的地点数是 %dn“,VexNum);
for(i=0;i
i=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch
else break;
}
HosNum=atoi(str);
printf(”给定的医院数是 %dn“,HosNum);
Call_VexNum=VexNum-HosNum;
for(i=0;i
i=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch
else break;
}
ArcNum=atoi(str);
printf(”给定的路段数是 %dn“,ArcNum);
printf(”地点: “);
for(i=0;i
{
ch=getc(fp);
vertices[i].vex_name=ch;
vertices[i].vex_Num=i;
printf(”%c “,vertices[i].vex_name);
}
ch=getc(fp);
printf(”n“);
printf(”医院: “);
for(i=0;i
{
ch=getc(fp);
hospitals[i].hospital_name=ch;
for(j=0;j
if(vertices[j].vex_name==hospitals[i].hospital_name)
{
hospitals[i].hospital_Num=vertices[j].vex_Num;
break;
}
printf(”%c “,hospitals[i].hospital_name);
}
ch=getc(fp);
printf(”n“);
printf(”路段: “);
for(i=0;i
{
sections[i].v1_name=getc(fp);
for(j=0;j
if(vertices[j].vex_name==sections[i].v1_name)
{
sections[i].v1_Num=vertices[j].vex_Num;
break;
}
putchar(sections[i].v1_name);
sections[i].v2_name=getc(fp);
for(j=0;j
if(vertices[j].vex_name==sections[i].v2_name)
{
sections[i].v2_Num=vertices[j].vex_Num;
break;
}
putchar(sections[i].v2_name);
for(j=0;j
j=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch
else break;
}
sections[i].distance_v12=atoi(str);
printf(”:%d “,sections[i].distance_v12);
} }
void arrange_ambulances()//安排救护车 {
int i,left;
loop1:
printf(”nn请输入所有医院救护车总数量: “);
scanf(”%d“,&CheNum);
if(CheNum
{
printf(”无效输入,请再次输入!n“);
goto loop1;
}
for(i=0,left=CheNum;i
{
loop2:
printf(”请输入
%c 医院的救护车数量: “,hospitals[i].hospital_name);
scanf(”%d“,&num[i]);
left=left-num[i];
if(left
{
printf(”无效输入,请重新开始!n“);
goto loop2;
}
}
printf(”n“);}
void CreateGraph(MGraph *g)//创建矩阵 {
int i,j,k;
g->vexnum=VexNum;
g->arcnum=ArcNum;
for(i=0;ivexnum-1;i++)
g->vexs[i]=vertices[i].vex_Num;
for(i=0;ivexnum-1;i++)
for(j=0;jvexnum-1;j++)
{
g->arcs[i][j].adj=0;
g->arcs[i][j].w=INFINITY_;
}
for(k=0;karcnum-1;k++)
{
i=sections[k].v1_Num;
j=sections[k].v2_Num;
g->arcs[i][j].adj=1;
g->arcs[j][i].adj=g->arcs[i][j].adj;
g->arcs[i][j].w=sections[k].distance_v12;
g->arcs[j][i].w=g->arcs[i][j].w;
} }
Status Short_Path(MGraph G,int v0,int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int D[MAX_VERTEX_NUM]){
//最短路径
int v,w,i,j,min;
int final[MAX_VERTEX_NUM];
for(v=0;v
{
final[v]=FALSE;
D[v]=G.arcs[v0][v].w;
for(w=0;w
P[v][w]=FALSE;
if(D[v]
{
P[v][v0]=TRUE;
P[v][v]=TRUE;
}
}
D[v0]=0;
final[v0]=TRUE;
for(i=1;i
{
min=INFINITY_;
for(w=0;w
if(!final[w])
if(D[w]
{
v=w;
min=D[w];
}
final[v]=TRUE;
for(w=0;w
if(!final[w]&&(min+G.arcs[v][w].w
{
D[w]=min+G.arcs[v][w].w;
for(j=0;j
P[w][j]=P[v][j];
P[w][w]=TRUE;
}
} }
//********************** InitAmbu有关 函数 **********************// Status InitQueue(LinkQueue *Q){
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front)exit(OVERFLOW_);
(*Q).front->next=NULL;
return OK;}
Status EnQueue(LinkQueue *Q,CHE e){
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
{
printf(”Full!“);
exit(-2);
}
p->che=e;
p->che.NowStatus =e.NowStatus;
p->che.termini_name=e.termini_name;
p->che.Num=e.Num;
p->next=NULL;
(*Q).rear->next=p;
(*Q).rear=p;
return OK;}
Status Display_Queue(LinkQueue Q){
QueuePtr p;
if(Q.front==Q.rear)
{
printf(” /“);
}
else
{
p=Q.front->next;
while(p)
{
printf(”%2d “,p->che.Num);
p=p->next;
}
}
return OK;}
//********************** start有关 函数 **********************// EVENT * InsertEvent(EVENT * h,EVENT e){
EVENT *s,*p,*q;
p=h;
s=(EVENT *)malloc(sizeof(EVENT));
s->CallTime=e.CallTime;
s->AidNo=e.AidNo;
s->DealTime=e.DealTime;
s->OccurName=e.OccurName;
s->Occur_GNum=e.Occur_GNum;
s->EventType=e.EventType;
s->interval=e.interval;
s->Hos_Num=e.Hos_Num;
s->Che_Num=e.Che_Num;
if(h==NULL)
{
h=s;
s->next=NULL;
}
else
{
while((s->DealTime>p->DealTime)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(s->DealTimeDealTime)
{
if(h==p)h=s;
else q->next=s;
s->next=p;
}
else
{
p->next=s;
s->next=NULL;
}
}
return h;}
EVENT GetEvent(EVENT * h){
EVENT hold;
hold.CallTime=h->CallTime;
hold.AidNo=h->AidNo;
hold.DealTime=h->DealTime;
hold.OccurName=h->OccurName;
hold.Occur_GNum=h->Occur_GNum;
hold.EventType=h->EventType;
hold.interval=h->interval;
hold.Che_Num=h->Che_Num;
hold.Hos_Num=h->Hos_Num;
hold=*h;
return hold;}
void Event_Call(){
EVENT hold;
int rand_num,interval,OkHos_i,call_GNo;
char call_name;
CHE hold_che;
hold=GetEvent(EventList);
CallWaitList=InsertEvent(CallWaitList,hold);
EventList=DeleteEvent(EventList);
OkHos_i=SearchHos(GName_GNum(G,hold.OccurName));
srand((unsigned)time(NULL));
interval=5+rand()%(60/(freqMOD/5+1));
srand((unsigned)time(NULL));
rand_num=rand()%(G.vexnum-HosNum);
call_GNo=call_vex[rand_num].Num;
call_name=call_vex[rand_num].name;
hold.DealTime= CurrentTime+interval;
hold.AidNo=AidEvent_Num++;
hold.Occur_GNum=call_GNo;
hold.OccurName=call_name;
hold.EventType=0;
hold.interval=-1;
hold.Hos_Num=-1;
hold.Che_Num=-1;
EventList=InsertEvent(EventList,hold);
if(OkHos_i!=-1)
{
hold=GetEvent(CallWaitList);
hold_che=GetAmbu(AmbuQueue[OkHos_i]);
hold.Che_Num=hold_che.Num;
hold.Hos_Num=OkHos_i;
hold.DealTime=CurrentTime+Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance;
hold.EventType=1;
hold.interval=Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance;
EventList=InsertEvent(EventList,hold);
CallWaitList=DeleteEvent(CallWaitList);
DeQueue(&AmbuQueue[OkHos_i]);
}
else hold.CallTime=CurrentTime;}
void Event_ArriveHome(){
EVENT hold;
hold=GetEvent(EventList);
EventList=DeleteEvent(EventList);
hold.DealTime=CurrentTime+hold.interval;
hold.EventType=2;
EventList=InsertEvent(EventList,hold);
road_length=2*hold.interval;}
void Event_ArriveHos(){
CHE che,hold_che;
EVENT hold;
int interval,OkHos_i;
hold=GetEvent(EventList);
EventList=DeleteEvent(EventList);
che.Num=hold.Che_Num;
che.NowStatus=0;
EnQueue(&AmbuQueue[hold.Hos_Num],che);
ServicedNum++;
TotalDealTime+=TotalDelayTime+road_length;
DealAverage=(float)TotalDealTime/ServicedNum;
if(CallWaitList!=NULL)
{
hold=GetEvent(CallWaitList);
TotalDelayTime+=(CurrentTime-hold.DealTime);
DelayAverage=(float)TotalDelayTime/ServicedNum;
OkHos_i=SearchHos(GName_GNum(G,hold.OccurName));
if(OkHos_i!=-1)
{
hold.Hos_Num=OkHos_i;
hold_che=GetAmbu(AmbuQueue[OkHos_i]);
hold.Che_Num=hold_che.Num;
hold.DealTime= CurrentTime+hold.interval;
hold.DealTime=CurrentTime+Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance;
hold.EventType=1;
hold.interval=Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance;
EventList=InsertEvent(EventList,hold);
CallWaitList=DeleteEvent(CallWaitList);
DeQueue(&AmbuQueue[OkHos_i]);
}
} }
int Ambu_WaitTime(void){
int i;
QueuePtr p;
for(i=0;i
{
if(AmbuQueue[i].front==AmbuQueue[i].rear);
else
{
p=(AmbuQueue[i].front)->next;
while(p)
{
TotalWaitTime++;
p=p->next;
}
}
} }
void Display_All(){
system(”cls“);
printf(”n“);
printf(”n“);
printf(”ttt当前时间:%4dn“,CurrentTime);
printf(”n“);
printf(” 已送达病人数:%4dn“,ServicedNum);
printf(”n“);
printf(” 平均延迟:% 5.1f
“,DelayAverage);
printf(”平均处理:% 5.1f
“,DealAverage);
printf(”平均等待:% 5.1fn“,WaitAverage=(float)TotalWaitTime/CheNum-1);
printf(”n“);
Display_Patient_Status(CallWaitList,EventList);
Display_Ambulance_Status(EventList);
Display_WaitingAmbu();
printf(”n %c/%c:Frequence:%3d“,'W','S',freqMOD);
printf(”
%c/%c:Delay:%3d“,'A','D',delayMOD);
printf(”
ESC:quit“);}
EVENT * DeleteEvent(EVENT * h){
if(h!=NULL)h=h->next;
return h;}
int GName_GNum(MGraph g,char ch){
int i;
for(i=0;i
if(ch==vertices[i].vex_name)break;
return i;}
int SearchHos(int call_NoinG){
int call_No,i,j,k;
call_No=GNo_CallNo(call_NoinG);
for(i=0;i
{
for(j=0;j
{
if(Call_Hos_matrix[call_No][i].Num==hospitals[j].hospital_Num)k=j;
}
if(!IsEmptyQueue(AmbuQueue[k]))return k;
}
return-1;}
CHE GetAmbu(LinkQueue Q){
return Q.front->next->che;}
int GNo_CallNo(int g_No){
int i;
for(i=0;i
if(g_No==call_vex[i].Num)return i;}
int Hos_i_matrix(int call_GNo,int Hos_i){
int i,call_No;
call_No=GNo_CallNo(call_GNo);
for(i=0;i
if(Call_Hos_matrix[call_No][i].Num==hospitals[Hos_i].hospital_Num)}
Status DeQueue(LinkQueue *Q){
QueuePtr p;
if((*Q).front==(*Q).rear);
else
{
p=(*Q).front->next;
(*Q).front->next=p->next;
if((*Q).rear==p)(*Q).rear=(*Q).front;
free(p);
}
return OK;}
Status IsEmptyQueue(LinkQueue Q){
return(Q.front==Q.rear)? TRUE : FALSE;}
void Display_Patient_Status(EVENT *h1,EVENT *h2){
EVENT *p;
printf(”n“);
printf(” 病人的状态: “);
p=h1;
if(h1!=NULL)
{
return i;
while(p)
{
printf(” %d“,p->AidNo);
printf(”:待派车 “);
p=p->next;
}
}
p=h2;
if(h2!=NULL)
{
while(p)
{
printf(” %d“,p->AidNo);
switch(p->EventType)
{
case 0:
printf(”b “);
break;
case 1:
printf(”:待接中 “);
break;
case 2:
printf(”:送院中 “);
break;
}
p=p->next;
}
printf(”n“);
} }
void Display_Ambulance_Status(EVENT *h){
int i;
EVENT *p;
printf(”n“);
printf(”n“);
printf(” 救护车状态: “);
p=h;
if(h!=NULL)
{
while(p)
{
switch(p->EventType)
{
case 1:
printf(” %2d“,p->Che_Num);
printf(”:往救中 “);
break;
case 2:
printf(” %2d“,p->Che_Num);
printf(”:送院中 “);
break;
}
p=p->next;
}
}
printf(”n“);}
void Display_WaitingAmbu(void){
int i;
printf(”n“);
for(i=0;i
{
printf(” %c “,hospitals[i].hospital_name);
printf(”医院待命救护车: “);
Display_Queue(AmbuQueue[i]);
printf(”n");
} } 函数调用
Main()主函数调用ready()InitAmbu()start()函数;
Ready()函数调用 readfile()arrange_ambulances()CreateGraph()Short_Path()函数;
InitAmbu()函数调用 InitQueue()EnQueue()Display_Queue()函数;
Start()函数调用 InsertEvent()GetEvent()Event_Call()Event_ArriveHome()Event_ArriveHos()Ambu_WaitTime()Display_All()DeleteEvent()SearchHos()GetAmbu()DeQueue()IsEmptyQueue()Display_Patient_Status()Display_Ambulance_Status()Display_WaitingAmbu()使用说明
开始运行,输入程序运行的时间。
然后屏幕会输出文件中给出的数据,并要求键盘输入安排救护车。
从文件中读出给定8个地点,其中A,E,G为医院,其余为可能发生病人呼救事件的地点。并且得到10条路段。
现假设共12辆救护车,三所医院分别为3,4,5辆救护车,分配好救护车后按任意键进入综合显示界面,界面显示“已接送病人数”,“平均延迟时间”“平均处理时间”“平均等待时间”“病人的状态”“救护车状态”“待命救护车”以及可调节时间快慢频率,延迟时间大小和ESC退出键。
程序结束,按任意键退出程序。