结队人员:董强强(本人),万延正(小伙伴)
我的小伙伴:万延正,博客地址: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"); }