天天看點

結對程式設計作業——電梯排程

作業要求:

現有一建立辦公大廈,共有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/

結對程式設計作業——電梯排程
結對程式設計作業——電梯排程