结对编程 电梯调度程序

   这次老师安排的是结对编程作业,也是第一次接触两人结对编程,感觉比较新鲜,有感觉难以入手,在经过协商之后,我们一起完成了我们的编程作业,感觉到很开心,也体会到合作的愉快,这是我们这次的成果。

这是这次的题目,感觉操控4个电梯比较困难,而且考虑情况很多,所以我们在做了很多的构想以后,我们才开始编写程序。

  1 #include<iostream>
  2 #include<Windows.h>
  3 #include <conio.h>
  4 using namespace std;
  5 struct elevator
  6 {
  7     int maxPeople;
  8     int nowPeople;
  9     int ifFloor;//已满1、未满0
 10     int serveFloor;//全部3、单层1、双层0
 11     int outPeople[21];
 12     int inPeople[21];
 13     int staut;//上升1、下降-1、停止0
 14     int floor;
 15 };
 16 struct elevator a[4];
 17 int number(int x)//取绝对值
 18 {
 19     if (x < 0)
 20         return -x;
 21     else
 22         return x;
 23 }
 24 void Iint()//各个电梯初始化
 25 {
 26     for (int i=0; i < 4; i++)
 27     {
 28         for (int j = 0; j < 21; j++)
 29         {
 30             a[i].inPeople[j] = -1;
 31             a[i].outPeople[j] = -1;
 32         }
 33         a[i].nowPeople = 0;
 34         a[i].ifFloor = 0;
 35     }
 36     a[0].maxPeople = 10;
 37     a[0].serveFloor = 3;
 38     a[0].staut = 0;
 39     a[0].floor = 20;
 40     a[1].maxPeople = 10;
 41     a[1].serveFloor = 1;
 42     a[1].staut = 0;
 43     a[1].floor = 9;
 44     a[2].maxPeople = 20;
 45     a[2].serveFloor = 0;
 46     a[2].staut = 0;
 47     a[2].floor = 10;
 48     a[3].maxPeople = 20;
 49     a[3].serveFloor = 3;
 50     a[3].staut = 0;
 51     a[3].floor = 1;
 52 }
 53 void gotoxy(HANDLE hOut, int x, int y)//光标移到指定位置
 54 {
 55     COORD pos;
 56     pos.X = x;             //横坐标
 57     pos.Y = y;            //纵坐标
 58     SetConsoleCursorPosition(hOut, pos);
 59 }
 60 void ifFull(int i)//判断电梯是否超载
 61 {
 62     if (a[i].maxPeople < a[i].nowPeople)
 63     {
 64         HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 65         gotoxy(hOut, 0, 4);
 66         cout << "电梯已满!" << endl;
 67         Sleep(1000);
 68         gotoxy(hOut, 0, 4);
 69         cout << "                                                      ";
 70         a[i].ifFloor = 1;
 71         return;
 72     }
 73     else
 74     {
 75         a[i].ifFloor = 0;
 76         return;
 77     }
 78 }
 79 void getIn(int i)//进入电梯
 80 {
 81     a[i].outPeople[a[i].floor] = -1;
 82     int flag1, flag2;
 83     flag1 = 1;
 84     flag2 = 1;
 85     for (int j = 0; j < 21; j++)//电梯是否需要继续运行
 86     {
 87         if (flag1 == 1 && a[i].inPeople[j] == -1)
 88             continue;
 89         else
 90         {
 91             flag1 = 0;
 92             break;
 93         }
 94     }
 95     for (int j = 0; j < 21; j++)
 96     {
 97         if (flag2 == 1 && a[i].outPeople[j] == -1)
 98             continue;
 99         else
100         {
101             flag2 = 0;
102             break;
103         }
104     }
105     if (flag1 == 1 && flag2 == 1)
106         a[i].staut = 0;
107     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量
108     int f;
109     gotoxy(hOut, 0, 3);
110     cout << "输入目的层数";
111     cin >> f;
112     gotoxy(hOut, 0, 3);
113     cout << "                                                      ";
114     if (f % 2 == a[i].serveFloor || a[i].serveFloor == 3)//此电梯是否到目的层
115     {
116         a[i].nowPeople++;
117         ifFull(i);
118         if (a[i].staut == 0)//电梯如果是暂停状态,更改目的状态
119         {
120             if (a[i].floor > f)
121                 a[i].staut = -1;
122             if (a[i].floor < f)
123                 a[i].staut = 1;
124         }
125         a[i].inPeople[f] = 1;//标记目的层数
126     }
127     else
128     {
129         HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
130         gotoxy(hOut, 0, 4);
131         cout << "此电梯不到目的层";
132         Sleep(1000);
133         gotoxy(hOut, 0, 4);
134         cout << "                                                      ";
135     }
136 }
137 void getOut(int i)//出电梯
138 {
139     a[i].nowPeople--;
140     ifFull(i);
141     a[i].inPeople[a[i].floor] = -1;
142 }
143 void display()//结果显示
144 {
145     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量
146     for (int i = 0, j = 0; i < 4; i++,j=j+6)
147     {
148         gotoxy(hOut, j, 0);
149         if (a[i].staut == 1)
150         {
151             if (a[i].floor>=10)
152                 cout << "" << a[i].floor;
153             else
154                 cout << "↑0" << a[i].floor;
155         }
156         if (a[i].staut == 0)
157         {
158             if (a[i].floor >= 10)
159                 cout << "__" << a[i].floor;
160             else
161                 cout << "__0" << a[i].floor;
162         }
163         if (a[i].staut == -1)
164         {
165             if (a[i].floor >= 10)
166                 cout << "" << a[i].floor;
167             else
168                 cout << "↓0" << a[i].floor;
169         }
170     }
171 }
172 void change()//更新电梯状态
173 {
174     int flag1, flag2, i;
175     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量
176     for (i = 0; i < 4; i++)
177     {
178         flag1 = 1;
179         flag2 = 1;
180         if (a[i].staut == 1)//上升状态的电梯
181         {
182             if (a[i].inPeople[a[i].floor] == 1)
183             {
184                 gotoxy(hOut, 0, 4);
185                 cout << a[i].floor << "到了! 乘客出电梯";
186                 Sleep(1000);
187                 gotoxy(hOut, 0, 4);
188                 cout << "                                                      ";
189                 getOut(i);
190             }
191             if (a[i].outPeople[a[i].floor] == 1)
192             {
193                 gotoxy(hOut, 0, 4);
194                 cout << a[i].floor << "到了! 乘客进入电梯";
195                 Sleep(1000);
196                 gotoxy(hOut, 0, 4);
197                 cout << "                                                      ";
198                 getIn(i);
199             }
200             for (int j = 0; j < 21; j++)//判断电梯是否需要继续运行
201             {
202                 if (flag1 == 1 && a[i].inPeople[j] == -1)
203                     continue;
204                 else
205                 {
206                     flag1 = 0;
207                     break;
208                 }
209             }
210             for (int j = 0; j < 21; j++)
211             {
212                 if (flag2 == 1 && a[i].outPeople[j] == -1)
213                     continue;
214                 else
215                 {
216                     flag2 = 0;
217                     break;
218                 }
219             }
220             if (flag1 == 1 && flag2 == 1)
221                 a[i].staut = 0;
222             else
223                 a[i].floor++;//电梯继续上行
224         }
225         if (a[i].staut == -1)//下降状态的电梯
226         {
227             if (a[i].inPeople[a[i].floor] == 1)
228             {
229                 gotoxy(hOut, 0, 4);
230                 cout << a[i].floor << "到了! 乘客出电梯";
231                 Sleep(1000);
232                 gotoxy(hOut, 0, 4);
233                 cout << "                                                      ";
234                 getOut(i);
235             }
236             if (a[i].outPeople[a[i].floor] == 1)
237             {
238                 gotoxy(hOut, 0, 4);
239                 cout << a[i].floor << "到了! 乘客进入电梯";
240                 Sleep(1000);
241                 gotoxy(hOut, 0, 4);
242                 cout << "                                                      ";
243                 getIn(i);
244             }
245             for (int j = 0; j < 21; j++)//电梯是否需要继续运行
246             {
247                 if (flag1 == 1 && a[i].inPeople[j] == -1)
248                     continue;
249                 else
250                 {
251                     flag1 = 0;
252                     break;
253                 }
254             }
255             for (int j = 0; j < 21; j++)
256             {
257                 if (flag2 == 1 && a[i].outPeople[j] == -1)
258                     continue;
259                 else
260                 {
261                     flag2 = 0;
262                     break;
263                 }
264             }
265             if (flag1 == 1 && flag2 == 1)
266                 a[i].staut = 0;
267             else
268                 a[i].floor--;//电梯继续下降
269         }
270     }
271     display();
272 }
273 int ifSever(int floor, int direction, int elevator)//判断电梯是否相应此用户
274 {
275     if (a[elevator].ifFloor == 0)//不超载
276     {
277         if (a[elevator].serveFloor == 3 || floor % 2 == a[elevator].serveFloor)//全部和双层
278         {
279             if (a[elevator].staut == 0)//停止状态
280                 return 1;
281             if (a[elevator].staut == 1 && a[elevator].staut == direction)//上升且用户也上升
282             {
283                 if (a[elevator].floor <= floor)
284                     return 1;
285                 else
286                     return 0;
287             }
288             if (a[elevator].staut == -1 && a[elevator].staut == direction)//下降且用户也下降
289             {
290                 if (a[elevator].floor >= floor)
291                     return 1;
292                 else
293                     return 0;
294             }
295             return 0;
296         }
297         else
298             return 0;
299     }
300     else
301         return 0;
302 }
303 int search(int floor,int direction)//查询哪个电梯为用户服务
304 {
305     int min[4] = { 100, 100, 100, 100 };
306     int flag;
307     int x;
308     for (int i = 0; i < 4; i++)
309     {
310         flag = ifSever(floor, direction, i);
311         if (flag==1)//计算电梯运行距离
312         {
313             x = a[i].floor - floor;
314             min[i] = number(x);
315         }
316         else
317             continue;
318     }
319     int temp, num;
320     temp = min[0];
321     num = 0;//标记电梯号
322     for (int i = 1; i < 4; i++)//计算最近楼层
323     {
324         if (min[i] < temp)
325         {
326             temp = min[i];
327             num = i;
328         }
329     }
330     if (temp != 100)
331     {
332         a[num].outPeople[floor] = 1;
333         if (a[num].staut==0)
334         {
335             if (a[num].floor > floor)
336                 a[num].staut = -1;
337             if (a[num].floor < floor)
338                 a[num].staut = 1;
339             if (a[num].floor == floor)
340                 a[num].staut = direction;
341         }
342         return 1;
343     }
344     return 0;
345 }
346 void Inset()//用户输入
347 {
348     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//定义显示器句柄变量
349     int peopleFloor, peopleDirection, flag;
350     gotoxy(hOut, 0, 2);
351     cout << "输入请求的楼层数和方向(1为向上,-1为向下)";
352     cin >> peopleFloor;
353     cin >> peopleDirection;
354     gotoxy(hOut, 0, 2);
355     cout << "                                                      ";
356     flag = search(peopleFloor, peopleDirection);
357     if (flag == 1)//如果查询到服务的电梯
358         return;
359     else
360     {
361         while (flag == 0)
362         {
363             change();
364             flag = search(peopleFloor, peopleDirection);
365         }
366     }
367 }
368 void main()
369 {
370     Iint();
371     display();
372     char c;
373     while (1)
374     {
375         HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
376         gotoxy(hOut, 0, 1);
377         cout << "是否输入";
378         cin >> c;
379         if (c == 'y')
380             Inset();
381         change();
382     }
383     system("pause");
384 }

这是这次的代码很难想象,我以前没有编写过这么长的代码,感觉写完以后,非常感慨,这是在同伴缪湾湾同学的大力努力下,我们终于完成了这个程序。

首先是一个电梯的结构体,这是标志着电梯的参数,便于在电梯的调度中使用。

struct elevator
{
int maxPeople;
int nowPeople;
int ifFloor;//已满1、未满0
int serveFloor;//全部3、单层1、双层0
int outPeople[21];
int inPeople[21];
int staut;//上升1、下降-1、停止0
int floor;
};

这样就可以实现对电梯的调度。

接下来是对电梯参数的初始化,需要对电梯进行一些参数的赋值。

void Iint()//各个电梯初始化
{
for (int i=0; i < 4; i++)
{
for (int j = 0; j < 21; j++)
{
a[i].inPeople[j] = -1;
a[i].outPeople[j] = -1;
}
a[i].nowPeople = 0;
a[i].ifFloor = 0;
}
a[0].maxPeople = 10;
a[0].serveFloor = 3;
a[0].staut = 0;
a[0].floor = 20;
a[1].maxPeople = 10;
a[1].serveFloor = 1;
a[1].staut = 0;
a[1].floor = 9;
a[2].maxPeople = 20;
a[2].serveFloor = 0;
a[2].staut = 0;
a[2].floor = 10;
a[3].maxPeople = 20;
a[3].serveFloor = 3;
a[3].staut = 0;
a[3].floor = 1;
}

