当前位置:首页 > 专题范文 > 公文范文 >

数据结构设计电梯模拟系统

时间:2023-05-19 08:15:02 来源:网友投稿

数据结构设计电梯模拟系统 目录 1.引言 2 2.需求分析 2 3. 概要设计 2 3.1数据结构描述 2 3.2模块设计 3 3.3电梯的模拟流程图 3 4详细设计及实现 3 4.1全局变量的定义 3 4.2人具体情况的定义 4 4.3队、栈的类型 4 4.4.电梯类型 4 4.5系统类的定义 5 5.调试分析 6 6.结论及体会 6 参考文献 7 附录 8 电梯模拟系统 1.引言 现代社会水平发展迅速,楼房越建越高,电梯就成为了人们生活中必不可少的工具,因此对电梯的运行系统进行了解研究是有一定意义的。本文用在c++的环境下模拟了电梯的运行情况,对电梯的运行情况有了一定的了解。

2.需求分析 (1)以堆栈Lift模拟电梯,以队Qup[],Qdnow[]两个数组模拟等候电梯的人排的队。进入系统的人进入队列,进入电梯的人从队列中删除并且进入栈中,离开系统的人也从队列中删除。

(2)用户输入楼的的层数,运行的时间,以及进入电梯中人的信息,系统将自动运行,直到把所有的人送到要去的地方,或者到运行的时间为止。

(3)系统有自动与手动两种操作方式,由用户自己选择,系统中的显示均是以图形模拟的方式显示的。

(4)系统能够在运行时输出相关的人的各种信息,如来自哪一层,要去哪一层,用了多少时间等等。

3. 概要设计 3.1数据结构描述 设定栈的抽象数据类型定义:
ADT Stack { 数据对象:
数据关系:
约定端为栈顶,端为栈底。

}ADT Stack 设定队的抽象数据类型定义:
ADT Queue { 数据对象:
数据关系:
约定端为队列头,端为队列尾。

}ADT Queue 3.2模块设计 (1)全局变量的定义 (2)人具体情况的定义 (3)队、栈的类型 (4)电梯类型 (5)系统类的定义 3.3电梯的模拟流程图 编程序前要了解电梯的运行情况,作出具体的流程图,以便更好的编写程序。下面给出的是电梯简单的运行模拟图。

图1电梯的模拟运行流程图 4详细设计及实现 4.1全局变量的定义 对于全局来说,需知道最多楼层和某一时间电梯所在楼层、电梯状态 ,首先定义出这些变量,Floor_now定义电梯所在楼层,state定义电梯状态,MaxF定义最多楼层,t1、t2定义时间变量。

int id; int R_W; int imgF; int Floor_now;//电梯所在楼层 int state;//电梯状态 int t1;//时间变量 int t2; int MaxF;//最多楼层 int t; int tt; char hand_auto; 4.2人具体情况的定义 使用电梯的人要求有具体的所在楼层和目的楼层,根据具体情况乘坐电梯的人都有一定的容忍时间,一旦等电梯花费时间超过限度,人将放弃坐电梯,maxwaittime定义最长容忍时间,Nfloor定义所在楼层,ToFloor定义为乘坐电梯者的目的楼层。

