数据结构大型实验报告—机场航空管制模拟

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<Plane,vector<Plane>,comp>landing_queue,takeOff_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)问题:调试的过程中多次出现输出几行后程序就终止的情况;
解决:撤销刚才的操作,重新修改。

2.技术难点分析
(1)不知道用什么来反映跑道的繁忙程度
(2)不知道如何设置优先级
(3)不知道“每架飞机花费在一个队列中的平均时间”是什么意思
四、源代码
#include<iostream>
#include<ctime>
#include<queue>
#include<vector>
#include<string>
using namespace std;
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<Plane,vector<Plane>,comp>landing_queue,takeOff_queue;
};
Simulation::Simulation()
{
workingTime=0;
unfinishedlanding=0;
unfinishedtakeOff=0;
nextfreeTime=0;
waitingforlandingTime=0;
waitingfortakeOffTime=0;
landingPass=0;
takeOffPass=0;
cout<<"飞机着陆频率(0-60之间的整数): ";
cin>>landingRate;
cout<<"飞机起飞频率(0-60之间的整数): ";
cin>>takeOffRate;
cout<<"每架飞机着陆需花费的时间(min): ";
cin>>landingTime;
cout<<"每架飞机起飞需花费的时间(min): ";
cin>>takeOffTime;
cout<<"完成系统模拟的指定时间段(如9:00-22:00则输人9 22): ";
cin>>beginTime>>endTime;
}
void Simulation::run()
{
cout<<endl;
cout<<"机场飞机起降情况如下"<<endl<<endl;
for(currTime=0;currTime<(endTime-beginTime)*60;currTime++) //每次前进一分钟的模拟时钟
{
int a=rand()%60;
if(a>=0&&a<landingRate) landing_queue.push(Plane(currTime,0));
int b=rand()%60;
if(b>=0&&b<takeOffRate) takeOff_queue.push(Plane(currTime,0));
while(currTime>=nextfreeTime&&((!landing_queue.empty()&&(currTime+landingT ime<(endTime-beginTime)*60))||(!takeOff_queue.empty()&&(currTime+takeOffTime< (endTime-beginTime)*60))))
{
if(!landing_queue.empty()&&(currTime+landingTime<(endTime-beginTime)*60)) {
landing_queue.top().completeTime=currTime+landingTime;
cout<<"申请着陆的时间:"<<landing_queue.top().applyTime/60+beginTime<<":"<<mintime0Turn(landing_queu e.top().applyTime)<<landing_queue.top().applyTime%60<<" 完成着陆的时间:"<<landing_queue.top().completeTime/60+beginTime<<":"<<mintime0Turn(landing_q ueue.top().completeTime)<<landing_queue.top().completeTime%60;
cout<<" 着陆飞机等待时间: "<<currTime-landing_queue.top().applyTime<<endl;
waitingforlandingTime+=currTime-landing_queue.top().applyTime;
nextfreeTime=currTime+landingTime;
workingTime+=landingTime;
landingPass++;
landing_queue.pop();
}
else
{
takeOff_queue.top().completeTime=currTime+takeOffTime;
cout<<"申请起飞的时间:"<<takeOff_queue.top().applyTime/60+beginTime<<":"<<mintime0Turn(takeOff_queu e.top().applyTime)<<takeOff_queue.top().applyTime%60<<" 完成起飞的时间:"<<takeOff_queue.top().completeTime/60+beginTime<<":"<<mintime0Turn(takeOff_q ueue.top().completeTime)<<takeOff_queue.top().completeTime%60;
cout<<" 起飞飞机等待时间: "<<currTime-takeOff_queue.top().applyTime<<endl;
waitingfortakeOffTime+=currTime-takeOff_queue.top().applyTime;
nextfreeTime=currTime+takeOffTime;
workingTime+=takeOffTime;
takeOffPass++;
takeOff_queue.pop();
}
}
}
unfinishedlanding=landing_queue.size();
unfinishedtakeOff=takeOff_queue.size();
cout<<endl;
if(!landing_queue.empty())
cout<<"以下着陆飞机在指定时间内无法完成着陆,需继续在下一指定时间段完成着陆或者迫降其他机场或者返航"<<endl;
while(!landing_queue.empty())
{
waitingforlandingTime=waitingforlandingTime+(endTime-beginTime)*60-landing _queue.top().applyTime;
cout<<"着陆飞机申请着陆的时间:"<<landing_queue.top().applyTime/60+beginTime<<":"<<mintime0Turn(landing_queu e.top().applyTime)<<landing_queue.top().applyTime%60<<endl;
landing_queue.pop();
};
cout<<endl;
if(!takeOff_queue.empty())
cout<<"以下起飞飞机在指定时间内无法完成起飞,需继续在下一指定时间段完成起飞"<<endl;
while(!takeOff_queue.empty())
{
waitingfortakeOffTime=waitingfortakeOffTime+(endTime-beginTime)*60-takeOff _queue.top().applyTime;
cout<<"起飞飞机申请起飞的时间:"<<takeOff_queue.top().applyTime/60+beginTime<<":"<<mintime0Turn(takeOff_queu e.top().applyTime)<<takeOff_queue.top().applyTime%60<<endl;
takeOff_queue.pop();
}
}
void Simulation::print()
{
cout<<endl;
cout<<"跑道的繁忙程度:"<<(double)workingTime/((endTime-beginTime)*60)<<endl;
cout<<"处理飞机着陆次数: "<<landingPass<<endl;
cout<<"处理飞机起飞次数: "<<takeOffPass<<endl;
cout<<"结束时着陆队列的飞机数: "<<unfinishedlanding<<endl;
cout<<"结束时起飞队列的飞机数: "<<unfinishedtakeOff<<endl;
cout<<"着陆飞机的总的等待时间(min): "<<waitingforlandingTime<<endl;
if(landingPass+unfinishedlanding)
cout<<"着陆飞机的平均等待时间(min):"<<(double)waitingforlandingTime/(landingPass+unfinishedlanding)<<endl;
cout<<"起飞飞机的总的等待时间(min): "<<waitingfortakeOffTime<<endl;
if(takeOffPass+unfinishedtakeOff)
cout<<"起飞飞机的平均等待时间(min):"<<(double)waitingfortakeOffTime/(takeOffPass+unfinishedtakeOff)<<endl;
if(landingPass+unfinishedlanding+takeOffPass+unfinishedtakeOff) cout<<"每架飞机花费在一个队列中的平均时间(min):"<<(double)(waitingforlandingTime+waitingfortakeOffTime)/(landingPass+unfinis hedlanding+takeOffPass+unfinishedtakeOff)<<endl;
}
int main()
{
srand(unsigned(time(0)));
Simulation s;
s.run();
s.print();
}。

相关文档
最新文档