今天有个搞电子设计竞赛的来问我电梯的运行逻辑的C代码实现,我想到学数据结构那会用C/C++写过一个,不过好久自己现在也记不清了,直接就把源代码给他,让他自己看了。
想想自己马上要开始漫长艰苦的数模国赛集训,心情就不好啊。
这个测序运行后结果如下:(要源代码在下面,不过我把VS卸载了,今天本来想运行下那个.exe文件,结果没法运行了,说丢失MSVCP120.dll,不过有几张以前的截图)
这个代码可以以动画的形式:
1.实现电梯载人的逻辑规则
2.电梯实现开关门,保证该出去的人先出完然后该进来的人再进来,排除本层人去本层的情况
3.可以初始化电梯的任何开始位置(不过正常情况下应该初始化在最底层)
4.不断的在人运完后随机产生人(就像网游刷怪一样)
5.显示电梯的运行方向及所处的楼层
6.当人在楼道等电梯的时候圆圈(用圆圈代表人)内显示是上还是下,进入电梯后显示要去的层数
7.可以调节电梯运行速度及停留时间
现在看当时的代码,不忍直视。。。
代码如下(要想编译通过,记得要在VS2013的头文件里加个EasyX的图形库):
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<queue>
#include<vector>
#include<string.h>
using namespace std;
#define speed 30 //电梯速度调节
#define stay_time 1500//电梯停留时间调节
int tdt_a = 460, tdt_b = 550, dt_Now_Place = 0;//存储电梯某次载客完成后的信息
struct People
{
int Now_place;//人当前所处的层数
int Destination;//人所要去的目标层数
int index;//用这个标号便于在优先队列中实现让人入电梯和让人出电梯的操作
int x, y;//人在图中具体的坐标
}Peo[45];//在本程序中由于显示屏大小的限制所以最多显示45个人
struct cmp1//按起始位置从小到大排序
{
bool operator()(People a, People b)
{
return a.Now_place > b.Now_place;
}
};
struct cmp2//按目的地从小到大排列
{
bool operator()(People a, People b)
{
return a.Destination > b.Destination;
}
};
struct cmp3//按起始位置从大到小排序
{
bool operator()(People a, People b)
{
return a.Now_place < b.Now_place;
}
};
struct cmp4//按目的地从大到小排列
{
bool operator()(People a, People b)
{
return a.Destination < b.Destination;
}
};
struct Elevator
{
int a, b;//电梯当前位置具体坐标(上下两条线的y坐标)(a<b)
int c, d;
int Now_place;//电梯当前所处的层数
int Go_place;//电梯所要去的目标层数
int Direction;//电梯方向(-1表示未定,0表示向下,1表示向上)
int Peo_num;//电梯中的人数
int seat[8];
int flag;//表示电梯现在门是开的,还是关的(0表示关 1表示开)
}dt;
priority_queue<People, vector<People>, cmp1> q1;//按起始位置从小到大排序(只记录上楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp2> q2;//按目的地从小到大排列(只记录上楼的人,出电梯的时候用)
//当情况不连续的时候使用的队列
priority_queue<People, vector<People>, cmp1> q5;//按起始位置从小到大排序(只记录上楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp2> q6;//按目的地从小到大排列(只记录上楼的人,出电梯的时候用)
priority_queue<People, vector<People>, cmp3> q3;//按起始位置从大到小排序(只记录下楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp4> q4;//按目的地从大到小排列(只记录下楼的人,出电梯的时候用)
//当情况不连续的时候使用的队列
priority_queue<People, vector<People>, cmp3> q7;//按起始位置从大到小排序(只记录下楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp4> q8;//按目的地从大到小排列(只记录下楼的人,出电梯的时候用)
void Init_people()
{
int Peo_num[5];//存储每层电梯随机产生的人数(最多9个人)
int Peo_y[5][3] = { 535, 505, 475, 435, 405, 375, 335, 305, 275, 235, 205, 175, 135, 105, 75 };//把人所处的(圆心)y坐标存在数组里,方便一点
int Peo_x[3] = { 330, 360, 390 };//人所处位置的x坐标(用圆表示人,即圆心坐标)
srand((unsigned)time(NULL));//播种子
while (!q1.empty())//队列初始化
{
q1.pop();
}
while (!q2.empty())
{
q2.pop();
}
while (!q3.empty())//队列初始化
{
q3.pop();
}
while (!q4.empty())
{
q4.pop();
}
while (!q5.empty())//队列初始化
{
q5.pop();
}
while (!q6.empty())
{
q6.pop();
}
while (!q7.empty())//队列初始化
{
q7.pop();
}
while (!q8.empty())
{
q8.pop();
}
for (int i = 0; i < 5; i++)
{
Peo_num[i] = rand() % 4;//随机