typedef struct pop { int maxwaittime;//最长容忍时间 int NFloor;//所在楼层 int ToFloor;//目的楼层 int ID; int ontim; }people; 4.3队、栈的类型 4.4.电梯类型 每个使用电梯的人都在一个固定的层等待电梯,都有一个目标层。电梯有最大的承载数,电梯停下的时候有人出入,也需要记录。电梯何时停下需要有函数判断,Maxman定义最大承载数,Liftman定义为电梯里的人,stop[50]定义需要停的楼层,run()是关于电梯运行的函数,wait()是关于电梯是否静止等待的函数,Stop()是关于电梯在楼层间停靠的函数,open_shut()是电梯开门关门的函数。在run()运行函数中调用Stop()函数判断是否有停靠的楼层,如果有在调用open_shut()电梯开门关门的函数。

class lift//电梯类 { public: int Maxman;//最大承载数 int Liftman;//电梯里的人 int stop[50];//需要停的楼层 void run();//电梯运行 void wait();//电梯静止等待 void Stop();//电梯在楼层间停靠 void open_shut();//电梯开门关门 }; lift Lift; void lift::open_shut()//电梯开关门函数 void lift::Stop()//判断电梯停靠的函数 void lift::wait()//电梯等待函数 void lift::run()//运行函数 4.5系统类的定义 先对系统进行初始化定义,在模拟系统中,可以系统随机产生,也可以人为的设定。initQ()函数初始化上下行队列,initF()初始化楼层,initL()初始化电梯,void leave(people*)函数表示人离开系统。syst::State()函数首先判断电梯状态,电梯停或向上,从高层开始判断,判断是否有人去高层或高层有人想上 若高层无人等待乘电梯也没人去高层电梯向下,电梯停靠在目标层,打开电梯门。在判断电梯状态,电梯开始循环工作。在电梯的模拟系统中用syst::img(int os)函数通过图形模拟输出,用syst::Word(int con=1)输出状态语句,使得模拟结果更加形象易懂。

lass syst { public: void rand_man(int);//随即产生人 void initQ();//初始化上下行队列 void initF();//初始化楼层 void initL();//初始化电梯 void initAll();//构造函数 void leave(people*);//人离开系统 void out_in(); void State(); void help(); void Cout_S(); void img(int); void Word(int); syst() { f=0; man=0; } void syst::leave(people*p) void syst::out_in() void syst::rand_man(int n=8) void syst::initAll() void syst::initF() void syst::initL() void syst::initQ() void syst::Cout_S() void syst::img(int os)//图形模拟输出 void syst::Word(int con=1)//输出语句 void main ()//主函数 {system(“pause“); sys.help(); sys.initAll(); sys.rand_man(); while(1) { Lift.run(); Lift.wait(); } } 5.调试分析 1.程序中主要函数只有一个state函数,也是核心程序,它比较难,因为考虑的方面比较多,不可能一次就搞定,要经过很多次的运行原型程序才能不断的完善。

2.队栈的操作在程序中是关键之处,不过并没有用到队栈的全部操作,所以,文中只是写了部分操作的代码。

3.程序中大部分的代码是输出函数部分,因为论文中主要是以图模拟的方式显示结果,所以程序中的输出全都集成在两个函数中即 syst::img()与syst::word()。对两个函数调用得到了电梯的系统模拟图。

4.调试程序时借助断点或单步可以很快的找到程序中的错误所在。

6.结论及体会 本文电梯模拟系统的设计主要运用了队列和栈的部分知识,电梯系统看似简单但具体的运行却很麻烦,需要考虑到很多的细节。不过只要掌握了电梯的具体流程,写起程序才可以顺利一些。写完一部分程序后,试着去运行,有缺陷在修改,再加入具体函数,使程序更加完美。

课程设计使我学到了很多书本以外的东西,同时也提高了查阅资料的能力以及解决问题的能力,培养培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。也懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

在做这次课程设计的时候,遇到这样那样的麻烦,因此,我也得到了许多宝贵的经验:
1、在设计程序之前,务必要对你所设计的题目和内容有一个系统的了解,知道所设计的题目和内容包含那些资源。

2、设计程序关键要有一个清晰的思路和一个完整的流程图,因而,要先把设计原理与思路搞清楚,再把流程图画出来,这样设计起来就简单多了。

3、在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路,发现错误也是取得成绩的一种。

4、要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便。

5、在设计程序过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。

参考文献 [1] 严蔚敏,吴伟民.数据结构题集(C语言版).北京:清华大学出版社,1999. [2] 徐孝凯, 数据结构课程实验. 北京:清华大学出版社,2002. [3] 郭翠英, C语言课程设计案例精编. 北京:中国水利水电出版社,2004.03. 网站:CSDN 程序员 附录 #include “syst.h“ class lift//电梯类 { public: int Maxman;//最大承载数 int Liftman;//电梯里的人 int stop[50];//需要停的楼层 void run();//电梯运行 void wait();//电梯静止等待 void Stop();//电梯在楼层间停靠 void open_shut();//电梯开门关门 }; lift Lift; void lift::open_shut()//电梯开关门函数 { sys.State();//判断状态 tt=10; word=OPEN; sys.img(1);//输出函数 tt=20; word=OUT_STA; sys.img(0); sys.out_in();//人进出函数 Lift.stop[Floor_now]=0; sys.State(); tt=40; word=OUT_END; sys.img(-1); } void lift::Stop()//判断电梯停靠的函数 { if(first)//判断是否是第一次运行 { Floor_now-=state; if(state==1)tt=21; else if(state==-1)tt=31;//设定时间 word=STOP; sys.img(0); tt=30; word=SLOW; sys.img(0); Floor_now+=state; if(Lift.stop[Floor_now]==-1) state*=(-1); if(state==1)tt=14; else if(state==-1)tt=23; word=READY; sys.img(0); } open_shut();//开关门函数 tt=20; word=SHUT; sys.img(0);//输出函数 first=1; } void lift::wait()//电梯等待函数 { if(t%37>20) sys.rand_man(0);//随即产生人 if(R_W) return; if(Floor_now!=idl) { if(Floor_now-idl>0) state=-1; if(Floor_now-idl<0) state=1; while(Floor_now!=idl)//电梯驶向等待层 { word=TO_IDL; sys.img(0); Floor_now+=state; if(state==1) tt=51; else if(state==-1) tt=61; if(Floor_now==idl) state=0; if(t%37>20) sys.rand_man(0);//随即产生人 if(R_W) return; } } tt=310; word=WAIT; sys.img(0); } void lift::run()//运行函数 { while(state!=0) { if(t%37>20) sys.rand_man(0);//随即产生人 sys.State(); if(state==1&&!Qup[Floor_now].EmptyQ())//电梯向上 有人想上楼 电梯停 Stop(); else if(state==-1&&!Qdnow[Floor_now].EmptyQ())//电梯向下,有人想下楼 电梯停 Stop(); else if(Lift.stop[Floor_now])//当前楼层有人下或是高层有人向下,或 低层有人向上 Stop(); else first=2; if(R_W==1) tt=0; else { if(first==1) tt=50; else if(first==2) { if(state==1) tt=51; else if(state==-1) tt=23; } }//设定时间 R_W=2;//运行-停靠判断变量 word=RUN; sys.img(0); Floor_now+=state; } R_W=0; } void syst::leave(people*p) { if(p!=NULL) delete p;//有人离开系统 }//人离开系统 void syst::State()//状态判断函数 { int k; for(int n=2;n>0;n--)//循环两次判断 { if(state==1||state==0)//电梯停或向上 { for(k=MaxF-1;k>=Floor_now;k--)//从高层开始判断 { if(Lift.stop[k]==1||!Qup[k].EmptyQ())//判断是否有人去高层 或高层有人想上 { state=1;//电梯向上 for(int i=k;i>=Floor_now;i--)//重新赋值给stop数组 if(Lift.stop[i]!=1) Lift.stop[i]=0; break; } else if(!Qdnow[k].EmptyQ())//高层有人下 { state=1;//电梯向上 Lift.stop[k]=-1;//标志电梯停靠的位置 break; } } if(k==Floor_now-1)//高层无人 也没人去高层 判断当前楼层 { if(!Qup[k+1].EmptyQ())//有人想上 state=1; else if(Qdnow[k+1].EmptyQ())//无人上下 state=0; else if(!Qdnow[k+1].EmptyQ())//有人向下 state=-1; } } if(state==-1||state==0)//电梯向下,电梯停靠 { for(k=0;k<=Floor_now;k++)//从低层开始判断 { if(!Qdnow[k].EmptyQ()||Lift.stop[k]==1) //有人去低层,低层有人向下 { state=-1; for(int i=k;i<=Floor_now;i++)//从新赋值stop数组 if(Lift.stop[i]!=1) Lift.stop[i]=0; break; } else if(!Qup[k].EmptyQ())//低层有人向上 { state=-1; Lift.stop[k]=-1; break; } } if(k==Floor_now+1)//判断当前楼层 { if(!Qdnow[k-1].EmptyQ())//有人下 state=-1; else if(Qup[k-1].EmptyQ())//无人上下 state=0; else if(!Qup[k-1].EmptyQ())//有人向上 state=1; } } } } void syst::out_in() { int n=0,k=0;//n出人,k进入的人 while(!InLift.EmptyS()) { if(t%37>20) sys.rand_man(0);//随即产生人 tt=25; word=OUT; InLift.PopS(tem);//出电梯 if(tem->ToFloor==Floor_now)//判断是否离开 { n++;Lift.Liftman--; sys.img(0); }//在本层下的人,在系统中删除,电梯内人数减1,出人数加1 else TempS.Push(tem);//不是在本层下的人进入临时栈 }//电梯里的人全部出 if(InLift.EmptyS()) while(!TempS.EmptyS()) { TempS.PopS(tem); InLift.Push(tem); }//临时栈的人先进电梯 if(state==1||Floor_now==0) { while(!Qup[Floor_now].EmptyQ()) { if(t%37>20) sys.rand_man(0); tt=25; word=IN; Qup[Floor_now].DelQ(tem); InLift.Push(tem); Lift.Liftman++; k++; Lift.stop[tem->ToFloor]=1; sys.img(0); } }//如果电梯向上,则上行队先进电梯 if(state==-1||Floor_now==MaxF-1) { while(!Qdnow[Floor_now].EmptyQ()) { if(t%40>20) sys.rand_man(0); tt=25; word=IN; tem=new people; Qdnow[Floor_now].DelQ(tem); InLift.Push(tem); Lift.Liftman++; k++; Lift.stop[tem->ToFloor]=1; sys.img(0); } }//如果向下,则下行队先进电梯 if(Lift.Liftman>Lift.Maxman)//判断是否超载 {tt=25; word=OVERW; sys.img(0); while(Lift.Liftman<=Lift.Maxman) { if(t%40>20) sys.rand_man(0); tt=25; n=0; InLift.PopS(tem); { if(tem->NFloor>tem->ToFloor) Qdnow[Floor_now].EntQ(tem); else Qup[Floor_now].EntQ(tem); } n++; word=OUT; sys.img(0); } word=NOMAL; sys.img(0); } }//进出函数 void syst::rand_man(int n=8) { char ch='n';//是否随机 if(!n) { int k=clock(); k=(rand()+k)%9; if(!k) { n=1; ch='y'; word=R_M; img(0); } t1=clock(); while(1) { t2=clock(); if(t2==t1+1000) break; } } else n=man; if(n) { if(ch=='n') { cout<<COT<<“\002+\002+\002+\002+\002“; int i; cout<<COT<<“╔═╤═╦“; for(i=(3*MaxF+18)/2;i>0;i--) cout<<“═“; cout<<“╗\n“; cout<<COT2<<“║ ↑ ║“; for(i=(MaxF+6)/2;i;i--) cout<<“ “; cout<<“楼层电梯模拟“; for(i=MaxF;i;i--) cout<<“ “; cout<<“║\n“; cout<<COT2<<“╠═╧═╬“; for(i=(3*MaxF+18)/2;i>0;i--) cout<<“═“; cout<<“╝“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║>>“;cout<<setw(2)<<n<<“ 人进入 是(Y)否(N)随即生成数据<<“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“---------Y-随机::N-不随机---------“; cin>>ch; } for(;n;n--) { cout<<COT2; tem=new people; tem->ontim=t; int i=0; if(ch=='n'||ch=='N') { cout<<COT<<“║→○←║“<<“ 请输入----人的ID号码 :(0-99 之间)__“; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 人ID号码 (0-99 之间)__“; i=1;cin>>tem->ID;cout<<COT2<<“║→○←║“; }while(tem->ID<0||tem->ID>=99); } else tem->ID=id++; i=0; if(ch=='n'||ch=='N') { cout<<COT<<“║→○←║“<<“ 请输入----人所在楼层 (0-NF-“;cout<<setw(2)<<f<<“)层__ “; do { if(i) {cout<<COT<<“║→○←║“<<“ 错误 重输 人所在楼层 (0-NF-“;cout<<setw(2)<<f<<“)__ “;} i=1;cin>>tem->NFloor;cout<<COT2<<“║→○←║“; }while(tem->NFloor<0||tem->NFloor>=f);} else { int t=clock(); tem->NFloor=(rand()+t)%f; } i=0; if(ch=='n'||ch=='N') { cout<<COT<<“║→○←║“<<“ 请输入----人目的楼层 (0-NF-“;cout<<setw(2)<<f<<“)层__ “; do { if(i) {cout<<COT<<“║→○←║“<<“ 错误 重输 人目的楼层 (0-NF-“;cout<<setw(2)<<f<<“)__ “;} i=1;cin>>tem->ToFloor;cout<<COT2<<“║→○←║“; }while(tem->ToFloor==tem->NFloor||tem->ToFloor<0||tem->ToFloor>f); } else do { int t=clock(); tem->ToFloor=(rand()+tt)%f; }while(tem->NFloor==tem->ToFloor);//随机生成 i=0; if(ch=='n'||ch=='N') { cout<<COT<<“║→○←║“<<“ 请输入----人等待时间(100<T<10000)__“; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 等待时间 (100<T<1000)__“; i=1;cin>>tem->maxwaittime;cout<<COT2<<“║→○←║“; }while(tem->maxwaittime<100||tem->maxwaittime>1000);} else do { tem->maxwaittime=rand()%900+100; }while(tem->maxwaittime<100||tem->maxwaittime>1000); if(ch=='n'||ch=='N') word=MAKE; else word=RAND; if(tem->ToFloor>tem->NFloor) Qup[tem->NFloor].EntQ(tem);//进入上行队列 if(tem->ToFloor<tem->NFloor) Qdnow[tem->NFloor].EntQ(tem);//进入下行队列 if(state==0) { if(Floor_now>tem->NFloor) state=-1; else if(Floor_now<tem->NFloor) state=1; else { if(Floor_now>tem->ToFloor) state=-1; else if(Floor_now<tem->ToFloor) state=1; } }//判断状态 img(0); } word=RAND_O; img(0); } if(R_W!=2) R_W=1; if(first==99) first=0; } //构造函数 void syst::initAll() { char key;int i=0; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 是(Y)否<(N)随机 Y/N “; i=1; cout<<COT2<<“║→○←║“; cout<<COT<<“║→○←║“<<“系统开始运行 是(Y)否(N)随机初始化:“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“------\“Y\“-是:---------\“N\“-否:------“; cin>>key;cout<<COT2<<“║→○←║“; }while(key!='y'&&key!='n'&&key!='Y'&&key!='N'); if(key=='n'||key=='N') { i=0; cout<<COT<<“║→○←║“<<“ 初始化 楼层总数 5<=F<16 :“; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 楼层总数 5<F<16 :“; i=1; cin>>f;cout<<COT2<<“║→○←║“; }while(f<5||f>=16); i=0; cout<<COT<<“║→○←║“<<“ 初始化 系统运行时间 500<T<10000 :“; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 运行时间 500<T<10000 :“; i=1;cin>>max_t;cout<<COT2<<“║→○←║“; }while(max_t<500||max_t>10000); i=0; cout<<COT<<“║→○←║“<<“ 初始化 进入系统的人数 20>M>0 :“; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 进入系统人数 0<M<20 :“; i=1; cin>>man;cout<<COT2<<“║→○←║“; }while(man<1||man>20); i=0; cout<<COT<<“║→○←║“<<“ 初始化 电梯闲置时的位置 0<WF<“;cout<<f<<“ :“; do { if(i) {cout<<COT<<“║→○←║“<<“ 错误 重输 候命时楼层 0<WF<“;cout<<f<<“ :“;} i=1;cin>>idl; cout<<COT2<<“║→○←║“<<“ “; }while(idl<0||idl>=f); } else { f=6; man=4; max_t=10000; idl=1; } tt=0; t=0; id=1; imgF=0; Ctrl=SPACE; word=NUL; R_W=1; Floor_now=idl; first=99; initF(); initQ(); initL(); i=0; do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 手动(H)自动(A) H/A “; i=1; cout<<COT<<“║→○←║“;cout<<COT<<“║→○←║“;cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“ 请选择 手动操作(H)自动操作(A) H/A:“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“ 首次运行本程序 建议选择 手动操作“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“-----\“H\“-手动:-------\“A\“-自动:-----“; cin>>hand_auto;cout<<COT2<<“║→○←║“; }while(hand_auto!='h'&&hand_auto!='a'&&hand_auto!='A'&&hand_auto!='H'); i=0; if(hand_auto=='A'||hand_auto=='a') { do { if(i) cout<<COT<<“║→○←║“<<“ 错误 重输 刷新时间 4<T<20 秒 :“; i=1; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“ 请输入 屏幕的刷新时间 4<T<20 秒 :“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“ 建议输入 4--6 秒为宜。“; cin>>FRESH;cout<<COT2<<“║→○←║“; }while(FRESH>20||FRESH<4); } cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>---------系统初始化完毕---------<<“; } //初始化楼层 void syst::initF() { MaxF=f; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>-------全楼共 - “<<setw(2)<<f<<“ - 层--------<<“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>-------最高层 - “<<setw(2)<<f-1<<“ - 层--------<<“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>-------最低层 - 0 - 层--------<<“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>--------楼层初始化完毕:---------<<“; } //初始化电梯 void syst::initL() { Lift.Maxman=20; Lift.Liftman=0; state=0; for(int k=0;k<f;k++) Lift.stop[k]=0; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>电梯在 - “<<setw(2)<<Floor_now<<“ - 层停靠,电梯中没人<<“; cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>---------电梯初始化完毕---------<<“; } //初始化队列 void syst::initQ() { for(int i=0;i<f;i++) { queue up; Qup[i]=up; queue dnow; Qdnow[i]=dnow; } cout<<COT<<“║→○←║“; cout<<COT<<“║→○←║“<<“>>虚拟队列初始化完毕,无人等候电梯<<“; } void syst::help() { //system(“cls“); cout<< “ “<<endl << “ 电梯图详细说明 “<<endl << “ “<<endl << “ “<<endl << “┌┄┄┄┄┄┄┄┄┄ 表示 该层有人想下楼 “<<endl << “┆ “<<endl << “┆ ┌┄┄┄ 当前楼层数 指示电梯当前运行的楼层 “<<endl << “┆ ↓ “<<endl << “┆ ╔═╤╪╤══════════════╗ “<<endl << “┆ ║№↑ 2↑ 楼层电梯模拟 ║ “<<endl << “┆ ╠═╪═╪══════════════╣ “<<endl << “┆ ║信↓息↓ ID 来自 目的 状态 用时 ║→┄┄运行时的相关信息 “<<endl << “┆ ║信↑息↑ 8 1层 2层 进入 25T ║↗ “<<endl << “┆ ╠═╪═╪══════════════╣ “<<endl << “┆ ║ 3↑ ┌┄┄ 开门 关门 指示灯 ║ “<<endl << “└┄┄╫ \001→\37↙ ┌┄┄┄ ┄┄┄╫┄┄┄电梯运行状态 上 下 停 “<<endl << “ ║ 2↑\16 ↑ ▌电 ▌\36 5 ▌0 1 2 3 ▌║ “<<endl << “ ║ ↓\17 ↓ ▌梯 ▌<->↖ \002 ▌║ “<<endl << “ ║ 1↑ ↖ ↑ ↖ ↑ ║ “<<endl << “ ║ ↓ ↖ ┆ 电梯中的人数 ┆ ║ “<<endl << “ ║ 0↑\36↑┆ ┆ ┆ ║ “<<endl << “ ┌→╫ \001↓↑┆ 门的状态 开 关 ┆ ║ “<<endl << “ ┆ ╚═╧╪╧╪═══════════╪═╝ “<<endl << “ ┆ ↑ ┆ ┆ ┆ “<<endl << “ ┆ ┆ ┆ └┄ 开门 超载 报警铃声 └┄┄┄┄┄电梯中有人在该层下 “<<endl << “ ┆ ┆ ┆ “<<endl << “ ┆ ┆ └┄┄┄ 表示 该层有人想上楼 “<<endl << “ ┆ ┆ “<<endl << “ ┆ └┄┄┄┄┄ 0 1 2 3 为楼层数,即第几层楼 “<<endl << “ ┆ “<<endl << “ └┄┄┄┄┄┄┄┄ 笑脸 代表该楼层有人等候 “<<endl << “ “<<endl << “ 请详细阅读本说明,如果你记不住请在 手动模式下 按 H 键打开本页 “<<endl << “ “<<endl <<“ 按键说明(手动模式下)
“<<endl <<“ “<<endl <<“ SPACE----------------- 向下逐步执行 “<<endl <<“ ENTER----------------- 重启系统 “<<endl <<“ H ----------------- 帮助 “<<endl <<“ ESC ----------------- 退出 “<<endl <<“ 制作:蔡玉雷 “<<endl <<“ “<<endl <<“*****************************************************************************“<<endl; if(first==0)system(“pause“); } void syst::Cout_S() { switch (state) { case(1):cout<<“\36“;break; case(0):cout<<“=“;break; case(-1):cout<<“\37“;break; } }//状态表示符号的输出 void syst::img(int os)//图形模拟输出 { char *ifpep;static int n=0; t+=tt; if(t>=max_t) word=OVER; if(hand_auto=='a'||hand_auto=='A') system(“cls“); if(first!=99) { cout<<COT; cout<<COT; cout<<COT<<“ 时刻-“;cout<<setw(5)<<t;cout<<“ T 本次用时-“;cout<<setw(3)<<tt<<“ T“;cout<<“ 运行总时间-“;cout<<setw(5)<<max_t;cout<<COT; } else cout<<COT2; cout<<COT<<“╔═╤═╤“; int i; for( i=(3*MaxF+18)/2;i>0;i--) cout<<“═“; cout<<“╗\n“; cout<<COT2<<“║№↑“;cout<<setw(2)<<Floor_now<<“↑“; for(i=(MaxF+6)/2;i;i--) cout<<“ “; cout<<“楼层电梯模拟“; for(i=MaxF;i;i--) cout<<“ “; cout<<“║\n“; cout<<COT2<<“╠═╪═╪“; for( i=(3*MaxF+18)/2;i>0;i--) cout<<“═“; cout<<“╣\n“; cout<<COT2<<“║信↓息↓“; if(word==OUT||word==IN||word==RAND||word==MAKE) { for(int i=(MaxF-4)/2;i>0;i--) cout<<“ “; Word(1); for( i=(2*MaxF-5)/2;i>0;i--) cout<<“ “; cout<<“║\n“; cout<<COT2<<“║信↑息↑“; for( i=(MaxF-4)/2;i>0;i--) cout<<“ “; Word(0); for( i=(2*MaxF-5)/2;i>0;i--) cout<<“ “; cout<<“║\n“; } else { for(int i=(MaxF-4)/2;i>0;i--) cout<<“ “; Word(0); for( i=(2*MaxF-5)/2;i>0;i--) cout<<“ “; cout<<“║\n“; } cout<<COT2<<“╠═╪═╪“; for(i=(3*MaxF+18)/2;i>0;i--) cout<<“═“; cout<<“╣\n“; for( i=MaxF*2-1;i>-1;i--) { ifpep=“ “; if(i/2!=Floor_now) { if(i%2==0) { if(!Qup[i/2].EmptyQ()||!Qdnow[i/2].EmptyQ()) ifpep=“\001“; if(Qdnow[i/2].EmptyQ()) cout<<COT2<<“║“<<setw(2)<<ifpep<<“↓ ↓ “; else cout<<COT2<<“║“<<setw(2)<<ifpep<<“↓“<<“\37 ↓ “; } else { if(Qup[i/2].EmptyQ()) cout<<COT2<<“║“<<setw(2)<<i/2<<“↑ ↑ “; else cout<<COT2<<“║“<<setw(2)<<i/2<<“↑“<<“\36 ↑ “; } for(int k=(3*MaxF+18)/2-1;k>0;k--) cout<<“ “; cout<<“ ║\n“; } else { if(i%2==0) { if(imgF>man) {switch(os) { case 0:cout<<COT2<<“║ “;Cout_S();cout<<“↓ ↓ ▌梯 ▌“<<“---“<<“ ▌“;break; case 1:cout<<COT2<<“║“<<setw(2)<<“=“<<“↓\16 ↓ ▌梯 ▌“<<“<->“<<“ ▌“;break; case -1:cout<<COT2<<“║“<<setw(2)<<“=“<<“↓ ↓ ▌梯 ▌“<<“>|<“<<“ ▌“;break; }; } else { if(!Qup[i/2].EmptyQ()||!Qdnow[i/2].EmptyQ()) ifpep=“\001“; if(Qdnow[i/2].EmptyQ()) cout<<COT2<<“║“<<setw(2)<<ifpep<<“↓ ↓ ▌梯 ▌“<<“---“<<“ ▌“; else cout<<COT2<<“║“<<setw(2)<<ifpep<<“↓“<<“\37 ↓ ▌梯 ▌“<<“---“<<“ ▌“; imgF+=1; } for(int k=0;k<MaxF;k++) { if(Lift.stop[k]==1) cout<<“ \002“; else cout<<“ “; } if(MaxF%2==0) cout<<“ ▌ ║\n“; else cout<<“ ▌║\n“; } else { if(imgF>man) { switch(os) { case 0:cout<<COT2<<“║“<<setw(2)<<i/2<<“↑ ↑ ▌电 ▌“;Cout_S();cout<<setw(2)<<Lift.Liftman<<“ ▌“;break; case 1:cout<<COT2<<“║“<<setw(2)<<i/2<<“↑\17 ↑ ▌电 ▌“;Cout_S();cout<<setw(2)<<Lift.Liftman<<“ ▌“;break; case -1:cout<<COT2<<“║“<<setw(2)<<i/2<<“↑\17 ↑ ▌电 ▌“;Cout_S();cout<<setw(2)<<Lift.Liftman<<“ ▌“;break; }; } else { if(Qup[i/2].EmptyQ()) { cout<<COT2<<“║“<<setw(2)<<i/2<<“↑ ↑ ▌电 ▌“;Cout_S();cout<<setw(2)<<Lift.Liftman<<“ ▌“; } else { cout<<COT2<<“║“<<setw(2)<<i/2<<“↑“<<“\36 ↑ ▌电 ▌“;Cout_S();cout<<setw(2)<<Lift.Liftman<<“ ▌“; } } for(int k=0;k<MaxF;k++) cout<<setw(3)<<k; if(MaxF%2==0) cout<<“ ▌ ║\n“; else cout<<“ ▌║\n“; } } } cout<<COT2<<“╚═╧═╧“; for( i=(3*MaxF+18)/2;i>0;i--) cout<<“═“; cout<<“╝“;cout<<COT; word=NUL;tt=0; if(hand_auto=='a'||hand_auto=='A') { cout<<COT<<“ 上图每 “<<FRESH<<“ 秒会刷新一次“; cout<<COT<<COT<<“ 看不懂图,请重运行程序,选手动操作。按 H 查看帮助“; t1=clock(); while(1) { t2=clock(); if(t2>=(t1+FRESH*1000)) break; } } else{ if(first!=99) { if(hand_auto=='H'||hand_auto=='h') { cout<<COT<<“ 空格-继续 H-帮助 ENTER-重启 ESC-退出“; cout<<COT<<COT<<“ 键入你的选择----“; char a='N'; Ctrl=getch(); switch(Ctrl) { case SPACE: break; case 'h': case 'H':sys.help();break; case ESC:exit(1); case ENTER: cout<<COT;cout<<COT;cout<<COT;cout<<COT;cout<<COT;cout<<COT;cout<<COT;cout<<COT<<“ 系统将重启,之前的所有数据将清零,是(Y)否(N)继续?“; cin>>a;cout<<COT2;cout<<COT; if(a=='y'||a=='Y') { system(“cls“); sys.initAll(); sys.rand_man(); } break; }; } } else system(“pause“);} if(word==OVER) exit(1); } void syst::Word(int con=1)//输出语句 { if(con==1) cout<<“ ID 来自 目的 状态 用时 “; else { switch(word){ case NUL: cout<<“ “;break; case SLOW: cout<<“ 电梯开始减速 将停 “;break; case OPEN: cout<<“ 停靠铃响 开门灯亮 “;break; case OUT_STA:cout<<“ 允许出入 开门灯灭 “;break; case OUT_END:cout<<“ 关门灯亮 禁止出入 “;break; case SHUT: cout<<“ 关门结束 准备移动 “;break; case END: cout<<“ 退出系统 是否确定 “;break; case R_M: cout<<“ 有人进入 系统随机 “;break; case OVER: cout<<“ 时间超出 系统关闭 “;break; case OVERW: cout<<“ 电梯超载 报警铃响 \16 \16 “;break; case NOMAL: cout<<“ 人数正常 电梯运行 “;break; case RAND_O: cout<<“ 人初始完 准备运行 “;break; case WAIT: cout<<“ 电梯闲置 “<<setw(2)<<idl<<“层候命 “;break; case TO_IDL: cout<<“ 空闲中 回“<<setw(2)<<idl<<“层等待 “;break; case READY: cout<<“ 现第“<<setw(2)<<Floor_now<<“层 电梯停稳 “;break; case ADD: cout<<“ 电梯加速 离开“<<setw(2)<<Floor_now<<“层 “; break; case STOP: cout<<“ 电梯将于“<<setw(2)<<Floor_now+state<< “ 层停靠 “;break; case RUN: cout<<“ 电梯当前“<<setw(2)<<Floor_now<<“ 层运行 “;break; case OUT: cout<<“ “<<setw(2)<<tem->ID<<“ “<<setw(2)<<tem->NFloor<<“层 “<<setw(2)<<tem->ToFloor<<“层 “<<“离开“<<setw(4)<<t-tem->ontim<<“T “;break; case IN: cout<<“ “<<setw(2)<<tem->ID<<“ “<<setw(2)<<tem->NFloor<<“层 “<<setw(2)<<tem->ToFloor<<“层 “<<“进入“<<setw(4)<<t-tem->ontim<<“T “;break; case RAND: cout<<“ “<<setw(2)<<tem->ID<<“ “<<setw(2)<<tem->NFloor<<“层 “<<setw(2)<<tem->ToFloor<<“层 “<<“随机产生R “;break; case MAKE: cout<<“ “<<setw(2)<<tem->ID<<“ “<<setw(2)<<tem->NFloor<<“层 “<<setw(2)<<tem->ToFloor<<“层 “<<“用户产生M “;break; case LEAVE : cout<<“ ID:“<<setw(2)<<Floor_now<<“ 等不到电梯离开系统 “; break; }; } } void main ()//主函数 { cout<<“###############################################################################“<<endl <<“# #“<<endl <<“# 电梯模拟系统 #“<<endl <<“# #“<<endl <<“# 电梯模拟系统是用队栈数据类型来调度人员的进出,模拟系统会根据需要产 #“<<endl <<“# 生楼层数和需要用电梯的人。人可以是随机的,也可以有操作者设定。系统 #“<<endl <<“# 会产生电梯的时序运行情况的输出。输出形式有自动和手动法式两种,自动 #“<<endl <<“# 模式下操作者不需要任何操作,系统会一直运行到结束;
手动模式下,操作 #“<<endl <<“# 可根据情况做相应的操作。

#“<<endl <<“# #“<<endl <<“# #“<<endl <<“# 键:(手动模式下) #“<<endl <<“#SPACE-----------向下逐步执行 #“<<endl <<“#ENTER-----------重启系统 #“<<endl <<“#H ----------------- 帮助 #“<<endl <<“# ESC ----------------- 退出 #“<<endl <<“# 制作:
信计07.01 蔡玉雷 20072112012 #“<<endl <<“# #“<<endl <<“#*****************************************************************************#“<<endl; system(“pause“); sys.help(); sys.initAll(); sys.rand_man(); while(1) { Lift.run(); Lift.wait(); } }

推荐访问:结构设计 电梯 模拟