Projeto de controle de tráfego aéreo. Todos os dias, de acordo com a National Air Traffic Controllers Association (
Nesse exercício, você criará uma classe Voo que poderá ser usada em um simulador de controle de tráfego aéreo simples. A função main da aplicação atuará como controle
de tráfego aéreo. Visite sites como
para descobrir como funciona o sistema de controle de tráfego aéreo. Depois, identifique alguns dos principais atributos de um Voo em um sistema de controle de tráfego
aéreo. Pense nas diferentes circunstâncias em que um avião poderia voar desde o momento em que está estacionado no portão de um aeroporto até o momento em que chega a seu destino — estacionado, taxiando, esperando para decolar, decolando, subindo etc. Use uma enumeração StatusVoo para representar esses estados. Os atributos poderiam incluir a marca e o modelo do avião, a velocidade do ar, altitude, direção, transportadora, horário da decolagem, horário aproximado do pouso, origem e destino. A origem e o destino devem ser especificados usando códigos de aeroporto de três letras, como BOS para Boston e LAX para Los Angeles (esses códigos estão disponíveis em
funções set e get para manipular esses e quaisquer outros atributos que você identifique. Em seguida, identifique os comportamentos da classe e implemente-os como funções da classe. Inclua comportamentos como mudaAltitude, reduzVelocidade e iniciaPouso. O construtor Voo deverá inicializar os atributos de um Voo. Você também deverá fornecer uma função toString
que retorne uma representação em string do status atual de um Voo (por exemplo, estacionado no portão, taxiando, decolando, mudando de altitude). Essa string deverá incluir todos os valores de variável de instância do objeto. Quando a aplicação for executada, main mostrará a mensagem “SimulacaoControleTrafegoAereo”, e depois criará e interagirá com três objetos Voo que representem aviões que estão atualmente voando ou preparando-se para voar. Para simplificar, a confirmação do Voo de cada ação será uma mensagem exibida na tela
quando a função apropriada for chamada ao objeto. Por exemplo, se você chamar a função mudaAltitude de um voo, o método deverá:
a) Mostrar uma mensagem que contenha o nome dacompanhia aérea, o número do voo, “mudaAltitude”,a altitude atual e a nova altitude.
b) Mudar o estado do dado-membro status para MUDA_ALTITUDE.
c) Mudar o valor do dado-membro novaAltitude. Em main, crie e inicialize três objetos Voo que estejam em diferentes estados — por exemplo, um poderia estar no portão, um poderia estar se preparando para decolar e um poderia estar se preparando para aterrissar. A função
main deverá enviar mensagens para (invocar funções em) os objetos Voo. À medida que um objeto Voo recebe cada mensagem, ele deve mostrar uma mensagem de confirmação da função sendo chamada — como “[Nome da companhia] [Número do voo] mudando a altitude de 20.000 para 25.000 pés”. A função também deverá atualizar a informação de circunstância apropriada no objeto Voo. Por exemplo, se o Controle de Tráfego Aéreo enviar uma ensagem como “[Companhia] [número do voo] descendo para 12.000 pés”, o programa deverá executar uma chamada de função como voo1.muda-Altitude(12000), que mostraria uma mensagem de confirmação e definiria o dado-membro novaAltitude como 12000. [Nota: suponha que o dado-membro
altitudeAtual de Voo seja definido automaticamente pelo altímetro do avião.]
Passo 1
Vamos criar a classe Flight. Esta classe será usada em um aplicativo de simulador de controle de tráfego aéreo.
Adicionaremos várias validações em algumas das funções do setter onde for razoavelmente aplicável. Além disso, algumas das funções do setter vão exibir mensagens de confirmação que serão usadas no aplicativo.
Em seguida, criaremos uma função de driver que operará com 3 objetos Flight, recebendo comandos e executando funções.
Vamos começar com o arquivo de cabeçalho "Flight.h".
Primeiramente, o cabeçalho do arquivo junto com a enumeração FlightStatus contendo vários tipos de status de um avião:
#ifndef H_FLIGHT_H
#define H_FLIGHT_H
#include
using namespace std;
enum FlightStatus {
PARKED,
TAXIING,
TAKING_OFF,
CLIMBING,
CRUISING,
CHANGING_ALTITUDE
};
...
Funções membro da classe:
class Flight {
public:
Flight(const string &airline, const long flightNumber,
const string &model, double speed,
double currentAltitude,
const string &direction,
const string &carrier, const tm &departureTime,
const tm &arrivalTime, const string &origin,
const string &destination,
const FlightStatus &status);
const string &getAirline() const;
void setAirline(const string &airline);
long getFlightNumber() const;
void setFlightNumber(long flightNumber);
const string &getModel() const;
void setModel(const string &model);
double getSpeed() const;
void setSpeed(double speed);
double getCurrentAltitude() const;
void setCurrentAltitude(double currentAltitude);
double getNewAltitude() const;
const string &getDirection() const;
void setDirection(const string &direction);
const string &getCarrier() const;
void setCarrier(const string &carrier);
const tm &getDepartureTime() const;
void setDepartureTime(const tm &departureTime);
const tm &getArrivalTime() const;
void setArrivalTime(const tm &arrivalTime);
const string &getOrigin() const;
void setOrigin(const string &origin);
const string &getDestination() const;
void setDestination(const string &destination);
FlightStatus getStatus() const;
void setStatus(FlightStatus status);
void changeAltitude(double altitude);
void reduceSpeed(double speed);
void beginLandingApproach();
string toString() const;
...
};
Membros de dados (estamos usando a estrutura tm para armazenar valores de data e hora):
class Flight {
...
private:
string airline;
long flightNumber;
string model;
double speed;
double currentAltitude;
double newAltitude;
string direction;
string carrier;
tm departureTime;
tm arrivalTime;
string origin;
string destination;
FlightStatus status;
bool landingMode;
};
#endif
Passo 2
Agora, vamos implementar as funções membro da classe no arquivo fonte "Flight.cpp".
Em primeiro lugar, o cabeçalho do arquivo junto com o construtor, que não usa as funções setter para inicializar os valores dos membros de dados, pois queremos evitar exibições de mensagens (estamos assumindo que os valores passados são válidos na inicialização, vamos validar qualquer informação que seja definida posteriormente):
#include "Flight.h"
#include
using namespace std;
Flight::Flight(const string &airline,
const long flightNumber,
const string &model, double speed,
double currentAltitude,
const string &direction,
const string &carrier,
const tm &departureTime,
const tm &arrivalTime,
const string &origin,
const string &destination,
const FlightStatus &status)
{
Flight::airline = airline;
Flight::flightNumber = flightNumber;
Flight::model = model;
Flight::speed = speed;
Flight::currentAltitude = currentAltitude;
Flight::direction = direction;
Flight::carrier = carrier;
Flight::departureTime.tm_mon = departureTime.tm_mon;
Flight::departureTime.tm_mday = departureTime.tm_mday;
Flight::departureTime.tm_year = departureTime.tm_year;
Flight::departureTime.tm_hour = departureTime.tm_hour;
Flight::departureTime.tm_min = departureTime.tm_min;
Flight::departureTime.tm_sec = departureTime.tm_sec;
Flight::arrivalTime.tm_mon = arrivalTime.tm_mon;
Flight::arrivalTime.tm_mday = arrivalTime.tm_mday;
Flight::arrivalTime.tm_year = arrivalTime.tm_year;
Flight::arrivalTime.tm_hour = arrivalTime.tm_hour;
Flight::arrivalTime.tm_min = arrivalTime.tm_min;
Flight::arrivalTime.tm_sec = arrivalTime.tm_sec;
Flight::origin = origin;
Flight::destination = destination;
Flight::status = status;
landingMode = false;
}
...
Função setter/getter sem nenhum recurso especial:
const string &Flight::getAirline() const {
return airline;
}
void Flight::setAirline(const string &airline) {
Flight::airline = airline;
}
long Flight::getFlightNumber() const {
return flightNumber;
}
void Flight::setFlightNumber(long flightNumber) {
Flight::flightNumber = flightNumber;
}
const string &Flight::getModel() const {
return model;
}
void Flight::setModel(const string &model) {
Flight::model = model;
}
double Flight::getSpeed() const {
return speed;
}
double Flight::getCurrentAltitude() const {
return currentAltitude;
}
double Flight::getNewAltitude() const {
return newAltitude;
}
const string &Flight::getDirection() const {
return direction;
}
const string &Flight::getCarrier() const {
return carrier;
}
const tm &Flight::getDepartureTime() const {
return departureTime;
}
const tm &Flight::getArrivalTime() const {
return arrivalTime;
}
const string &Flight::getOrigin() const {
return origin;
}
void Flight::setOrigin(const string &origin) {
Flight::origin = origin;
}
const string &Flight::getDestination() const {
return destination;
}
void Flight::setDestination(const string &destination) {
Flight::destination = destination;
}
FlightStatus Flight::getStatus() const {
return status;
}
void Flight::setStatus(FlightStatus status) {
Flight::status = status;
}
Agora, vamos abordar as funções do setter que possuem processos de validação e mensagens de confirmação.
Em primeiro lugar, a função setSpeed(). Veja se o valor passado é maior que zero. Se o valor for maior que zero e o status atual for ESTACIONADO, significa que o avião está taxiando. Assim, altere o status.
void Flight::setSpeed(velocidade dupla) {
cout
Voo::velocidade
se (velocidade
{
cout
Voo::velocidade = 0;
}
outro
{
cout
Voo::velocidade = velocidade;
}
if (Vôo::velocidade > 0 && status == ESTACIONADO)
estado = TAXI;
}
Passo 3
A função setCurrentAltitude() verifica se o valor é positivo. Ele não tem uma mensagem de confirmação, pois teremos isso na função changeAltitude():
void Flight::setCurrentAltitude(double currentAltitude) {
if (currentAltitude > 0)
Flight::currentAltitude = currentAltitude;
else
Flight::currentAltitude = 0;
}
As funções setDirection() e setCarrier():
void Flight::setDirection(const string &direction) {
cout
Flight::direction
Flight::direction = direction;
}
void Flight::setCarrier(const string &carrier) {
cout
Flight::carrier
Flight::carrier = carrier;
}
As funções setDepartureTime() e setArrivalTime():
void Flight::setDepartureTime(const tm &departureTime) {
cout
Flight::departureTime.tm_mon = departureTime.tm_mon;
Flight::departureTime.tm_mday = departureTime.tm_mday;
Flight::departureTime.tm_year = departureTime.tm_year;
Flight::departureTime.tm_hour = departureTime.tm_hour;
Flight::departureTime.tm_min = departureTime.tm_min;
Flight::departureTime.tm_sec = departureTime.tm_sec;
}
void Flight::setArrivalTime(const tm &arrivalTime) {
cout
Flight::arrivalTime.tm_mon = arrivalTime.tm_mon;
Flight::arrivalTime.tm_mday = arrivalTime.tm_mday;
Flight::arrivalTime.tm_year = arrivalTime.tm_year;
Flight::arrivalTime.tm_hour = arrivalTime.tm_hour;
Flight::arrivalTime.tm_min = arrivalTime.tm_min;
Flight::arrivalTime.tm_sec = arrivalTime.tm_sec;
}
Passo 4
A função changeAltitude(), que valida o valor passado, bem como altera o status para CHANGING_ALTITUDE.
void Flight::changeAltitude(double altitude) {
cout
Flight::currentAltitude
if (altitude >= 0)
{
cout
Flight::newAltitude = altitude;
}
else
{
cout
Flight::newAltitude = 0;
}
setStatus(CHANGING_ALTITUDE);
}
O reduceSpeed() possui um processo de validação simples, bem como a exibição da mensagem de confirmação:
void Flight::reduceSpeed(double speed) {
cout
Flight::speed
if (Flight::speed - speed
{
cout
Flight::speed = 0;
}
else
{
Flight::speed -= speed;
cout Flight::speed
}
}
A implementação da função beginLandingApproach():
void Flight::beginLandingApproach() {
cout
landingMode = true;
}
A função toString():
string Flight::toString() const {
string result = "Flight status: ";
if (status == PARKED)
result += "Parked\n";
else if (status == TAXIING)
result += "Taxiing\n";
else if (status == TAKING_OFF)
result += "Taking off\n";
else if (status == CLIMBING)
result += "Climbing\n";
else if (status == CRUISING)
result += "Cruising\n";
else if (status == CHANGING_ALTITUDE)
result += "Changing altitude\n";
return result
+ "Airline: " + airline + "\n"
+ "Flight number: " + to_string(flightNumber)
+ "\n"
+ "Model: " + model + "\n"
+ "Speed: " + to_string(speed) + " knots" + "\n"
+ "Altitude: " + to_string(currentAltitude)
+ " feet" + "\n"
+ "Carrier: " + carrier + "\n"
+ "Departure time: "
+ to_string(departureTime.tm_mon) + "/"
+ to_string(departureTime.tm_mday) + "/"
+ to_string(departureTime.tm_year) + ", "
+ to_string(departureTime.tm_hour) + ":"
+ to_string(departureTime.tm_min)+ ":"
+ to_string(departureTime.tm_sec)+ "\n"
+ "Arrival time: "
+ to_string(arrivalTime.tm_mon)+ "/"
+ to_string(arrivalTime.tm_mday) + "/"
+ to_string(arrivalTime.tm_year) + ", "
+ to_string(arrivalTime.tm_hour) + ":"
+ to_string(arrivalTime.tm_min)+ ":"
+ to_string(arrivalTime.tm_sec)+ "\n"
+ "Origin: " + origin + "\n"
+ "Destination: " + destination + "\n";
}
Agora, a função do driver no arquivo de origem principal.
Primeiramente, inicialize três objetos Flight e adicione-os a um vetor:
#include
#include
#include "Flight.h"
using namespace std;
int main()
{
cout
Flight flight1("CroatiaAirlines", 5588224,
"PH2195", 0, 518, "SW", "ACV",
{0, 50, 11, 11, 12, 2021},
{0, 0, 3, 12, 12, 2021},
"ZAG", "AMS", PARKED);
Flight flight2("CroatiaAirlines", 7788652,
"PH2177", 20, 33000, "NW", "ACV",
{0, 0, 8, 12, 8, 2021},
{0, 0, 10, 12, 8, 2021},
"ZAG", "LTN", CRUISING);
Flight flight3("BritishAirways", 1095631,
"Airbus A330", 0, 36, "S", "ACV",
{0, 0, 7, 12, 7, 2021},
{0, 0, 10, 12, 7, 2021},
"LTN", "AMS", PARKED);
vector
...
}
Agora, entre em um loop infinito, onde aceitaremos comandos e executaremos comandos correspondentes.
O formato de entrada é:
Aceite a primeira parte da entrada:
int main()
{
...
while (true)
{
string airline, command, setTo, buffer;
long flightNumber;
double amount;
cin >> airline >> flightNumber >> buffer
>> command >> buffer;
...
}
}
Encontre o objeto Flight correspondente:
int main()
{
...
while (true)
{
...
int ind;
for (int i = 0; i flights.size(); i++)
{
if (flights.at(i).getAirline() == airline &&
flights.at(i).getFlightNumber()
== flightNumber)
{
ind = i;
break;
}
}
...
}
}
Por fim, execute um comando de acordo com a entrada do comando:
int main()
{
...
while (true)
{
...
if (command == "landing")
{
flights.at(ind).beginLandingApproach();
}
else if (command == "altitude")
{
cin >> amount;
flights.at(ind).changeAltitude(amount);
}
else if (command == "speed")
{
cin >> amount;
flights.at(ind).setSpeed(amount);
}
else if (command == "direction")
{
cin >> setTo;
flights.at(ind).setDirection(setTo);
}
else if (command == "carrier")
{
cin >> setTo;
flights.at(ind).setCarrier(setTo);
}
else if (command == "plane")
{
cout ).toString();
}
}
}
Resposta
Ver desenvolvimento.