📄 elevator.cpp
字号:
// elevator.cpp : Defines the entry point for the console application.
//
#define NULL 0
#include "stdafx.h"
#include <stdlib.h> /* For _MAX_PATH definition */
#include <malloc.h>
/////////////////////电梯参数/////////////////////////
int callup[5],calldown[5]; //电梯每层的上下按钮
int callcar[5]; //电梯当前所在楼层
int time; //电梯系统时间
int floor; //电梯所在楼层
int dwait; //人们正在进出电梯,value=1
int dopen; //电梯门开但无人进入,value=1
enum dstate {goingup,goingdown,idle}; //电梯状态定义
enum dstate state; //电梯所处状态
FILE *outfile;
/////////////////////电梯参数/////////////////////////
/////////////////////公共队列/////////////////////////
int num; //人数
struct queue *que[5]; //每层楼等待队列
struct person *people=NULL; //搭乘电梯的人
struct person *lastman; //最近进入系统的人
struct stack *elevator; //电梯中的人
/////////////////////公共队列/////////////////////////
//////////////////////搭乘电梯的人////////////////////
struct person
{
int number; //搭乘电梯人的编号
int reachtime; //到达时间
int infloor; //所在楼层
int outfloor; //目的楼层
int giveuptime; //可等待时间
struct person *next; //下一个人
};
//////////////////////搭乘电梯的人////////////////////
/////////////////////等待进入电梯队列/////////////////////////
struct queue
{
struct person *people;
struct queue *next;
};
//////////////////////等待进入电梯队列////////////////////
/////////////////////电梯栈/////////////////////////
struct stack
{
struct person *people;
struct stack *next;
};
//////////////////////电梯栈////////////////////
//////////////////////函数定义////////////////////
void closedoor(int downorup);
void delelevator(struct stack *delelevator);
void delperson(struct person *delpeople);
void delqueue(struct queue *leftqueue,int index);
int entersystem(int upordown);
void getpeople();
void insertelevator(struct person *inelepeople);
void insertqueue(struct person *inquepeople);
void leftsystem();
void opendoor(int uord);
void selectnext();
int timeadd(int timeslice,int condition);
void downele();
void upele();
//////////////////////函数定义////////////////////
//////////////////////插入queue队尾////////////////////
void insertqueue(struct person *inquepeople)
{
struct queue *intempque=que[inquepeople->infloor];
if(que[inquepeople->infloor]==NULL)
{
que[inquepeople->infloor]=(struct queue *)malloc(sizeof(struct queue));
fprintf(outfile,"第%d个人在%d楼排队\n",inquepeople->number,inquepeople->infloor);
que[inquepeople->infloor]->people=inquepeople;
que[inquepeople->infloor]->next=NULL;
if(inquepeople->outfloor>inquepeople->infloor)
{
callup[inquepeople->infloor]=1;
}
else
{
calldown[inquepeople->infloor]=1;
}
return;
}
while(intempque->next!=NULL)
{
intempque=intempque->next;
}
intempque->next=(struct queue *)malloc(sizeof(struct queue));
fprintf(outfile,"第%d个人在%d楼排队\n",inquepeople->number,inquepeople->infloor);
intempque->next->people=inquepeople;
intempque->next->next=NULL;
if(inquepeople->outfloor>inquepeople->infloor)
{
callup[inquepeople->infloor]=1;
}
else
{
calldown[inquepeople->infloor]=1;
}
}
//////////////////////插入queue队尾////////////////////
//////////////////////进入elevator////////////////////
void insertelevator(struct person *inelepeople)
{
struct stack *intempele=elevator;
if(elevator==NULL)
{
elevator=(struct stack *)malloc(sizeof(struct queue));
fprintf(outfile,"第%d个人在%d楼进入电梯\n",inelepeople->number,inelepeople->infloor);
elevator->people=inelepeople;
callcar[inelepeople->outfloor]=1;
elevator->next=NULL;
return;
}
while(intempele->next!=NULL)
{
intempele=intempele->next;
}
intempele->next=(struct stack *)malloc(sizeof(struct queue));
fprintf(outfile,"第%d个人在%d楼进入电梯\n",inelepeople->number,inelepeople->infloor);
intempele->next->people=inelepeople;
callcar[inelepeople->outfloor]=1;
intempele->next->next=NULL;
}
//////////////////////进入elevator////////////////////
//////////////////////删除queue成员////////////////////
void delqueue(struct queue *leftqueue,int index)
{
struct queue *deltempque=que[index];
if(que[index]==leftqueue)
{
que[index]=que[index]->next;
}
else
{
while(deltempque->next!=NULL)
{
if(deltempque->next==leftqueue)
{
deltempque->next=deltempque->next->next;
}
else
{
deltempque=deltempque->next;
}
}
}
}
//////////////////////删除queue成员////////////////////
//////////////////////删除person成员////////////////////
void delperson(struct person *delpeople)
{
struct person *deltempper=people;
if(people==delpeople)
{
people=people->next;
}
else
{
while(deltempper!=NULL)
{
if(deltempper->next==delpeople)
{
deltempper->next=deltempper->next->next;
}
else
{
deltempper=deltempper->next;
}
}
}
if(people==NULL)
{
fprintf(outfile,"time=%d,system end!!!!!!!\n",time);
exit(0);
fclose(outfile);
}
}
//////////////////////删除person成员////////////////////
//////////////////////删除elevator成员////////////////////
void delelevator(struct stack *delelevator)
{
struct stack *deltempele=elevator;
if(elevator==delelevator)
{
elevator=elevator->next;
}
else
{
while(deltempele!=NULL)
{
if(deltempele->next==delelevator)
{
deltempele->next=deltempele->next->next;
}
}
}
}
//////////////////////删除elevator成员////////////////////
//////////////////////从文件中读取搭乘电梯的人们////////////////////
void getpeople()
{
int giveup;
int i=1;
struct person *inpeople=people;
FILE *fp;
fp=fopen("input.txt","rb");
outfile=fopen("output.txt","w");
fscanf(fp,"%d",&num);
people=(struct person *)malloc(sizeof(struct person));
fscanf(fp,"%d",&people->reachtime);
fscanf(fp,"%d",&people->infloor);
fscanf(fp,"%d",&people->outfloor);
fscanf(fp,"%d",&giveup);
people->giveuptime=people->reachtime+giveup;
people->number=i++;
if(!feof(fp))
{
people->next=(struct person *)malloc(sizeof(struct person));
inpeople=people->next;
}
else
{
return;
}
while(1)
{
fscanf(fp,"%d",&inpeople->reachtime);
fscanf(fp,"%d",&inpeople->infloor);
fscanf(fp,"%d",&inpeople->outfloor);
fscanf(fp,"%d",&giveup);
inpeople->giveuptime=inpeople->reachtime+giveup;
inpeople->number=i++;
if(!feof(fp)&&i<num+2)
{
inpeople->next=(struct person *)malloc(sizeof(struct person));
inpeople=inpeople->next;
}
else
{
inpeople->next=NULL;
inpeople=inpeople->next;
break;
}
}
fclose(fp);
inpeople=people;
while(inpeople!=NULL)
{
fprintf(outfile,"%d ",inpeople->number);
fprintf(outfile,"%d ",inpeople->reachtime);
fprintf(outfile,"%d ",inpeople->infloor);
fprintf(outfile,"%d ",inpeople->outfloor);
fprintf(outfile,"%d\n",inpeople->giveuptime);
inpeople=inpeople->next;
}
}
//////////////////////从文件中读取搭乘电梯的人们////////////////////
//////////////////////搭乘电梯的人进入系统////////////////////
int entersystem(int upordown)
{
int enterflag=0;
if(lastman->next!=NULL)
{
if(lastman->next->reachtime==time)
{
if((floor==lastman->next->infloor&&dopen==1)&&(upordown==3||(upordown==1&&lastman->next->outfloor>floor)||(upordown==0&&lastman->next->outfloor<floor)))
{
insertelevator(lastman->next);
enterflag=1;
}
else
{
insertqueue(lastman->next);
enterflag=2;
}
lastman=lastman->next;
}
}
return enterflag;
}
//////////////////////搭乘电梯的人进入系统////////////////////
//////////////////////搭乘电梯的人离开系统,不再等待////////////////////
void leftsystem()
{
int i;
struct queue *temp;
for(i=0;i<5;i++)
{
temp=que[i];
while(temp!=NULL)
{
if(temp->people->giveuptime==time&&(floor!=temp->people->infloor||dwait==0))
{
fprintf(outfile,"第%d个人不愿等待,离去!\n",temp->people->number);
delperson(temp->people);
delqueue(temp,i);
}
temp=temp->next;
}
}
}
//////////////////////搭乘电梯的人离开系统,不再等待////////////////////
//////////////////////时间流逝////////////////////
int timeadd(int timeslice,int condition)
{
int i;
for(i=1;i<=timeslice;i++)
{
time++;
// printf("%d ",time);
leftsystem();
if(entersystem(condition)==1)/////////////////////////////////
{
timeadd(25,2);
return 1;
}
}
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -