电梯模拟设计·序 在大二时自腊裂学了C++编程语言,且在《C++编程经典》这本书上看到了一个实例“
电梯模拟”,不过那上面只实现了两层楼,一个电梯的功能,当时我就想:我应该写一个能实现多层楼的,还是多电梯的,不过那时只是尽力去看上面的实例是怎样实现的。当时没有电脑,于是就不了了之。在这个假期,一个人在学校了过春节,自由时间比较多,于是想起写这个程序来,在经过十多天的时间,终于完成了所有功能,但是由于时间和能力有限,现在完成的有些算法不是很合理。·模拟过程说明电梯的运行过程是根据时间和人的需要执行的。而我这里模拟,是了更好的了解及实现电梯运行过程的模拟,因此我采用 *** 作员按键来控制电梯,根据键盘接受来实现不同的需要(如:电梯运行,
楼层生成人,菜单帮助,推出)。这个程序是对电梯的模拟,每次的开始电梯都停在最底层楼,也就是0层。之后由 *** 作员(也就是程序运行
的人) *** 作,你可以按回车键由楼层产生人,在楼层有人之后,人会按上下键去选择他们的去向,之后在 *** 作员输入空格键的时候,电梯会一层一层的运动到所需楼层载人; 你可以选择空格键,这使得电梯运行到要求的下一层,当系统检测到这层楼有人要出去,或是要进来,那么电梯停止、开门,等候出去的人出完,进来的人进来(当然,这是不允许超载的)。 你也可以选择H或是h来查看帮助菜单。最后你可以选择esc退出。·概要设计 在开始之前会让用户输入楼层数及电梯数,程序根据数据构造整个建筑。楼层中有等候的地方有两个按钮,是等待人按的上下键。建筑中有电梯,可以不只一个,电梯中有开关门键,还有数字键,供人按键决定去向;这些键当被按下时,键就呈亮色,因此键里有灯。当电梯到达某一楼层,有人要出电梯或是进电梯,电梯的门会开,然后关门,并且电梯里的铃就会响。介此,根据要求设计类如下: Bell——————————铃(电梯里的铃) Lignt ——————————灯(按钮里的灯) Button ——————————按钮(上下键,数字键,开关门键) Door ——————————门(电梯的门) People ——————————人(楼层里生产人,之后进电梯,出电梯之后消除人) Floor ——————————楼层(建筑有多个楼层) Elevator ——————————电梯(楼层里的电梯) Building ——————————建筑 Time——————————时间类(当某一楼层既有人上,也有人下,而且电梯在次楼层,此时电梯就会选择该上还是下,于是会根据时间来上下人的最早时间来定·详细设计1、状态变量的设计(1)Elevator::runline的设计 runline的数据定义:这是电梯的引导变量,因此要确定几个参数:①.是否有人出——OUT;②.有人进且上楼——UP;③.有人进且下楼——DOWN。当到某一楼的时候可能既有人出且有人上、有人出且有人下、有人上也有人下、还有没有人等情况。于是设置参数的二进制如下:OUT——001,DOWN——010,UP——100.根据这几个基数可以组合罩局顷:TT——0(000)(初始时都设置为TT)UP_DOWN——6(110:UP | DOWN)OUT_DOWN——3(011:OUT | DOWN)OUT_UP——5(101:OUT | UP)OUT_UP_DOWN——7(111:OUT | UP | DOWN)这样做的好处是在提供判断时特别方便,考虑满足哪一种条件时直接和其取与(&)就可以判断了,还有就是在判断时是先判断是否有人出于是只需要与OUT做与(&) *** 作就可以判断是否有人出了。因此这是整个程序设计中很精彩的一部分。电梯的运行全有此数据引导,当生成人的时候,根据人所在的楼层,然后搜索最快能到达此楼层满足人去向的电梯,然后改变runline的值;当人走出电梯之后又再次改变runline,使得正常引导电梯……(2)Elevator::status设计在判断电梯的运动状态时根据此变量判断。由于电梯的状态只有停、上、下三个状态,这里我分别用0、-1、1来表示物陆。其实为了保持一致性,可以用runline中的TT、UP、DOWN来表示,但是在计算中,不需要runline与status的计算,因此可以不和runline一致。而这里定义为0、-1、1有一个特大的好处就是计算电梯所到达的楼层,当电梯为上运动时,电梯所到的楼层只需+1(即是+status),当电梯为下运动时,电梯所到的楼层只需-1(还是+status),当停止时不需要加减,此时+0(即+status)不会影响到原来的值。于是在就是电梯所到楼层时,不管电梯的运行状态,都可以直接+status就可以了, (3)Elevator::pList ( list<People *>pList ) 电梯中人的存储链表,由于电梯中的人数只有上限,但随时可以不一样,因此采用动态存储结构来存储较好,为了方便使用类库的 *** 作,于是定义为list存储结构,存储为People的指针,而不是对象,这样使得人在转移过程中(从楼层进入电梯)只是改变了人的位置,而不是先拷贝进入电梯,之后再删掉楼层中人的对象,这与实际不符合,还浪费时间、空间。按照这样设计,人从楼层中产生起一直存在,直到走出电梯。只是引出他的对象不一样而已。 (3)Elevator::numberButton ( vector<Button *>numberButton ) 电梯中数字按钮:在构造电梯时,就会构造数字按钮,而此时数字按钮的个数是确定的,以后不会再改变其存储大小即值,于是这里采用动态数组来存储。 (4)同理,建筑中的电梯,建筑中的楼层,在构造建筑的过程中都应该构造完成,是确定的数量,因此这里都采用动态数组来存储。(5)Floor::pList 楼层中等待的人为了方便区分楼层中等待的人是上还是下,于是将等待上可下的人分别存储。楼层中的人进入电梯时,只需根据电梯的运行状态来确定是谁应该进电梯。 (6)程序中定义了一个全局变量bfloors,是建筑的楼层数,因为在很多几个类中都需要用的这个变量,因此,将其定义全局变量我认为可以减少内存开销。这是以前作的课程设计,是一个10层电梯的模拟,供楼主参考吧:
printf("上下选择:1-上楼,2-下楼\t")
scanf("%d",&input_direction)
fflush(stdin)
printf("输入该层的乘客想到达的楼层,以-1结束\n")
void check(liftor &myliftor) int flag1=0,flag2=0,flag3=0
for(i=0i<10i++)
{
if(myliftor.stored_flare[i]!=0)
flag1=1
if(myliftor.stored_flare[i]==1)
flag2=1
if(myliftor.stored_flare[i]==2)
flag3=1
}
if(!flag1) myliftor.set_direction(0)
else if(!flag2&&flag3) myliftor.set_direction(2)
else if(!flag3&&flag2) myliftor.set_direction(1)
int main(int argc, char *argv[])
liftor myliftor
char flag
int j
myliftor.direction=1
printf("**************************************\n")
printf("该程序用于模拟10(0-9)层的电梯控桐渗制\n")
printf("先输入按下电梯的层号及上下选\n择(类似电梯外的按钮)\n")
printf("每到一层时,输入乘客要到的楼槐宴\n层号(类铅轮银似电梯内的按钮)\n")
评论列表(0条)