机场航空管制模拟实验报告

更新时间:2023-04-22 04:32:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数据结构大型实验实验报告

机场航空管制模拟实验报告

数据结构大型实验实验报告

实验题目

假设机场有一条跑道,每架飞机需花费一定时间着陆,花费一定时间起飞,飞机的起降满足一定的概率。一般来讲,机场存在两个队列,一个等待着陆的飞机队列和一个等待起飞的飞机队列,同样等待时间下,等待着陆的飞机比准备起飞的飞机具有更高的优先级。试编写程序模拟这个机场的运行。要求使用队列或优先队列实现;要求可以变换起飞和着陆频率来模拟一天中的飞行高峰期和空闲期;要求可以改变着陆和起飞时间以模拟不同的效果。

1. 实验内容分析

1.1实验目的

实验模拟了机场的航空管制,通过程序,来模拟管理飞机的起飞与着陆。它要求我们考虑起飞与着陆的优先级不同,以及根据飞机起飞/着陆时间,起飞/着陆频率模拟机场一天的运营情况。并计算出跑道的繁忙程度、着陆飞机的总的等待时间和平均等待时间、起飞飞机的总的等待时间和平均等待时间, 计算每架飞机花费在一个队列中的平均时间。

1.2内容分析

系统主要模拟了机场一天的运营。所以,需要一个计时器(以分钟计时)来计算机场的运营时间。同时,为了管理飞机的起飞与着陆,需要两个队列来存放着陆和起飞的飞机。 设计用户输入的数据为:机场开始、结束运营时间;高峰期开始、结束时间;空闲期开始、结束时间;着陆飞机最长等待时间;高峰期、空闲期以及一般时期每小时起飞、着陆的飞机数,飞机起飞、着陆需要的时间。

考虑到机场的高峰期,与空闲期,设计了Workslot类,设定不同时期的飞机起飞、着陆率。

设计Timer类,其主要方法是实现计时功能和返回当前工作时间。Plane类主要功能是记录飞机开始等待时间,开始工作时间以及起飞、着陆所需时间。

飞机起飞/着陆都需要花费一定的时间,并不是马上就完成的。所以在起飞/着陆服务函数中,不仅要调用spend(),还需要判断takeoff/landing是否结束。当t.now-startworktime<workTime时,说明飞机还在准备着陆/起飞,占用了跑道。当t.now-startworktime==workTime时,表示飞机着陆/起飞成功。调用pop方法,从队列中删除一架等待服务的飞机,并获取当前时间,减去飞机接受服务的时间,得到该飞机的等待服务时间。我们就可以计算出所有飞机的等待服务时间。

等待起飞/着陆队列总长度,等待服务总时间,以及服务起飞/着陆的飞机总数,我们就可以得出起飞/着陆飞机的平均等待时间,平均等待队列长度。同时根据当天的的工作时间,跑道的忙碌时间,可以计算得到跑道的繁忙程度。

数据结构大型实验实验报告

1.3程序基本流程

数据结构大型实验实验报告

图 1 实验基本流程

1.4基本数据结构,类设计

1.4.1类 Airport

输入:

数据结构大型实验实验报告

输出

成员

数据结构大型实验实验报告

1.4.2类Plane

成员:

1.4.3类Timer

成员:

1.4.4类Workslot

成员:

1.4.5结构 Busy

成员:

数据结构大型实验实验报告

1.5基本函数功能

1.5.1 类Simulation

setTimer():

设定计时器函数

setTakeoffTime(int t1):

设定起飞所需时间函数

setLandingTime(int t2):

设定着陆所需时间函数

setMaxlandingwaitTime(int mlwd):

设定着陆飞机最大等待时间

setStartworkTime(string s):

设定机场开始工作时间函数

setEndworkTime(string s):

设定机场结束工作时间函数

setHighslot(Workslot h):

设定高峰期机场属性

setLowslot(Workslot l):

设定空闲期机场属性

setOtherslot(Workslot o):

设定一般时段机场属性

run():

模拟飞机场运营。

数据结构大型实验实验报告

display():

该函数主要用于计算一些值,并输出在屏幕上。

