【东南大学】【数据结构】实验报告机场模拟程序Airport.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告(第一次)
oxstar
名称
机场模拟程序AirportSimulation(三跑道)
问题描述
设机场有三个跑道,跑道1专用于降落,跑道2专用于起飞,跑道3优先用于降落。当等待降落队列为空时,跑道3也可用于起飞。修改并运行机场模拟程序AirportSimulation,使之能利用所有的跑道资源。
分析
教材中已经给出了非常详细的实例,由于只是跑道数量的不同,只需在它的基础上将模拟函数、参数设置和数据成员做一些修改即可。
数据结构和算法分析
本例涉及的数据结构类型主要是环状队列,用于存储等待的飞机队列。由于飞机从哪一条跑道降落或者起飞是由机场方面动态决定的,故仍只需两个队列。原例中跑道大约可以提供1/2时间用于降落,不妨设权重为1/2,那么根据题意,本例降落时间权重将达1+1/2=3/2,因而将等待队列延长至15(需开设16)。起飞等待队列同理。队列长度在Queue.h中默认定义:
const int DefaultSize = 16;
Queue( int MaxQueueSize = DefaultSize );
Queue结构属于数据结构基础的内容,不在此讨论,代码详见Queue.h。
与上述相似的原因,单位时间期望到达飞机总数上限也相应提升至3。只可能同时安排2架飞机起飞或者降落,所以增加单起/降总数限制为2。
AirportSimulation::AirportSimulation()
{ ……
else if( expectarrive + expectdepart > 3.0 || expectarrive > 2.0 || expectdepart > 2.0 )
{
cout << "机场将饱和!请重新输入。"<< endl;
ok = false;
}
……
}
为确保供数据分析的数据全面,为每一条跑道提供了单独储存空闲时间单元数、降落/起飞飞机数等的变量,并在程序相应位置给出设置和显示输出。
int idletime1; // 跑道1空闲时间单元数
int idletime2; // 跑道2空闲时间单元数
int idletime3; // 跑道3空闲时间单元数
int nland1; // 跑道1降落的飞机数
int nland3; // 跑道3降落的飞机数
int nland; // 降落的飞机总数
int ntakeoff2; // 跑道2起飞的飞机数
int ntakeoff3; // 跑道3起飞的飞机数
int ntakeoff; // 起飞的飞机总数
在实现安排跑道的算法方面,基于各条跑道的不同性质,可以用3条顺序执行的判断语句用以安排飞机起降,形如:
void AirportSimulation::RunSimulation() { ……
if( !landing.IsEmpty() )
{ // 跑道1降落飞机
p = *landing.Delete( p );
Land( p, 1 );
}
else Idle( 1 );
if( !takeoff.IsEmpty() )
{ //跑道2起飞飞机
p = *takeoff.Delete( p );
Fly( p, 2 );
}
else Idle( 2 );
if( !landing.IsEmpty() )
{ // 跑道3降落飞机
p = *landing.Delete( p );
Land( p, 3 );
}
else if( !takeoff.IsEmpty() )
{ // 跑道3起飞飞机
p = *takeoff.Delete( p );
Fly( p, 3 );
}
else Idle( 3 ); // 处理空闲时间单元……
}
由于跑道增多,起飞和降落飞机需要显示具体跑道信息,因此Fly 、Land、Idle和Conclude 函数需要重新定义:
void AirportSimulation::Fly( plane& p, int airstrip )
{
int wait = curtime - p.tm;
cout << " ▲▲飞机" << p.id << "从跑道" << airstrip << "起飞,该机等待时间:" << wait << "。" << endl;
if( airstrip == 2 )
ntakeoff2++; // 跑道2起飞飞机总数加1
else
ntakeoff3++; // 跑道3起飞飞机总数加1
takeoffwait += wait; // 累加总起飞等待时间
}
Land函数与之完全类似,在此省略。
void AirportSimulation::Idle( int airstrip )
{
cout << " ¤¤跑道" << airstrip << "空闲。" << endl;
if( airstrip == 1 )
idletime1++; // 跑道1空闲时间加1
else if( airstrip == 2 )
idletime2++; // 跑道2空闲时间加1
else
idletime3++; // 跑道3空闲时间加1
}
void AirportSimulation::Conclude()
{
nland = nland1 + nland3;
ntakeoff = ntakeoff2 + ntakeoff3;