结对项目---电梯调度
结队人员:董强强(本人),万延正(小伙伴)
我的小伙伴:万延正,博客地址:http://www.cnblogs.com/wyz937386163/
程序已经推送到coding上了,coding链接:https://coding.net/u/DreamQ/p/Elevator/git/blob/master/Elevator.cpp
电梯调度
控制21层楼的4部电梯,1、4号电梯全部楼层可以停靠,2、3号电梯分别停靠单双层,1、2号电梯最大载重800kg,人数限制为10人,3、4号电梯人数限制为20人,最大载重分别为1600kg和2000kg。
以上是老师原本的要求,但我和我的结对伙伴编程能力比较弱,因此没有做出来界面,程序也只是对一部电梯实现了look算法,没有使用多线程编程,没有达到老师的要求。以下是程序介绍以及结队心得。
需求分析:
某小区高层建筑,由于开发商资金匮乏,每栋楼只配备一部电梯(为了我们两人小组的程序虚构的小区)。人数限制为不超过10人,载重量不超过800kg。
该电梯采用look算法。电梯初始化停靠在-1层。电梯上行,首先保存所有提出申请的楼层,然后根据申请的编号到达不同的楼层,乘客进入电梯,判断是否超重或超员,乘客的人数和重量可以用传感器测出来然后把数据送入程序,如果超重提示乘客离开电梯,如果不超重由乘客输入目的楼层,到达目的楼层开门让乘客离开电梯。到达最后的目的层后判断是否有下行申请,如果有则进行电梯下行的操作,如果没有申请电梯降到-1层待命。电梯下行类似于上行操作,不同的是电梯上行到某一层,这层之后如果没有被要求到达的楼层电梯降到-1层待命,电梯下行是直接降落到-1层,中途在需要停靠的楼层停靠。
程序设计:
由于只有一部电梯,只需要设计上行和下行两部分就行了。look算法是scan算法的优化版本,但本质还是扫描(scan)算法。
流程图如下:
电梯上行,由于没有界面,只能由用户从控制台输入数据,用户输入完数据后保存在申请楼层的数组里,逐层判断。到达申请楼层输入目的楼层,然后继续逐层判断,直到没有需要到达的楼层。感觉自己的注释比较清楚,就不做赘述了。代码如下:
void Up() { //数组floor1保存提出申请的层数 int floor1[21]; //变量floor2保存到达目的层数 int floor2[21]; //定义变量Weight,Num保存电梯内的总人数和重量 int Weight=0,Num=0; //定义变量Weight1,Num1保存进入电梯的乘客的重量和人数 int Weight1=0,Num1=0; //定义变量Weight2,Num2保存离开电梯的乘客的人数和质量 int Weight2=0,Num2=0; //定义一维数组存储出电梯的人数以及重量 int out[2]; //避免二次提示的变量 int Number=0; //判断有无下行的变量 int Request; //临时变量 int i,j,k; int m=1,temp1=0,temp2=0; //int m,n,l; printf("输入提出申请的层数,回车结束输入\n"); //将提出申请的层数的乘客信息保存 for(i=0;;i++) { scanf("%d",&floor1[i]); if(temp1<floor1[i]) { temp1=floor1[i]; } //回车结束输入 if(getchar()=='\n') { break; } } printf("上行...\n"); //每循环一次电梯上一层楼 for(i=0;i<=temp1||i<=temp2;i++) { printf("电梯到达%d层\n",i); //循环判断是否到达需要停靠的楼层,可以免去排序过程 for(j=0;j<floor1[j]||j<floor2[j];j++) { //判断是否到达目的楼层 if(i==floor2[j]) { printf("开门,乘客离开,输入离开的乘客的人数,重量\n"); scanf("%d%d",&Num2,&Weight2); //判断是否超重 Weight-=Weight2; Num-=Num2; Number=floor2[j]; printf("电梯内有%d人,重%d\n",Num,Weight); } //判断是否到达申请的楼层 if(i==floor1[j]) { //申请楼层和目的楼层相同,避免多次提示开门 if(Number!=floor1[j]) { printf("开门,乘客进入\n"); } else { printf("乘客进入\n"); } printf("输入进入电梯乘客的人数和重量\n"); scanf("%d%d",&Num1,&Weight1); Num+=Num1; Weight+=Weight1; //如果超重或超员 if(Weight>=800||Num>=10) { //提示乘客离开电梯 while(1) { printf("超重或人数过多,输出下电梯的人数及重量:\n"); scanf("%d%d",&out[0],&out[1]); Num-=out[0]; Weight-=out[1]; if(Num<10&&Weight<800) { break; } } } printf("不超重,关门\n"); printf("电梯内有%d人,重%d\n",Num,Weight); //输入目的层数 printf("输入目的层数,回车结束输入:\n"); //循环输入目的楼层,但输入数据不能多于还未到达楼层的总数 for(k=m;k<(21-i);k++) { scanf("%d",&floor2[k-1]); //如果最高申请楼层不是顶层且该层之上无申请 if(temp2<=floor2[k-1]) { temp2=floor2[k-1]; } //设置第三方变量m,防止再次输入楼层时数据覆盖 m++; //结束输入条件判断 if(getchar()=='\n') { break; } } //电梯继续上行 } } } printf("是否有下行申请,有(1),无(0)\n"); scanf("%d",&Request); if(Request==0) { printf("电梯降到-1层待命\n"); } else { Down(); } //printf("up\n"); }
电梯下行,下行的子程序和上行的子程序基本相同,少了判断电梯到达的楼层之后是否还有需求楼层的部分,其他部分基本相同。具体代码可以到博客开头的coding地址上查看。
程序调试:
因为我的我的搭档在编程方面都是水的不要不要的人,所以代码的测试部分还是有很多问题的,比如超重或者超员的判断,一开始我是写了个子程序来判断,超重处理是在子程序完成的,所以需要返回两个值,人数和重量,准备定义全局变量或者定义指针来解决这个问题,万延正说这段子程序完全可以不写嘛,几行代码没必要在写成个子程序,于是判断超重与超员的函数写到电梯上行子函数里面问题解决了。之后还有提示的问题,由于没有界面程序不直观,只能用语言来弥补,但话说多了难免混乱,我的搭档删减了一些提示语句后就让程序还看得过去了。然后就是电梯到达的楼层之上的楼层不再被需要时的操作,万延正说可以把最高楼层的编号放到数组的首地址里面,然后用这个判断是否到达申请或目的的最高楼层。我感觉不使用第三方变量肯定会有bug,聪明如我,bug还是被我发现了,然后万延正听我的定义了一个临时变量,判断楼层编号大小,然后把最大的编号存放到临时变量里面,问题解决:)。其实我们还讨论很多小问题,只是时间有些长了,忘了:( 下面附上几张程序调试的截图:
界面有限,只输入两个上行申请楼层,乘客在5层和9层提出申请,分别要到达8层和14层,14层之上的楼层没有被需求,判断是否有下行申请,有执行下行申请,无降到-1层待命。
超重判断的程序调试截图如下:
电梯下行的程序调试界面,申请楼层为14层和16层,目的楼层为5层和2层,最后停靠在-1层待命:
程序比较简单,以上是测试截图。
结队心得:
还得说说我俩的基础,我的基础已经很差了,我的小伙伴和我比真的是半斤八两,真的是太差了,简直不忍直视。我俩接受新事物能力又不强,学习计算机的竟然还说编程是新事物真的很惭愧,但是事实如此,也只能硬着头皮上了,感觉我俩很努力了,但效果并不显著,项目虽然做出来了,但完全不符合要求(泪奔)。我前几年作的死(打死不学专业课)的恶果已经长成,流着泪都得咽下去:(。看到其他同学的项目,才发现差距之巨大,才知道自己还是没有用全力去学习,才知道自己弱小的不要不要的。现在只能用羡慕的眼光看着别人把胜利果实高高举起。不过还好是结队编程,这又不是我一个人的事,小伙伴忙一点我忙一点,慢慢的程序就成型了,然后他指出bug,我攻克bug,程序就可以运行了,尽管现在的程序依然有很多bug,不过之前的bug已经消失了,慢慢努力吧。
I am a slow worker,but I never work backwards.–––Lincoln
我很喜欢林肯的这句话,虽然我进步不明显,但我是不会再走回头路的。且行且进步。
最后附上我俩工作中的英姿: