结对编程 电梯调度程序

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

这是这次的题目,感觉操控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;
}
}

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

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

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

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

然后电梯开始运行。

然后到达所在楼层。

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

这个电梯基本的功能已经展示,但是还是有一些需要修改的地方。像电梯每次只能进一个人,这也是我们当时考虑的失误,程序很难更改,认识到软件做之前必须要将所有情况加以考虑,另外,我们没有实现图形化显示,也有点遗憾。

总之通过这次结对编程,我认识到了自己身上严重的不足,找到了自身与别人的差距,我不能在继续这样下去,希望以后还能像缪湾湾同学这样的高手请教,希望自己获的更大的提升。

最后附上一张照片

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

时间: 2024-12-28 09:46:41

结对编程 电梯调度程序的相关文章

结对编程——电梯调度 总结

结对成员:口平音 阮磊 coding系统地址:https://coding.net/user?key=2e63bb37-ddda-401d-8763-5c9ce6b1e8e7 口平音cnblogs主页地址:http://home.cnblogs.com/u/199489KPY/ 注:关于这次结对编程的程序我觉着我的队友口平音同学(请允许我下文用“口”来代替,日常习惯于这样称呼)已经进行了详细的解释,请老师点击 http://www.cnblogs.com/199489KPY/p/5364383.

结对编程--电梯调度算法

1.需求分析: 实现电梯调度算法,预先输入乘坐电梯人数.每个人的起始楼层和到达楼层以及当前电梯所在楼层,电梯会根据算法依次将所有人员接入电梯并送至其重点楼层. 2.代码截图 3.约定的规范 使用Tab制表符 每行不超过100 {}另起一行 规范示例: 4.记录时间 命题讨论:1h 思路分析:1h 代码编写:24h 程序测试:2h 博客记录:1h 5.心得体会 结对编程可以通过自己的parterner来发现自己之前的不足,矫正错误 通过电梯调度算法,复习了数据结构和C语言的指针,结构体等

结对编程—电梯调度

电梯调度 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示: 电梯编号 可服务楼层 最大乘客数量 最大载重量 1 全部楼层 10 800 kg 2 单层 10 800 kg 3 双层 20 1600 kg 4 全部楼层 20 2000 kg 其使用规定如下: 1.楼层号为0~20,其中0号为地下一层: 2.有楼层限制的电梯不在响应楼层停靠,如单双层: 3.所有电梯采用统一按钮控制 请根据上述要求设计并实现一个电梯控制程序, 程序思想及解决办法 1.楼层问题及解决办法:先定

结对编程-电梯调度

这次编程和前几次不同,这次是结对编程,就是一个人编码,一个人负责审查,两个人编程过程中要交换角色,不能全程一个人编程而另一个人只审查.我的结对队员是张心语.他是一个活泼开朗的大男孩,也是一个文艺小青年.可能是考研的原因,或者是其它什么原因,这次结对效果不是太理想,我多次找过他但他说有事,所以整个结对编程基本就是我一人在整,就连最后拍的结对照片也是为了满足老师的要求.虽然没有达到老师期望的结果,但我依然收获很大.从一开始看的题目的无从下手,到与人交流,再到最后编码,成长了很多,编程能力也得到了进一

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

作业内容:电梯调度 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示: 电梯编号 可服务楼层 最大乘客数量 最大载重量 1 全部楼层 10 800 kg 2 单层 10 800 kg 3 双层 20 1600 kg 4 全部楼层 20 2000 kg 其使用规定如下: 1.楼层号为0~20,其中0号为地下一层: 2.有楼层限制的电梯不在响应楼层停靠,如单双层: 3.所有电梯采用统一按钮控制 请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了. 这次作业是结对

结对编程-电梯调度2

这次老师布置的是结队编程作业,这样我就可以了解一下别人的编程习惯和方法了,从而认识到自己的不足之处,学到更多有用的东西. 一.题目要求 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示: 电梯编号 可服务楼层 最大乘客数量 最大载重量 1 全部楼层 10 800 kg 2 单层 10 800 kg 3 双层 20 1600 kg 4 全部楼层 20 2000 kg 其使用规定如下: 1.楼层号为0~20,其中0号为地下一层: 2.有楼层限制的电梯不在响应楼层停靠,如单双层

结对编程——电梯调度系统 的 感想与总结

对于这次的结对任务,因为本身自己不在学校,所以没有很好的办法和我的队友们进行沟通交流,所以我的任务是确立实现方法,和提出算法,这里非常感谢我的两个队友,他们非常的负责,作为一个TEAM,非常好的完成了这里任务,将自己的力量发挥到了最大. 对这次任务的感触就是,以前都是自己一个人做一个程序啊,任务啊,很少和一个或者几个人来进行这种合作,大家的意见非常的重要,只有互相沟通,交流才能提出最好的意见和看法. 对于我的队友张腾宵同学对于bug修改的态度,非常的让我感动,为了一个bug,反复进行研究,这种态

电梯调度程序结对编程

结对人员:马佐霖  王迪 1.结对编程    1.1结对编程优缺点 (1)首先应该是结对编程的高效率了,结对编程的时候,两个人可以分开做不同的unit,也可以同时做相同的unit.在项目的一些简单的unit,一个人能够很简单的unit就可以分给不同的人去做:对于核心的unit,比如说此次项目电梯调度的算法部分,这是一个核心的部分,需要我们共同讨论,经过讨论后再去实现,或者两个人分别写出自己的想法,用代码实现,这时候,综合两个人效率高的那个人的算法.另外,在结对编程时候,有一定相互监督作用,比起一

结对编程之电梯调度

编程任务:电梯调度 结对人员:左少辉-12061209,杨昊兰-12061202,吕雨朗 一.此次软工作业确实是让人却步的不敢开始,不过结对编程使得我对完成作业又有了信心,开始没有积极组队的我落单了,后来只能是申请加入已经组好的队伍,所以我们其实是一个三人组,都说人多力量大,想法也就会开阔许多,做起作业来也会顺利许多.起初对作业不是很了解,光是看英文要求就已经醉了,后来还是硬着头皮开始了漫长的代码阅读,浅学c#觉得语法也就一般般,不过看到如此绚丽的代码还是各种懵~确实一个人做起来简直是困难,但是