2)若电梯在下降期:
1. 若有低层请求:下降;
2. 若无有低层请求:转上升期,上升。
判断电梯是否要停于当前层函数EleAchieved的算法: 1. 该层的CallCar为1;
2. 该层在上升(下降)期有上升(下降)请求(判断CallUp或CallDown);
3. 上升(下降)期高(低)层没有请求而该层由下降(上升)请求,要转换运行时期。 判断电梯动作函数ElevatorRun的算法: 1. 若电梯在Opening状态,则转至Opened状态。 2. 若电梯在Opened状态,若无人进出,则转至Closing状态。 3. 若电梯在Closed状态,则根据电梯请求情况转至相应状态。 4. 若电梯在Closing状态,则转至Closed状态。 5. 若电梯在Moving状态,若达到目标层,则转至Decelerate状态。
否则,继续移动。 6. 若电梯在Decelerate状态,则设定电梯时期,并转至Opening状
态。 7. 若电梯在Waiting状态,在判断是否等待超时,若超时则向第一层
移动。否则,判断电梯请求情况并转至相应状态。
五: 设计与调试分析
在本程序中如何判断电梯的动作最为关键。此外,合理划分各个模块和处理各个模块之间的联系也非常重要。
在电梯调度方面不能按照预定的想法实现,所以和现实中的电梯有出入。没有显示电梯的运行到哪里,而是用有乘客进入电梯时显示乘客进入到哪层楼来告知电梯运行到几楼。开门,关门时需要精心思考,此处记时及判断是否要开门也是难点,所以这些看似很平常的动作却是最难也是最容易错的地方。此外在指针的使用方面也是难点,很多地方比如乘客进队出队以及放弃乘坐电梯时均涉及指针的使用,也经常在这些地方通不过编译。为了便于控制循环,设计了电梯运行时间,则在时间到达时即可退出系统。由于开始为了简化程序而定义了很多变量,结果发现并不实际,有的变量仅是在某些函数中赋予其值罢了,于是就将这些变量删除,比如开始按照提示设置了D1—表示人们正在进出电梯等等。
六:体会及建议
我们应重视编程思想的培养,语言很重要,但究竟只是工具,思想才是精髓。通过阅读书中的各种数据结构及相应算法的代码来吸收书中的思想。我们可以利用各种途径来学习认识一种功能的实现,但是最终的串联编写还是应该靠自己的思路去不断完善,在这段时间中我们有充分的时间去了解我们完成任务所需的知识内容,而我们也应该去认真完成。
在这阶段的设计过程中,编写时总是出现原来未曾遇到过的各种错误,很难解决,常常受到很长时间的困扰,虽然这属于纯粹的个人能力体现,属于自学运用,但老师并不能在有问题时及时给与有效建议。而我们的所学有限,考虑问题不是很全面,解决问题也总是难以有高效的解决方案只能通过不断的实践去比较结果。
七:参考文献
1:严蔚敏等 数据机构(C语言版) 清华大学出版社 2:谭浩强 C语言程序设计 清华大学出版社
八:原代码
#include
#include
//所有常量,全局变量和类型定义
#define NULL 0 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0
#define INFEASIBLE -1 #define OVERFLOW -2
#define INT_MAX 32767
//Status是函数类型,其值是函数结果状态代码 typedef int Status;
#define Empty 0 //电梯状态
enum EleStatus{Opening,Opened,Closing,Closed,Moving,Decelerate,Waiting}; enum Action{DoorOpened,DoorClosed,GoingUp,GoingDown,Achieved,None}; enum EleStage{Up,Down,OpenDoor,Stop};
enum ClientStatus{New,GiveUp,In,Out,Finish};
#define CloseTest 40 //电梯关门测试时间 #define OverTime 300 //电梯停候超时时间 #define DoorTime 20 //开门关门时间 #define InOutTime 25 //进出电梯时间 #define Maxfloor 4 //最高层 #define Minfloor 0 //最低层
long Time=0; //时钟
long MaxTime;//系统运行最长时间 int InOutCount=0;//用于进出计时
int InterTime=0;//下一乘客进入系统的时间 int ID=0; //乘客编号
int GiveUpNumber=0;//乘客放弃的数目 int TotalTime=0;//总共等待时间 //乘客类型
typedef struct { int ClinetID; //乘客编号 int Outfloor; //去哪层 int InTime; //该乘客进入时间
int GivepuTime; //所能容忍的等待时间 int Infloor;//乘客进入的楼层
}Client;
//乘客类型基本操作
void PrintClientInfo(Client const &e,ClientStatus s) { switch(s) { case New: printf(\号乘客进入第%d层.\\n\ case GiveUp: printf(\号乘客放弃等待.\\n\ case Out: printf(\号乘客走出电梯.\\n\ case In:printf(\号乘客走进电梯,要层.\\n\ default:break; }; }
Status CreatClient(Client *&p) { int d;
p=new Client; if(!p) return OVERFLOW; p->ClinetID=++ID; printf(\所能容忍的等待时间:\ scanf(\ p->GivepuTime=d; p->InTime=Time;
printf(\下一乘客要到达的时间:\
scanf(\ InterTime=d; printf(\所要到达的楼层:\
scanf(\ p->Outfloor=d; while((p->Infloor=rand()%(Maxfloor+1))==p->Outfloor); PrintClientInfo(*p,New); return OK; }
Status DestoryClient(Client *&p) { delete p; p=NULL; return OK; }
Status GoAbove(Client const &e)
去第%d{ if(e.Outfloor>e.Infloor) return TRUE; else return FALSE; }
Status CInfloor(Client const &e) { return e.Infloor; }
Status CInTime(Client const &e) { return e.InTime; }
Status COutfloor(Client const &e) { return e.Outfloor; }
#define STACK_INIT_SIZE 10 //存储空间初始分配量 #define STACKINCREMENT 5 //存储空间分配增量 //乘客栈
typedef Client *SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize; }ClientStack;
Status InitStack(ClientStack &S) { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) return OVERFLOW; S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; }
Status DestroyStack(ClientStack &S) { SElemType *p; if(S.base) { for(p=S.base;p 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库电梯模拟系统(2)在线全文阅读。
相关推荐: