这次老师安排的是结对编程作业,也是第一次接触两人结对编程,感觉比较新鲜,有感觉难以入手,在经过协商之后,我们一起完成了我们的编程作业,感觉到很开心,也体会到合作的愉快,这是我们这次的成果。
这是这次的题目,感觉操控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;
}
}
这是实现电梯的超载设定。
然后还有进入电梯,出电梯,设定层数,更新电梯状态,判断是否到达相应楼层,判断使用哪部电梯的子函数等等,来实现这个电梯调度。在程序中已经标注,不再意义列举。
接下来进行电梯程序的演示。
这是第一个输入,输入所在的电梯层数和电梯方向。
然后电梯开始运行。
然后到达所在楼层。
然后还可以输入多个进入电梯。
这个电梯基本的功能已经展示,但是还是有一些需要修改的地方。像电梯每次只能进一个人,这也是我们当时考虑的失误,程序很难更改,认识到软件做之前必须要将所有情况加以考虑,另外,我们没有实现图形化显示,也有点遗憾。
总之通过这次结对编程,我认识到了自己身上严重的不足,找到了自身与别人的差距,我不能在继续这样下去,希望以后还能像缪湾湾同学这样的高手请教,希望自己获的更大的提升。
最后附上一张照片
希望以后能够有一些机会,继续像别人学习。