作业要求:
现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示:
电梯编号 | 可服务楼层 | 最大乘客数量 | 最大载重量 |
1 | 全部楼层 | 10 | 800 kg |
2 | 单层 | ||
3 | 双层 | 20 | 1600 kg |
4 | 2000 kg |
其使用规定如下:
1、楼层号为0~20,其中0号为地下一层;
2、有楼层限制的电梯不在响应楼层停靠,如单双层;
3、所有电梯采用统一按钮控制
请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了。
需求分析:
1、共有4部电梯,分单双层停靠和全部楼层都停靠。
2、用户在任意层请求,距离最近的电梯响应乘客要求。
3、随时显示各个电梯运行状态和所在层数。
4、随时接受用户输入,电梯可以同时运行。
源程序:
定义结构体elevator,结构体中有5个成员,分别是状态(int staus)、类型(int type)、楼层数(int floor)、是否被调用(int beixuyao)和是否有人用电梯(int flag)。
typedef struct elevator
{
int staus;//三种状态:静止,上行,下行
int type;//三种类型:双,单,全
int floor;//此时停在的楼层数
int beixuyao;//此楼层是否被调用
int flag;//是否有人用电梯
}B;
计算楼层差值函数int Lookfor(int x, int y, int z)。电梯有三种状态,分别是静止、上升和下降。
当电梯静止时,a[x].staus == 0;
当电梯上升时,a[x].staus == 1;
当电梯下降时,a[x].staus == 2。
计算电梯所在楼层与用户所在楼层数的差值,用c来表示相差的楼层数,并返回到被调用的地方。
电梯静止时,求出用户所在楼层和电梯所在楼层的距离;
电梯上升时,且用户请求方向为上,电梯所在楼层比用户所在楼层低,则电梯响应用户的需求,并求出距离。
电梯下降时,且用户请求方向为下,电梯所在楼层比用户所在楼层高,则电梯响应用户的需求,并求出距离。
其他情况,电梯不停。
int Lookfor(int x, int y, int z)//计算楼层差值函数
{
int c;
if (a[x].staus == 0)//此时a[x]电梯处于静止状态
{
if (y < z)
{
c = z - y;
}
else
{
c = y - z;
}
}
if (a[x].staus == 1)//此时a[x]电梯处于上升状态
{
if (y > z&&dir == 1)
{
c = y - z;
}
else
{
printf("此电梯不能响应用户的请求");
}
}
if (a[x].staus == 2)//此时a[x]电梯处于下降状态
{
if (y < z &&dir == 0)
{
c = z - y;
}
else
{
printf("此电梯不能响应用户的请求");
}
}
return c;
}
初始化部分:
所有电梯最初处于静止状态。
0号电梯初始楼层为-1,a[0].floor = -1;所有楼层均能响应。
1号电梯初始楼层为7,a[1].floor = 7;单层响应。
2号电梯初始楼层为14,a[2].floor = 14;双层响应。
3号电梯初始楼层为20,a[3].floor = 20;所有楼层均能响应。
用户在界面中输入自己的需求。
printf(" ---- ---- ---- ---- \n");
printf(" | | | | | | | |\n");
printf(" -1 7 14 20 \n");
printf(" | | | | | | | |\n");
printf(" ---- ---- ---- ---- \n");
while (1)
{
a[0].staus = 0;
a[1].staus = 0;
a[2].staus = 0;
a[3].staus = 0;
a[0].floor = -1;
a[1].floor = 7;//表示此时电梯停在的楼层数为7楼
a[2].floor = 14;
a[3].floor = 20;
a[0].type = 2;//一号电梯所有楼层都停靠
a[1].type = 1;//二号电梯单号楼层都停靠
a[2].type = 0;//三号电梯双号楼层都停靠
a[3].type = 2;//四号电梯所有楼层都停靠
int i;
int flag1 = 0, j = 0;
printf("----------------------------------------------\n");
printf("若要用电梯请按按钮 1 !\n");
scanf("%d", &flag);//此时是否有人按电梯
if (flag == 1)
{
printf("*****此时有用户按电梯!*****\n");
}
printf("用户所在楼层为: ");
scanf("%d", &floor);//此时按电梯的人所在的楼层数
printf("上楼请按 1 ,下楼请按 0: ");
scanf("%d", &dir);//用户请求是上楼还是下楼标记
printf("请选择要去的楼层: ");
scanf("%d", &gofloor);//用户要去的楼层
共有上楼和下楼两种情况:
上楼:dir=1;大体分为两种情况,每个情况中又有两个小分支。
第一种情况:
1、用户在偶数层,要求奇数楼层:查找全部楼层都停靠的电梯,并标记为1,即a[i].beixuyao = 1;否则标记为0,a[i].beixuyao = 0。调用Lookfor函数,查找距离最近的电梯。
2、用户在偶数层,要求偶数楼层:查找全部楼层都停靠的电梯和偶数层停靠的电梯,并标记为1,即a[i].beixuyao = 1;否则标记为0,a[i].beixuyao = 0。调用Lookfor函数,查找距离最近的电梯。
if (floor % 2 == 0)//用户所在为偶数楼层
{
if (gofloor % 2 == 1)//用户要去奇数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
if (gofloor % 2 == 0)//用户要去偶数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2 || a[i].type == 0)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
if (k[0] < k[2])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
else
{
if (k[1] < k[2])
{
printf("离用户最近并且符合条件的电梯为:2\n");
a[2].floor = gofloor;
a[2].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
}
}
if (floor % 2 == 1)//用户所在为奇数楼层
{
if (gofloor % 2 == 0)//用户要去偶数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
if (gofloor % 2 == 1)//用户要去奇数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2 || a[i].type == 1)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
if (k[0] < k[2])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
else
{
if (k[1] < k[2])
{
printf("离用户最近并且符合条件的电梯为:2\n");
a[1].floor = gofloor;
a[1].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
}
}
}
下楼:dir=0;
其他部分下楼情况同上楼情况,此处就不再多做说明。
程序运行结果:
附录(完整源代码):
#include<stdio.h>
#include<windows.h>
typedef struct elevator
{
int staus;//三种状态:静止,上行,下行
int type;//三种类型:双,单,全
int floor;//此时停在的楼层数
int beixuyao;//此楼层是否被调用
int flag;//是否有人用电梯
}B;
B a[4];
int flag, dir, floor, gofloor;
int c[3], k[3], m[3];
int Lookfor(int x, int y, int z)//计算楼层差值函数
{
int c;
if (a[x].staus == 0)//此时a[x]电梯处于静止状态
{
if (y < z)
{
c = z - y;
}
else
{
c = y - z;
}
}
if (a[x].staus == 1)//此时a[x]电梯处于上升状态
{
if (y > z&&dir == 1)
{
c = y - z;
}
else
{
printf("此电梯不能响应用户的请求");
}
}
if (a[x].staus == 2)//此时a[x]电梯处于下降状态
{
if (y < z &&dir == 0)
{
c = z - y;
}
else
{
printf("此电梯不能响应用户的请求");
}
}
return c;
}
void main()
{
//接人操作
printf(" ---- ---- ---- ---- \n");
printf(" | | | | | | | |\n");
printf(" -1 7 14 20 \n");
printf(" | | | | | | | |\n");
printf(" ---- ---- ---- ---- \n");
a[0].staus = 0;
a[1].staus = 0;
a[2].staus = 0;
a[3].staus = 0;
a[0].floor = -1;
a[1].floor = 7;//表示此时电梯停在的楼层数为7楼
a[2].floor = 14;
a[3].floor = 20;
while (1)
{
a[0].type = 2;//一号电梯所有楼层都停靠
a[1].type = 1;//二号电梯单号楼层都停靠
a[2].type = 0;//三号电梯双号楼层都停靠
a[3].type = 2;//四号电梯所有楼层都停靠
int i;
int flag1 = 0, j = 0;
printf("----------------------------------------------\n");
printf("若要用电梯请按按钮 1 !\n");
scanf("%d", &flag);//此时是否有人按电梯
if (flag == 1)
{
printf("*****此时有用户按电梯!*****\n");
}
printf("用户所在楼层为: ");
scanf("%d", &floor);//此时按电梯的人所在的楼层数
printf("上楼请按 1 ,下楼请按 0: ");
scanf("%d", &dir);//用户请求是上楼还是下楼标记
printf("请选择要去的楼层: ");
scanf("%d", &gofloor);//用户要去的楼层
if (flag == 1)//用户按电梯
{
if (dir == 1)//用户要上楼
{
if (floor % 2 == 0)//用户所在为偶数楼层
{
if (gofloor % 2 == 1)//用户要去奇数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
if (gofloor % 2 == 0)//用户要去偶数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2 || a[i].type == 0)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
if (k[0] < k[2])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
else
{
if (k[1] < k[2])
{
printf("离用户最近并且符合条件的电梯为:2\n");
a[2].floor = gofloor;
a[2].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
}
}
if (floor % 2 == 1)//用户所在为奇数楼层
{
if (gofloor % 2 == 0)//用户要去偶数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
if (gofloor % 2 == 1)//用户要去奇数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2 || a[i].type == 1)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
if (k[0] < k[2])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
else
{
if (k[1] < k[2])
{
printf("离用户最近并且符合条件的电梯为:2\n");
a[1].floor = gofloor;
a[1].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
}
}
}
if (dir == 0)//用户要下楼
{
if (floor % 2 == 0)//用户所在为偶数楼层
{
if (gofloor % 2 == 1)//用户要去奇数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
if (gofloor % 2 == 0)//用户要去偶数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2 || a[i].type == 0)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
if (k[0] < k[2])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
else
{
if (k[1] < k[2])
{
printf("离用户最近并且符合条件的电梯为:2\n");
a[2].floor = gofloor;
a[2].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
}
}
if (floor % 2 == 1)//用户所在为奇数楼层
{
if (gofloor % 2 == 0)//用户要去偶数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
if (gofloor % 2 == 1)//用户要去奇数楼层
{
for (i = 0; i < 4; i++)
{
if (a[i].type == 2 || a[i].type == 1)
{
a[i].beixuyao = 1;
}
else
{
a[i].beixuyao = 0;
}
while (a[i].beixuyao == 1)
{
k[flag1] = Lookfor(i, floor, a[i].floor);
m[flag1] = i;
flag1++;
a[i].beixuyao = 0;
}
}
if (k[0] < k[1])
{
if (k[0] < k[2])
{
printf("离用户最近并且符合条件的电梯为:0\n");
a[0].floor = gofloor;
a[0].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
else
{
if (k[1] < k[2])
{
printf("离用户最近并且符合条件的电梯为:2\n");
a[1].floor = gofloor;
a[1].staus = 0;
}
else
{
printf("离用户最近并且符合条件的电梯为:3\n");
a[3].floor = gofloor;
a[3].staus = 0;
}
}
}
}
}
}
else if (flag == 0)
{
printf("此时无人用电梯");
}
printf(" ---- ---- ---- ---- \n");
printf(" | | | | | | | |\n");
printf(" %d %d %d %d \n", a[0].floor, a[1].floor, a[2].floor, a[3].floor);
printf(" | | | | | | | |\n");
printf(" ---- ---- ---- ---- \n");
printf("\n");
printf("----------------------------------------------\n");
}
}
队友评价:
张倩同学是我这次结对编程的搭档,大学做了三年的同学,从大一就是很好朋友,不存在任何交流障碍,班级同学与张倩的关系很融洽,都亲切的管张倩叫做倩姐!哈!
倩姐有很端正的学习态度,在这次编程的过程中也能很明显的表示出来,编程认真刻苦,有很强的逻辑能力,并且善于与对方进行讨论交流,因为双方都互相了解,所以在合作当中进行的很顺利,交流也很顺畅。
由于我的编程能力基础薄弱,倩姐帮助了我很多,并且寻求的其他同学的帮助。我们分工明确,编程过程中我主要负责审核和编写计算楼层差值函数的工作,在审核的过程中,我发现倩姐的编程格式很规范,心很细,有钻研精神,并且很有耐心,注重页面设计的美观,遇到问题不急不躁,把注意力全部集中到问题的解决上,手机震动时都不会打断她的解决问题的过程。但是我们俩有一个共同的缺点,就是编程的代码效率不高,也可以说代码编的过于繁杂,咎其原因,最主要的还是我们的知识能力不够,只能用现有的知识去完成这么难的程序,所以我们还有很长的路要走
总结:
这次编程作业对我们俩来说难度很大,虽然最后的结果不是很完美,但是我通过这次编程的过程学习到了很多,加强了专业课的学习,在实践过程中,学习到了课本中学不到的内容,对课本中不太明白的知识点也有了更深的理解,相信在以后的实践过程中能够更加熟练的运用知识。我们的程序还有很多需要改进的地方,比如界面不够美观,看了同学编写的程序界面,有按钮和图形显示,这是我们程序不完善的一部分。我们在课余时间要打算学习一下这方面的知识。
最后,这次结对作业对于我们来说都是一种全新的挑战,前两年的作业中,不管是课程设计还是实验,都是独自一人来完成的,而这次结对作业中,我们能发挥各自的优点,填补各自的不足,而且每个人的思维都是不一样的,所以在合作中能获得自己想不到的解题方法和思路,更重要的是队友之间的相互合作,所以这次作业对我们来说都受益匪浅,期待下一次的作业。
张倩的博客:http://www.cnblogs.com/zhangqian0310/