⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elevator.cpp

📁 数据结构是编程的基础
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -