您的位置:首页 > 其它

结对项目---电梯调度

2016-04-07 22:55 239 查看

结队人员:董强强(本人),万延正(小伙伴)

我的小伙伴:万延正,博客地址: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算法,没有使用多线程编程,没有达到老师的要求。以下是程序介绍以及结队心得。

[b]需求分析:[/b]

某小区高层建筑,由于开发商资金匮乏,每栋楼只配备一部电梯(为了我们两人小组的程序虚构的小区)。人数限制为不超过10人,载重量不超过800kg。

该电梯采用look算法。电梯初始化停靠在-1层。电梯上行,首先保存所有提出申请的楼层,然后根据申请的编号到达不同的楼层,乘客进入电梯,判断是否超重或超员,乘客的人数和重量可以用传感器测出来然后把数据送入程序,如果超重提示乘客离开电梯,如果不超重由乘客输入目的楼层,到达目的楼层开门让乘客离开电梯。到达最后的目的层后判断是否有下行申请,如果有则进行电梯下行的操作,如果没有申请电梯降到-1层待命。电梯下行类似于上行操作,不同的是电梯上行到某一层,这层之后如果没有被要求到达的楼层电梯降到-1层待命,电梯下行是直接降落到-1层,中途在需要停靠的楼层停靠。

[b]程序设计:[/b]

由于只有一部电梯,只需要设计上行和下行两部分就行了。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");
}


View Code

电梯下行,下行的子程序和上行的子程序基本相同,少了判断电梯到达的楼层之后是否还有需求楼层的部分,其他部分基本相同。具体代码可以到博客开头的coding地址上查看。

[b]程序调试:[/b]

因为我的我的搭档在编程方面都是水的不要不要的人,所以代码的测试部分还是有很多问题的,比如超重或者超员的判断,一开始我是写了个子程序来判断,超重处理是在子程序完成的,所以需要返回两个值,人数和重量,准备定义全局变量或者定义指针来解决这个问题,万延正说这段子程序完全可以不写嘛,几行代码没必要在写成个子程序,于是判断超重与超员的函数写到电梯上行子函数里面问题解决了。之后还有提示的问题,由于没有界面程序不直观,只能用语言来弥补,但话说多了难免混乱,我的搭档删减了一些提示语句后就让程序还看得过去了。然后就是电梯到达的楼层之上的楼层不再被需要时的操作,万延正说可以把最高楼层的编号放到数组的首地址里面,然后用这个判断是否到达申请或目的的最高楼层。我感觉不使用第三方变量肯定会有bug,聪明如我,bug还是被我发现了,然后万延正听我的定义了一个临时变量,判断楼层编号大小,然后把最大的编号存放到临时变量里面,问题解决:)。其实我们还讨论很多小问题,只是时间有些长了,忘了:( 下面附上几张程序调试的截图:

界面有限,只输入两个上行申请楼层,乘客在5层和9层提出申请,分别要到达8层和14层,14层之上的楼层没有被需求,判断是否有下行申请,有执行下行申请,无降到-1层待命。



超重判断的程序调试截图如下:



电梯下行的程序调试界面,申请楼层为14层和16层,目的楼层为5层和2层,最后停靠在-1层待命:



程序比较简单,以上是测试截图。

[b]结队心得:[/b]

还得说说我俩的基础,我的基础已经很差了,我的小伙伴和我比真的是半斤八两,真的是太差了,简直不忍直视。我俩接受新事物能力又不强,学习计算机的竟然还说编程是新事物真的很惭愧,但是事实如此,也只能硬着头皮上了,感觉我俩很努力了,但效果并不显著,项目虽然做出来了,但完全不符合要求(泪奔)。我前几年作的死(打死不学专业课)的恶果已经长成,流着泪都得咽下去:(。看到其他同学的项目,才发现差距之巨大,才知道自己还是没有用全力去学习,才知道自己弱小的不要不要的。现在只能用羡慕的眼光看着别人把胜利果实高高举起。不过还好是结队编程,这又不是我一个人的事,小伙伴忙一点我忙一点,慢慢的程序就成型了,然后他指出bug,我攻克bug,程序就可以运行了,尽管现在的程序依然有很多bug,不过之前的bug已经消失了,慢慢努力吧。

I am a slow worker,but I never work backwards.–––Lincoln

我很喜欢林肯的这句话,虽然我进步不明显,但我是不会再走回头路的。且行且进步。

最后附上我俩工作中的英姿:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: