电梯模拟系统代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include
#include

typedef struct
{
int lc;//电梯所在楼层
int rs;//电梯中的人数,规定最大乘坐人数为12
int door;//门的状态 0关1开
}dianti;

typedef struct
{
char name[50]; //这个人的名字或序号(以示区别)
int rrsj;//一个人的容忍时间
int lc;//所在楼层
int md;//目的楼层
int biaozhi; //此标志位记录人使用电梯是否完成或者是否离去,为1表明使用过(离去),否则为0
int in; //标志位,为1时表明人在电梯中,否则为0
}man;

typedef struct Node
{
char a[1000];//事件信息
int mytime;//事件所发生的时间
struct Node *next;
}SLNode;

dianti dt;//定义一个电梯
man ren[1000];//定义人
clock_t shijian[1000];//事件
static int g=0;//记录事件的序号,方便加入到下面的事件链表中

//初始化链表
void ListInitiate(SLNode* *head)
{
if((*head = (SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
(*head)->next = NULL;

}

//将事件结点插入到事件链表中的第i个位置中去
int ListInsert(SLNode *head,int i,char a[1000],int t)
{
SLNode *p,*q;
int j;
p=head;
j=-1;
while(p->next!=NULL && jp=p->next;
j++;
}
if(j!=i-1){
printf("\n 插入位置参数错!\n");
return 0;
}
if((q=(SLNode *)malloc(sizeof(SLNode))) == NULL) exit(1);
q->mytime = t;
strcpy(q->a,a);
q->next =p->next;
p->next =q;
return 1;
}

//用按发生时间的顺序给事件排序
void LinListSort(SLNode *head)
{
SLNode *curr,*pre,*p,*q;
p=head->next;
head->next=NULL;
while(p!=NULL)
{
curr=head->next;
pre=head;
while(curr!=NULL && curr->mytime<=p->mytime){
pre=curr;
curr=curr->next;
}
q=p;
p=p->next;
q->next=pre->next;
pre->next=q;
}
}

//销毁链表
void Destroy(SLNode * *head)
{
SLNode *p,*p1;
p=*head;
while(p!=NULL){
p1=p;
p=p->next;
free(p1);
}
*head = NULL;
}

/*
电梯动作: 1.开始开门,20t,开门结束;
2.开始关门,20t,关门结束;
3.从n-1层开始移动,30t,到达第n层;
4.开始等待,有人来或者300t,等待结束;
人的动作: 1.开始等待,x<=最大容忍时间,等待结束;
2.开始进门,25t,进门结束;
3.开始出门,25t,出门结束;
*/

//电梯开门
void OPEN(SLNode *head,dianti dt,int now)
{
char a[1000]={"电梯开始开门......"},b[1000]={"开门完毕!"};
ListInsert(head,g,a,now);
g++;
ListInsert(head,g,b,now+20);
g++;
dt.door=1; //门的状态为开

}

//电梯关门
void CLOSE(SLNode *head,dianti dt,int now)
{
char a[1000]={"电梯开始关门......"},b[1000]={"关门完毕!"};
ListInsert(head,g,a,now);
g++;
ListInsert(head,g,b,now+20);
g++;
dt.door=0;

//门的状态为关

}

//人进电梯
void GET_IN(SLNode *head,dianti dt,int now)
{
char a[1000]={"人开始进门......"},b[1000]={"已经进入!"};
ListInsert(head,g,a,now);
g++;
ListInsert(head,g,b,now+25);
g++;
dt.rs++; //电梯人数加一个
}

//人出电梯
void GET_OUT(SLNode *head,dianti dt,int now)
{
char a[1000]={"人开始出门......"},b[1000]={"已经出门!"};
ListInsert(head,g,a,now);
g++;
ListInsert(head,g,b,now+25);
g++;
dt.rs--; //电梯中的人数减一个
}

//返回最新事件(即事件涟表最后一个结点)的发生时间
int gettime(SLNode *head)
{
SLNode *pre,*curr;
curr=head->next;
pre=head;
while(curr!=NULL){
pre=curr;
curr=curr->next;
}
return pre->mytime;
}

//电梯运行函数
void Go(SLNode *head,int n,dianti dt,clock_t s[1000],man r[1000])
{
int k=0,i,time,m,flag=0,counter=0; //flag 记录是否有多个人在同一层或去同一层楼
for(i=0;iif(dt.door==0){ //初始电梯门状态为关着
if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0){//人在该楼层,要进去电梯,且电梯人数不超过规定的12人
if(i==0) time=s[i]/100; //记录当时时间
else time=gettime(head);
if(flag==0&&dt.door==0){
OPEN(head,dt,time); //开门
dt.door=1;
}
if((time-s[i]/100)<=r[i].rrsj){
time=gettime(head);
GET_IN(head,dt,time); //若超过此人的最大容忍时间,该人将放弃乘坐电梯
r[i].in=1;

}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
time=gettime(head); //获得事件链表最后一个结点的时间(即当前时刻)
if(dt.lc==r[i+1].lc) {flag=1;counter++;continue;} //该层的所有人都进入电梯
else{
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40); //电梯经过40t时间后,若无人进出,则关门
dt.door=0; //置电梯门状态为关
g++;
CLOSE(head,dt,time+40);
}
}
/* 本层人已经全部进入电梯,接下来电梯启动按每个人事件发生的时间顺序将其送往目的楼层*/
flag=0;
if(dt.lc<=r[i-counter].md){
time=gettime(head);
while(dt.lc<=r[i-counter].md){ //开往该层第一个人的目的楼层
flag=0;
if(dt.lcdt.lc++;
time+=30;

}
for(m=0;mif(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){//若该楼层有人等候,使其进入
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1; //电梯开门,并设置其门状态为开
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i-counter].md) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40); //电梯经过40t时间后,若无人进出,则关门
dt.door=0; //置电梯门状态为关
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1)
{
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
else if(dt.lc>=r[i-counter].md)
{
time=gettime(head);
while(dt.lc>=r[i-counter].md){
flag=0;
if(dt.lc>r[i-counter].md){
dt.lc--; //30t,电梯下降一层
time+=30;
}
for(m=0;mif(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){ //若该楼层有人等候,使其进入
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状

态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i-counter].md) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
i=i-counter;
}
else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1){ //人在电梯中,在该楼层要出去
if(i==0)time=s[0]/100;
else time=gettime(head);
for(m=0;mif(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){ //若该楼层有人等候,使其进入
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
//1...if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0) ,,,,人在该楼层,要进去电梯
//2...else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,人在电梯中,在该楼层要出去
//3...else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0),,,,,,,,,,,人不在该楼层,要进去电梯
//4...else if(dt.lc!=r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,,人在电梯里,该楼层不是其目的楼层
else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0){ //3...人不在该楼层,要进去电梯

flag=0;
if(i==0)time=s[0]/100; //以该事件发生的时间为起始时间
else time=gettime(head); //取当前时间
if(dt.lc<=r[i].lc){
while(dt.lc<=r[i].lc){
flag=0;
if(dt.lcdt.lc++;
time+=30; //30t,电梯上升一层
}
for(m=0;m//若该楼层有人等候,使其进入
if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i].lc) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
else if(dt.lc>=r[i].lc){
while(dt.lc>=r[i].lc){
flag=0;
if(dt.lc>r[i].lc){
dt.lc--;
time+=30;
}
for(m=0;m//若该楼层有人等候,使其进入
if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人

离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i].lc) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
/*接下来将电梯里的人按时间顺序送到各自的目的楼层*/
time=gettime(head);
if(dt.lc<=r[i].md&&r[i].in==1){
while(dt.lc<=r[i].md){
flag=0;
if(dt.lcdt.lc++;
time+=30;
}
for(m=0;m//若该楼层有人等候,使其进入
if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i].md) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(he

ad,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
else if(dt.lc>=r[i].md&&r[i].in==1){
while(dt.lc>=r[i].md){
flag=0;
if(dt.lc>r[i].md){
dt.lc--;
time+=30;
}
for(m=0;m//若该楼层有人等候,使其进入
if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i].md) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
}
//1...if(dt.lc==r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0) ,,,,人在该楼层,要进去电梯
//2...else if(dt.lc==r[i].md&&r[i].biaozhi==0&&r[i].in==1),,,,,,,,,,人在电梯中,在该楼层要出去
//3...else if(dt.lc!=r[i].lc&&dt.rs<12&&r[i].biaozhi==0&&r[i].in==0),,,,,,,,,人不在该楼层,要进去电梯
else if(dt.lc!=r[i].md&&r[i].biaozhi==0&&r[i].in==1){ //4...人在电梯里,该楼层不是其目的楼层
flag=0;
if(i==0)time=s[0]/100; //以该事件发生的时间为起始时间
else time=gettime(head); //取当前时间
if(dt.lc<=r[i].md){
while(dt.lc<=r[i].md){
flag=0;
if(dt.lcdt.lc++;
ti

me+=30;
}
for(m=0;m//若该楼层有人等候,使其进入
if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
time=gettime(head);
GET_OUT(head,dt,time);
r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i].md) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
else if(dt.lc>=r[i].md){
while(dt.lc>=r[i].md){
flag=0;
if(dt.lc>r[i].md){
dt.lc--;
time+=30;
}
for(m=0;m//若该楼层有人等候,使其进入
if(dt.lc==r[m].lc&&r[m].biaozhi==0&&r[m].in==0&&dt.rs<12){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
if((time-s[m]/100)<=r[m].rrsj){
time=gettime(head);
GET_IN(head,dt,time);
r[m].in=1;
}
else if(((time-s[m]/100)>r[m].rrsj)&&r[m].biaozhi==0){
r[m].biaozhi=1;
printf("\n此时有人离开,以下为离开的人的信息:\n");
printf("时间:%d(单位:t) 发生的事件超过用户的容忍时间,第%d层楼的人已经离去~~\n",s[m]/100+r[m].rrsj,dt.lc);
}
flag=1;
}
//若该楼层有人要出去,使其出电梯,置其状态为1表示该人已经使用过电梯
else if(dt.lc==r[m].md&&r[m].biaozhi==0&&r[m].in==1){
if(flag==0&&dt.door==0){
OPEN(head,dt,time);
dt.door=1;
}
time=gettime(head);
GET_OUT(head,dt,time);


r[m].biaozhi=1;
r[m].in=0;
flag=1;
}
}
if(dt.lc==r[i].md) break;
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
time=gettime(head);
}
}
if(dt.door==1){
time=gettime(head);
ListInsert(head,g,"该层已无人进出,关门",time+40);
dt.door=0;
g++;
CLOSE(head,dt,time+40);
}
}
}
}
}
time=gettime(head);
if(dt.lc!=1){
ListInsert(head,g,"在该层等候300t时间,无人进出,开始返回第一层",time+300);
time=gettime(head);
if(dt.lc>1){ListInsert(head,g,"电梯已经回到第一层,等候使用......",time+(dt.lc-1)*30);}
else {ListInsert(head,g,"电梯已经回到第一层,等候使用......",time+30);}
dt.lc=1;
}
else{
time=gettime(head);
ListInsert(head,g,"此时电梯已经在第一层,等候使用......",time);
}
}

void print(SLNode *head)
{
SLNode *p;
p=head;
if(p->next==NULL)
printf("\n 错误,链表为空!\n");//此语句为检验之用
while(p->next!=NULL){
printf("\n时间:%d(单位:t) 动作:%s",p->next->mytime,p->next->a);
p->next=p->next->next;
}
}

void Welcome()
{
char c;
printf("\n\n\n ******************************************************************************\n");
printf(" ______________________________________________________________________________\n\n\n\n\n");
printf(" ______________ 欢迎使用这个关于电梯模拟的软件! _______________\n");
printf(" ______________ 制作者:XXX _______________\n");
printf(" 班级:XXX 学号:XXXX \n\n");
printf("\n\n\n ________________________________________________________________~((M o M))~\n\n");
printf(" ******************************************************************************\n\n\n");
printf(" Please input any key to continue~~");
c=getche( );
fflush(stdin);//不清除缓冲去会出错
system("cls");
}

int main()
{
int t,a,k=0,i,flag=0;
SLNode *head;
//数组,用来存输入数据时候所用时间
clock_t start,shijian[1000],In_put[1000][2];//为了保证输入数据时计时暂停,定义一个In_put[]
dianti dt;
Welcome();
printf("\n\n时间单位t:0.1(秒)");
printf("\n楼层范围:0--5(层)");
printf("\n最大载客量:12(人)\n");
start=clock();
dt.lc=1; //开始电梯停在第一层
dt.rs=0; //电梯最大人数为12,开始

时候电梯内人数为空
dt.door=0;
t=(int)start/100;
printf("\n当前时刻:%d(t) 计时开始.....\n",t);
ListInitiate(&head);
while(1){
printf("\n0.下班楼空 1.有人要用电梯\n");
printf("请选择指令:");
scanf("%d",&a);
if(a==0){ printf("\n");break;}
if(a==1){
In_put[k][0]=clock();
printf("\n暂停计时,请输入此人的序号(可以为任意字符): ");
scanf("%s",ren[k].name);
printf("所在楼层: ");
scanf("%d",&ren[k].lc);
printf("目的楼层: ");
scanf("%d",&ren[k].md);
printf("最大容忍时间:");
scanf("%d",&ren[k].rrsj);
In_put[k][1]=clock();
k++;
}
}
printf("------------------------------------------------------------------------------");
printf("\n以下为要使用电梯的各个人的信息:(根据其申请使用电梯的时间先后顺序排列)\n");
for(i=0;iint j;
flag=0;
for(j=0;jif(ren[i].lc==ren[j].lc){flag=1;break;} //判断这层是否有多个人一起等候电梯
}
shijian[i]=In_put[i][0]-start;
if(flag==1) //若有多个人一起等候电梯,则申请电梯的时间取第一个人的时间
printf("时间: %d(单位:t) 人序号:%s 所在楼层:%d 要去楼层:%d",shijian[j]/100,ren[i].name,ren[i].lc,ren[i].md);
else if(flag==0)
printf("时间: %d(单位:t) 人序号:%s 所在楼层:%d 要去楼层:%d 最大容忍时间:%d",shijian[j]/100,ren[i].name,ren[i].lc,ren[i].md,ren[i].rrsj);
start=In_put[i][1]-In_put[i][0]; //计算输入输入数据所用时间
}
printf("\n------------------------------------------------------------------------------\n");
shijian[i]=0;
for(i=0;iren[i].biaozhi=0;
ren[i].in=0;
}
Go(head,k,dt,shijian,ren);
LinListSort(head);
printf("\n---------------------------------------------------------------------------\n");
printf("\n以下为人和电梯的动作:");
print(head);
printf("\n\n---------------------------------------------------------------------------\n\n");
Destroy(&head);
return 0;
}


相关文档
最新文档