天天看点

结对编程作业——电梯调度

作业要求:

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

结对编程作业——电梯调度
结对编程作业——电梯调度