标签:
这次老师布置的是结队编程作业,这样我就可以了解一下别人的编程习惯和方法了,从而认识到自己的不足之处,学到更多有用的东西。
一、题目要求
现有一新建办公大厦,共有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.随时输入请求电梯
三、功能实现
1、电梯数据结构:
typedef struct elevator { int staus;//三种状态:静止,上行,下行 int type;//三种类型:双,单,全 int floor;//此时停在的楼层数 int beixuyao;//此楼层是否被调用 int flag;//是否有人用电梯 }B;
2、初始化函数:
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;//四号电梯所有楼层都停靠
4、查询电梯状态并计算与当前用户所在电梯相差的楼层数:
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("此电梯不能响应用户的请求"); } }
5.判断最近的电梯:
if (flag1 == 1) { if (k[j] < k[j + 1]) { printf("离用户最近并且符合条件的电梯为:%d\n", m[j]); a[m[j]].floor = gofloor; } else { printf("离用户最近并且符合条件的电梯为:%d\n", m[j + 1]); a[m[j + 1]].floor = gofloor; } } else if (flag1 == 2) { if (k[0] < k[1]) { if (k[0] < k[3]) { printf("离用户最近并且符合条件的电梯为:0\n"); a[0].floor = gofloor; } else { printf("离用户最近并且符合条件的电梯为:3\n"); a[3].floor = gofloor; } else { if (k[1] < k[3]) { printf("离用户最近并且符合条件的电梯为:1\n"); a[1].floor = gofloor; } else { printf("离用户最近并且符合条件的电梯为:3\n"); a[3].floor = gofloor; } } }
6.用户输入:
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);//用户要去的楼层
7.用户进入电梯:
if (flag == 1)//用户按电梯 { if (dir == 1)//用户要上楼 { if (floor % 2 == 0)//用户所在为偶数楼层 { if (gofloor % 2 == 1)//用户要去奇数楼层
8.电梯状态更新:
k[flag1] = Lookfor(i, floor, a[i].floor); m[flag1] = i; flag1++; a[i].beixuyao = 0; printf("离用户最近并且符合条件的电梯为:%d\n", m[j]); a[m[j]].floor = gofloor;
9.显示功能:
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"); }
10.主函数:
void main() { while (1) { .......... } }
四、调试分析
1、开始执行状态:
2.用户输入:
3.电梯显示的结果:
五.总结
1.整个电梯调度的程序:通过用户的输入来控制电梯,就是用户要上楼时分为:用户在奇数楼去偶数楼;用户要下楼时分为:用户在偶数楼要去奇数楼。在满足其中一个条件时就去查找符合条件的电梯,这时电梯的状态又分为:静止,上升,下降,在这三种状态里查找符合条件的电梯并一一计算出与用户当前所在电梯的楼层数的差值,然后回到主函数算出哪个差值最小的电梯,则启动该电梯,最终将它停在用户要求的楼层。这个程序里没有把电梯载重量考虑在内,我和队友会继续讨论下去,持续更新ing...
2.对队友的评价:老师刚刚布置完这个题目的时候,我真的头很大,要控制的条件真的太多了,对于编程能力较弱的我来说,任务真的是十分艰巨!!在我第一次和队员张舒瑞交谈怎么开始进行这次编程的时候,他给了我很多启发,那天也有很多其他同学一起帮我们想整个程序的大概结构,最终,终于理清思路,虽然最后的编程很繁琐,不简洁,但是这么难的程序我可以自己独立完成我自己的那部分,很感谢我的队友,很感谢帮助过我们的同学。
队友:张舒瑞 博客地址:http://www.cnblogs.com/bjzsr/p/5370268.html
标签:
原文地址:http://www.cnblogs.com/zhangqian0310/p/5372231.html