结对编程作业——电梯调度
作业要求:
现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示:
电梯编号 |
可服务楼层 |
最大乘客数量 |
最大载重量 |
1 |
全部楼层 |
10 |
800 kg |
2 |
单层 |
10 |
800 kg |
3 |
双层 |
20 |
1600 kg |
4 |
全部楼层 |
20 |
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/