这次老师布置的是结队编程作业,这样我就可以了解一下别人的编程习惯和方法了,从而认识到自己的不足之处,学到更多有用的东西。
一、题目要求
现有一新建办公大厦,共有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.随时显示各个电梯所在的层数。
三、功能实现
1.电梯数据结构:a[4]数组存四部电梯。并定义了flag, dir, floor, gofloor,c[3], k[3], m[3]等全局变量
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];
2.初始化函数:电梯的初始状态a[].staus,电梯初始停靠的楼层a[].floor,电梯的类型a[].type
a[0].staus = 0;//静止 a[1].staus = 0;//静止 a[2].staus = 0;//静止 a[3].staus = 0;//静止 a[0].floor = -1;//表示此时电梯停在的楼层数为-1楼 a[1].floor = 7;//表示此时电梯停在的楼层数为7楼 a[2].floor = 14;//表示此时电梯停在的楼层数为14楼 a[3].floor = 20;//表示此时电梯停在的楼层数为20楼 a[0].type = 2;//一号电梯所有楼层都停靠 a[1].type = 1;//二号电梯单号楼层都停靠 a[2].type = 0;//三号电梯双号楼层都停靠 a[3].type = 2;//四号电梯所有楼层都停靠
3.计算楼层差值函数:当找到符合用户请求的电梯时就进入此函数,计算此电梯楼层数与用户所在楼层数的差值,用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; }
4.用户输入:用户需要输入:flag 用户是否请求电梯,floor 用户所在楼层数,dir 用户是上楼还是下楼,gofloor 用户要去的楼层数。
int i; int flag1 = 0, j = 0; printf("---------------------------------------------- "); printf("若要用电梯请按按钮 1 ! "); scanf("%d", &flag);//“1”有人按电梯 if (flag == 1) { printf("*****此时有用户按电梯!***** "); } printf("用户所在楼层为: "); scanf("%d", &floor);//此时按电梯的人所在的楼层数 printf("上楼请按 1 ,下楼请按 0: "); scanf("%d", &dir);//用户请求是上楼还是下楼标记 printf("请选择要去的楼层: "); scanf("%d", &gofloor);//用户要去的楼层
5.进入主函数:此处分为两大种情况:按电梯---上楼——用户在偶数层请求:去奇数层 or 偶数层;按电梯---下楼——用户在奇数层请求:去奇数层 or 偶数层。下面只列举了用户在偶数层去奇数层的这一部分,其他的如法炮制,改一小部分即可,这是是整个代码最繁琐的地方。
当符合了上面任意一种情况时,我们就能筛选出只有0号电梯和3号电梯符合条件,则将他两的:a[i].beixuyao=1 ,就进入whie(a[i].beixuyao=1)里,用k[flag1]数组记录0,3号电梯所在楼层数与用户所在楼层数的差值,用 m[flag1] 记录电梯的标号0和3,用 flag1 记录符合条件的楼层数,每记录完一个电梯,就将 a[i].beixuyao=0。
已知用户在偶数层去奇数层所以只有0和3号电梯符合条件,则只需要比较一次k[flag1],找出最小的那个并将 a[0].floor = gofloor or a[3].floor = 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); a[3].floor = gofloor; a[3].staus = 0; } }
6.显示功能:
else if (flag == 0) { printf("此时无人用电梯"); } printf(" ---- ---- ---- ---- "); printf(" | | | | | | | | "); printf(" %d %d %d %d ", a[0].floor, a[1].floor, a[2].floor, a[3].floor); printf(" | | | | | | | | "); printf(" ---- ---- ---- ---- "); printf(" "); printf("---------------------------------------------- "); }
四、调试分析
1、开始执行状态:
2.用户输入:
3.电梯显示的结果:
附录(完整源代码):
#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(" ---- ---- ---- ---- "); printf(" | | | | | | | | "); printf(" -1 7 14 20 "); printf(" | | | | | | | | "); printf(" ---- ---- ---- ---- "); a[0].staus = 0;//静止 a[1].staus = 0;//静止 a[2].staus = 0;//静止 a[3].staus = 0;//静止 a[0].floor = -1;//表示此时电梯停在的楼层数为-1楼 a[1].floor = 7;//表示此时电梯停在的楼层数为7楼 a[2].floor = 14;//表示此时电梯停在的楼层数为14楼 a[3].floor = 20;//表示此时电梯停在的楼层数为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("---------------------------------------------- "); printf("若要用电梯请按按钮 1 ! "); scanf("%d", &flag);//此时是否有人按电梯 if (flag == 1) { printf("*****此时有用户按电梯!***** "); } 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); a[3].floor = gofloor; a[3].staus = 0; } } else { if (k[1] < k[2]) { printf("离用户最近并且符合条件的电梯为:2 "); a[2].floor = gofloor; a[2].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); a[3].floor = gofloor; a[3].staus = 0; } } else { if (k[1] < k[2]) { printf("离用户最近并且符合条件的电梯为:2 "); a[1].floor = gofloor; a[1].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); a[3].floor = gofloor; a[3].staus = 0; } } else { if (k[1] < k[2]) { printf("离用户最近并且符合条件的电梯为:2 "); a[2].floor = gofloor; a[2].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); 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 "); a[0].floor = gofloor; a[0].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); a[3].floor = gofloor; a[3].staus = 0; } } else { if (k[1] < k[2]) { printf("离用户最近并且符合条件的电梯为:2 "); a[1].floor = gofloor; a[1].staus = 0; } else { printf("离用户最近并且符合条件的电梯为:3 "); a[3].floor = gofloor; a[3].staus = 0; } } } } } } else if (flag == 0) { printf("此时无人用电梯"); } printf(" ---- ---- ---- ---- "); printf(" | | | | | | | | "); printf(" %d %d %d %d ", a[0].floor, a[1].floor, a[2].floor, a[3].floor); printf(" | | | | | | | | "); printf(" ---- ---- ---- ---- "); printf(" "); printf("---------------------------------------------- "); } }
五.总结
1.整个电梯调度的程序:通过用户的输入来控制电梯,就是用户要上楼时分为:用户在奇数楼去偶数楼;用户要下楼时分为:用户在偶数楼要去奇数楼。在满足其中一个条件时就去查找符合条件的电梯,这时电梯的状态又分为:静止,上升,下降,在这三种状态里查找符合条件的电梯并一一计算出与用户当前所在电梯的楼层数的差值,然后回到主函数算出哪个差值最小的电梯,则启动该电梯,最终将它停在用户要求的楼层。这个程序里没有把电梯载重量考虑在内,我和队友会继续讨论下去,持续更新ing...
2.对队友的评价:老师刚刚布置完这个题目的时候,我真的头很大,要控制的条件真的太多了,对于编程能力较弱的我来说,任务真的是十分艰巨!!在我第一次和队员张舒瑞交谈怎么开始进行这次编程的时候,他给了我很多启发,那天也有很多其他同学一起帮我们想整个程序的大概结构,最终,终于理清思路,虽然最后的编程很繁琐,不简洁,但是这么难的程序我可以自己独立完成我自己的那部分,很感谢我的队友,很感谢帮助过我们的同学。
队友:张舒瑞 博客地址:http://www.cnblogs.com/bjzsr/p/5370268.html