数据结构大型实验报告—机场航空管制模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机场航空管制模拟
姓名
学号
班级
完成日期:2011.12.16
一、实验内容分析
1.明确实验题目目的
【问题描述】假设机场有一条跑道,每架飞机需花费一定时间着陆,花费一定时间起飞,飞机的起降满足一定的概率。一般来讲,机场存在两个队列,一个等待着陆的飞机队列和一个等待起飞的飞机队列,同样等待时间下,等待着陆的飞机比准备起飞的飞机具有更高的优先级。试编写程序模拟这个机场的运行。
【基本要求】使用队列或优先队列实现;要求可以变换起飞和着陆频率来模拟一天中的飞行高峰期和空闲期;要求可以改变着陆和起飞时间以模拟不同的效果。
【实现提示】可以假设有一个每次前进一分钟的模拟时钟,对于每一分钟,产生两个随机数:如果第一个随机数小于landingRate/60,那么一个“着陆到达”将发生并被添加到着陆队列中;如果第二个随机数小于takeOffRate/60,那么一个“起飞到达”将发生并被添加到起飞队列中。接着,检查跑道是否空闲。若空闲,首先检查着陆队列是否为非空,如果是,允许第一架飞机着陆;否则,处理起飞队列。
【运行结果要求】要求能在指定的时间内(如9:00-22:00)完成系统模拟,并计算出跑道的繁忙程度、着陆飞机的总的等待时间和平均等待时间、起飞飞机的总的等待时间和平均等待时间, 计算每架飞机花费在一个队列中的平均时间。
2.类
string mintime0Turn(int mintime) //////////若时刻的分位数值小于10,则前面自动置0
{
if (mintime%60<10) return "0";
return "";
}
class Plane{
public:
int applyTime,completeTime;
Plane(int a=0,int c=0)
{
applyTime=a;
completeTime=c;
}
};
class comp //////////设置优先级比较,先申请起降的飞机的优先级高
{
public:
bool operator()(Plane p1,Plane p2)
{
return p1.applyTime>p2.applyTime;
}
};
class Simulation
{
public:
Simulation();
void run(); //模拟运行
void print();//打印运行结果
private:
int workingTime; //跑道处于工作状态的时间
int landingRate,takeOffRate; //飞机起降频率
int landingTime,takeOffTime; //飞机起降耗时
int beginTime,endTime; //模拟起止时刻
int currTime,nextfreeTime; //当前时刻、下次跑道处于空闲状态的时刻
int waitingforlandingTime,waitingfortakeOffTime;//等待起降的总时间
int landingPass,takeOffPass; //处理起降的次数
int unfinishedlanding,unfinishedtakeOff; //未完成的起降申请
priority_queue
};
3.程序流程图
二、实验验证分析及测试结果1输入的形式和输入值的范围:
飞机着陆频率(0-60之间的整数)
飞机起飞频率(0-60之间的整数)
每架飞机着陆需花费的时间(min)
每架飞机起飞需花费的时间(min)
完成系统模拟的指定时间段(如9:00-22:00则输人9 22)
均为整形。
2输出的形式:
跑道的繁忙程度double
处理飞机着陆次数int
处理飞机起飞次数int
结束时着陆队列的飞机数int
结束时起飞队列的飞机数int
着陆飞机的总的等待时间(min) int
着陆飞机的平均等待时间(min) double
起飞飞机的总的等待时间(min) int
起飞飞机的平均等待时间(min) double
每架飞机花费在一个队列中的平均时间(min) double
3程序所能达到的功能:
模拟机场航空管制。
4测试数据:
Input
Output
三、调试分析
(1)问题:如何解决时刻显示问题,例如生活中接触到的时间显示没有19:9而是19:09;
解决:用以下函数解决。
string mintime0Turn(int mintime) //////////若时刻的分位数值小于10,则前面自动置0
{
if (mintime%60<10) return "0";
return "";
}
(2)问题:在调试过程中发现有些飞机起降完成的时间在模拟终止时间之后;
解决:应判断当前时刻加起降耗时的值不大于模拟总时间。
while(currTime>=nextfreeTime&&((!landing_queue.empty()&&(currTime+landingTime<( endTime-beginTime)*60))||(!takeOff_queue.empty()&&(currTime+takeOffTime<(endTim e-beginTime)*60))))
(3)问题:调试的过程中多次出现输出几行后程序就终止的情况;
解决:撤销刚才的操作,重新修改。