跑道的繁忙程度= workTime/(endworkTime-startworkTime) 着陆飞机平均等待时间=landingwaitTime/landingNum 着陆飞机在队列中的平均等待时间=LwaitTime/landingNum 起飞飞机总的等待时间=takeoffwaitTime

起飞飞机平均等待时间=takeoffwaitTime/takeoffNum

起飞飞机在队列中的平均等待时间=TwaitTime/takeoffNum 起飞队列中剩余未起飞飞机数量=intakeoffNum-takeoffNum 再使用输出语句输出这些值。

1.5.2 类Plane

Plane()

用于初始化飞机的startwaitTime,startworkTime,workTime。

Plane(int a,int b,int c)

同上。

1.5.3 类Timer

Timer()

初始化当前时间。

Timer(int n)

同上。

void spend()

计时累加函数。

数据结构大型实验实验报告

2. 实验验证分析

2.1输入的形式和输入值的范围

2.2输出的形式

控制台下运行,结果输出形式:

时间: XX: XX X号起飞飞机进入起飞队列

时间: XX: XX X号起飞飞机开始起飞; 等待时间: XXmin ……

本日机场运营情况:

跑道的繁忙程度: XX 着陆飞机总的等待时间: XXh 着陆飞机平均等待时间: XXmin 着陆飞机在着陆队列中的平均等待时间: XXmin 起飞飞机总的等待时间: XXh 起飞飞机平均等待时间: XXmin 起飞飞机在起飞队列中的平均等待时间: XXmin 起飞队列中剩余未起飞飞机数量: XX

2.3程序所能达到的功能

程序实现了如下的功能:

数据结构大型实验实验报告

设置机场的工作时间 模拟机场的运营

模拟机场的高峰期和空闲期

计算出机场当天起飞/着陆的飞机数目

计算出等待队列(起飞/着陆)的平均长度 计算队列的平均等待时间 简单表示跑道的繁忙程度

2.4测试数据

数据结构大型实验实验报告

3. 调试分析

3.1遇到的问题及解决方法

3.1.1问题一

问题:在模拟结果中只有起飞飞机或着陆飞机。 解决方案:算法出现问题,重新写主程序。

3.1.1问题二

问题:机场的忙碌情况大于1。

解决方案:检查后发现,跑道功能工作时间的实现有问题,将代码进行改进。

3.1.1问题三

问题:产生随机数太过规则。

解决方案:发现是产生随机数的函数位置有问题,进行调整。

3.2技术难点分析

3.2.1难点一

一架飞机完成起飞/着陆花费一般超过一分钟,那么随着时间的累积,该如何来判断对当前飞机的服务结束了呢。

解决办法是给Plane类添加开始工作时间的参数,这样是要判断当前时间与开始工作时间的差值是否已到达起飞/着陆所耗时,即可判断起飞/着陆是否完成。

3.2.2难点二

单单用bool busy数据记录跑道是否忙碌会出现:当跑道忙碌时,不能判断跑道上运行的是起飞飞机还是着陆飞机这种情况。因此,我构造了Busy结构,里面不仅包括对跑道是否忙碌的的记录(bool busy)还包括对跑道上运行的是否为起飞飞机的记录(is_takeoff)。这样就可以判断跑道上忙碌时运行的是哪种飞机了。

数据结构大型实验实验报告

3.2.3难点三

由于未采用优先队列,故起飞和着陆队列是分别独立的,那么如何联系这两个队列是一大难点。由于本题我们采用着陆飞机优先的思想。故在跑道空闲的时候,先判断着陆队列是否为空,不为空就进行飞机着陆,为空则查看起飞队列是否为空,不为空则进行飞机起飞,为空则该时段不进行起飞。这样就可以不在优先队列中实现着陆飞机优先的思想。

3.3印象最深刻的错误及修正方法

3.3.1问题1

问题:着陆/起飞飞机的在队列中的平均等待时间与实际不符存在矛盾。

解决方法:查看原先对是否有等待飞机的判断语句为: if(takeoffq.size()>2) TwaitTime++; if(landingq.size()>2) LwaitTime++;

这时就遗漏了当队列只有一架飞机但由于跑道此时为忙碌,所以该飞机仍处于等待状态这种情况,故敬爱那个代码修改为:

if(takeoffq.size()>1 || (takeoffq.size()==1&&takeoffq.front().startworkTime==-1)) TwaitTime++;

if(landingq.size()>1 || (landingq.size()==1&&landingq.front().startworkTime==-1)) LwaitTime++;

更改前运行结果:

修正后运行结果:

数据结构大型实验实验报告

3.3.2问题2

问题:一开始的程序没有加入deQueue.h文件,而是直接用了#include <deque>,后面加入程序后一直没有调试成功 。

调试过程:

有报错框可知,因为程序开始设定的时候用了模版类,因此。队列类里也需要加入模版函数。在队列类的函数调用过程中修改了需要用到的函数,确保其运行成功。

解决方法: 完善了队列类

3.3.3问题3

问题:

要求机场24:00结束,但是程序只模拟到21:23分左右,之后再无飞机产生。而且之后的几小时内只有起飞飞机,无着陆飞机。多次模拟,均是类似结果。

解决方法:

首先分析该问题产生的可能原因,由于这种结果的太过规律性,怀疑是产生的随机数的问题,因此对产生随机数的语句进行分析,发现是将srand((int)time(0))语句放在for循环内造成的,故将srand((int)time(0))语句放到for循环外面。

数据结构大型实验实验报告

4. 测试结果

4.1正常运行

4.1.1输入数据正确的情况:

数据结构大型实验实验报告

4.1.2输入数据错误的情况:

数据结构大型实验实验报告

4.2边界数据测试

输入全部为

5. 后期扩展

1. 目前程序只模拟了一个跑道的情况,后期可以使用优先队列管理跑道,实现多跑道的飞

机场运营模拟。

2. 由于实验要求先处理完着陆队列再处理起飞队列,可能会导致模拟出来的情况与实际不

符,期中可能要考虑更多因素,目前的实现上来说还有待提高。

6. 源代码

6.1类设计

deQueue.h

#ifndef DEQUEUE #define DEQUEUE

数据结构大型实验实验报告

#include<iostream> using namespace std;

template <typename T> class node {

public:

T nodeValue; node<T> *next; node() : next(NULL) {}

node(const T& item, node<T> *nextNode = NULL) : nodeValue(item), next(nextNode) {} };

template <typename T> class Queue {

public: Queue(); void push_back(const T& item); void pop_front(); T& front(); const T& front() const; int size() const; bool empty() const; private: node<T> *qfront,*qback; int count; };

template <typename T>

Queue<T>::Queue():qfront(NULL), qback(NULL), count(0) {}

template <typename T>

void Queue<T>::push_back(const T& item) { node<T> *newNode=new node<T>(item, NULL); if(qfront==NULL){ qfront=newNode; qback=newNode; } else{ qback->next=newNode; qback=newNode;

数据结构大型实验实验报告

count++; }

template <typename T> void Queue<T>::pop_front() { if (empty()) //count==0 cout<<"Queue pop_front(): empty queue"<<endl; node<T> *tmp=qfront; qfront=qfront->next;

if (qfront == NULL) qback = NULL; delete tmp; count--; }

template <typename T> T& Queue<T>::front() { if (empty() ) cout<<"Queue front(): empty queue"<<endl; return qfront->nodeValue; }

template <typename T> int Queue<T>::size() const { return count; }

template <typename T>

bool Queue<T>::empty() const { return count==0; } #endif

Timer.h

#ifndef TIMER #define TIMER

class Timer{

数据结构大型实验实验报告

int now; //计时器当前时间 Timer(){} Timer(int n){ now=n; } void spend(){ //计时累加函数 now++; } };

#endif

Plane.h

#ifndef PLANE #define PLANE

class Plane{ public: int startwaitTime; int startworkTime; int workTime; Plane(){} Plane(int a,int b,int c){ startwaitTime=a; startworkTime=b; workTime=c; } };

#endif

Workslot.h

#include <iostream> #include <string> using namespace std; #ifndef WORKSLOT #define WORKSLOT

class Workslot{ public: int startTime; int endTime; int takeoffRate; //开始等待时间 //开始起飞/着陆时间 //起飞/着陆时间 //该时间段开始时间 //该时间段结束时间 //起飞频率(每小时起飞数)

本文来源:https://www.bwwdw.com/article/pifq.html

Top