在完成电梯的赋值以及设定以后,开始建立子函数来实现电梯的功能。

void ifFull(int i)//判断电梯是否超载
{
if (a[i].maxPeople < a[i].nowPeople)
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(hOut, 0, 4);
cout << "电梯已满!" << endl;
Sleep(1000);
gotoxy(hOut, 0, 4);
cout << " ";
a[i].ifFloor = 1;
return;
}
else
{
a[i].ifFloor = 0;
return;
}
}

这是实现电梯的超载设定。

然后还有进入电梯,出电梯,设定层数,更新电梯状态,判断是否到达相应楼层,判断使用哪部电梯的子函数等等,来实现这个电梯调度。在程序中已经标注,不再意义列举。

接下来进行电梯程序的演示。

这是第一个输入,输入所在的电梯层数和电梯方向。

然后电梯开始运行。

然后到达所在楼层。

然后还可以输入多个进入电梯。

     我的结对编程队员是缪湾湾同学,她是一个非常认真的同学,在编程的时候一丝不苟,兢兢业业。在我们第一日的合作中,我们在一起讨论,在讨论完毕后,缪湾湾同学一口气编写了5个小时的程序,连中午饭都没有吃,她的认真态度感染着我,我是一个不是太能够专心的人,总是感觉坐不住,感觉整个人比较的飘,通过结对编程,我深深的明白了一个道理,那就是在编程这条道路上要想要走的更远,就必须坚实的坐下来,认认真真的编写程序,不能投机取巧,总是想着困难有多少,总是感觉不会做,到了工作之后,谁又能帮助你做这些事呢。同时,我的编程习惯不太严谨,这也是在和缪湾湾同学的合作中发现的一个巨大的问题,我觉的这个问题如果不加以改正,那么在以后的编写程序过程中,就很难于其他程序人员很好的合作,总之通过这次结对编程,我认识到了自己身上严重的不足,找到了自身与别人的差距,我不能在继续这样下去,希望以后还能像缪湾湾同学这样的高手请教,希望自己获的更大的提升。

    在这次的编写过程中,我们经过了热烈的讨论,我写了前面的用户显示和显示函数,对于核心的调度函数,我们进行了激烈的讨论,由于算法的问题,我的算法存在一定的问题,在讨论的过程中,最终采用了缪湾湾同学的调度算法,再加上一定的更改,我们最后完成了我们的程序。

     这个电梯基本的功能已经展示,但是还是有一些需要修改的地方。像电梯每次只能进一个人,这也许是我们的一个失误,我们觉的要是加以修改的话,可能需要我们的程序中添加循环,我们会在之后试一下我们的程序改进。另外,我们没有实现图形化显示,也有点遗憾。总之,我们以后如果有机会的话,我们一定会做的更好。同时,通过这次的结对编程,我和缪湾湾同学成为了更好的朋友,为以后的更好向她学习,建立了良好的友谊关系,希望以后还能多多请教。

队友的博客地址:

 缪湾湾:博客链接:http://www.cnblogs.com/mww123/p/5370283.html

   

最后附上一张照片

希望以后能够有一些机会,继续像别人学习。

原文地址:https://www.cnblogs.com/niuniu11/p/5370409.html