博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结对编程作业——电梯调度
阅读量:6819 次
发布时间:2019-06-26

本文共 15430 字,大约阅读时间需要 51 分钟。

作业要求:

现有一新建办公大厦,共有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
#include
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/

转载于:https://www.cnblogs.com/bjzsr/p/5370268.html

你可能感兴趣的文章
如何在windows2008/2012上安装启明星系统。
查看>>
过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(内测第2届第2题)...
查看>>
IE6中让png的icon图标也透明的完整代码段
查看>>
***微信LBS地理位置开发+百度地图API(地理位置和坐标转换)
查看>>
如何获得WPA握手包&EWSA破解WPA密码教程[zz]
查看>>
CountDownTimer,0,0
查看>>
mac 终端 常用命令
查看>>
对VM挂载新加入的磁盘
查看>>
MyEclipse *的安装步骤和破解(32位和64位皆适用)(图文详解)
查看>>
如何撤销 PhpStorm/Clion 等 JetBrains 产品的 “Mark as Plain Text” 操作 ?
查看>>
利用RTMFP开发P2P应用
查看>>
使用maven创建web项目
查看>>
第三十八章 springboot+docker(maven)
查看>>
构建单页面应用
查看>>
BZOJ4078 : [Wf2014]Metal Processing Plant
查看>>
变量的数据类型的转换
查看>>
codevs1022 覆盖[Hungary 二分图最大匹配]
查看>>
mybatis同时启用mapperscanner和传统DAO
查看>>
Spring AOP 通过order来指定顺序
查看>>
记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
查看>>