Escreva um programa que simule o controle de uma pista de decolagem de aviões em um aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas: a) Listar o número de aviões aguardando na fila de decolagem; b) Autorizar a decolagem do primeiro avião da fila; c) Adicionar um avião à fila de espera; d) Listar todos os aviões na fila de espera; e) Listar as características do primeiro avião da fila. Considere que os aviões possuem um nome e um número inteiro como identificador. Adicione outras características conforme achar necessário.
Para este exercício eu resolvi fazer utilizando struct e fazer um menu que interagisse com o usuário, para isso e facilitar na hora de fazer escolhi fazer alguns arquivos separados.
Fila.h
typedef struct item {
int numero;
char nome[30];
struct item *prox;
} Item;
typedef struct fila {
Item *primeiro;
Item *ultimo;
int qtdItens;
} Fila;
Fila *criaFila();
void liberaFila(Fila *f);
int estahVazia(Fila);
void enfileirar(Fila *f, int n, char nm[]);
void desenfileirar(Fila *f, char *nomeDesenfileirado, int *nDesenfileirado);
void mostrarFila(Fila *f);
int quantidadeFila(Fila *f);
void mostrarCaracteristicas(Fila *f);
#include "Fila.cpp"
/*
Escreva um programa que simule o controle de uma pista de decolagem de aviões em um aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas:
*/
// a) Listar o número de aviões aguardando na fila de decolagem;
void quantosAvioesAguardam(Fila *f);
// b) Autorizar a decolagem do primeiro avião da fila;
void autorizarDecolagem(Fila *f);
// c) Adicionar um avião à fila de espera;
void adicionarAviaoFilaDecolagem(Fila *f);
// d) Listar todos os aviões na fila de espera;
void listarAvioesFilaDecolagem(Fila *f);
// e) Listar as características do primeiro avião da fila;
void caracteristicasProximoDecolar(Fila *f);
// Menu interativo para acesso às funções.
int menuAeroporto(Fila *f);
/*
Considere que os aviões possuem um nome e um número inteiro como identificador.
Adicione outras características conforme achar necessário.
*/
Bom... estes são os arquivos, o programa funciona na maioria do tempo, o menu vai e volta tranquilo. O problema é que em alguns momentos ele dá um erro de segmentação que não estou conseguindo resolver, acredito ser relativo a algum ponteiro. E acredito também que o menu pode ser melhorado, se alguém puder dar uma luz, serei muito grato.
Pergunta
renatoemoura
Bom dia/Boa tarde/Boa noite,
Estou com o seguinte exercício utilizando lista:
Escreva um programa que simule o controle de uma pista de decolagem de aviões em um
aeroporto. Neste programa, o usuário deve ser capaz de realizar as seguintes tarefas:
a) Listar o número de aviões aguardando na fila de decolagem;
b) Autorizar a decolagem do primeiro avião da fila;
c) Adicionar um avião à fila de espera;
d) Listar todos os aviões na fila de espera;
e) Listar as características do primeiro avião da fila.
Considere que os aviões possuem um nome e um número inteiro como identificador.
Adicione outras características conforme achar necessário.
Para este exercício eu resolvi fazer utilizando struct e fazer um menu que interagisse com o usuário, para isso e facilitar na hora de fazer escolhi fazer alguns arquivos separados.
Fila.h
typedef struct item { int numero; char nome[30]; struct item *prox; } Item; typedef struct fila { Item *primeiro; Item *ultimo; int qtdItens; } Fila; Fila *criaFila(); void liberaFila(Fila *f); int estahVazia(Fila); void enfileirar(Fila *f, int n, char nm[]); void desenfileirar(Fila *f, char *nomeDesenfileirado, int *nDesenfileirado); void mostrarFila(Fila *f); int quantidadeFila(Fila *f); void mostrarCaracteristicas(Fila *f);Fila.cpp
#include <malloc.h> #include <iostream> #include <string.h> #include "Fila.h" using namespace std; #define MSG_FILAVAZIA "\nA Fila está vazia\n" Fila *criaFila(){ Fila* f = (Fila*) malloc(sizeof(Fila)); f->primeiro = NULL; f->ultimo = NULL; f->qtdItens = 0; return f; } void liberaFila(Fila *f){ free(f); } int estahVazia(Fila *f){ return f->qtdItens == 0; } void enfileirar(Fila *f, int i, char n[]){ Item *novoItem = (Item*) malloc(sizeof(Item)); novoItem->numero = i; strcpy(novoItem->nome, n); if (estahVazia(f)){ novoItem->prox = NULL; }else{ novoItem->prox = f->ultimo; } f->ultimo = novoItem; f->qtdItens++; } int desenfileirar(Fila *f, char *nomeDesenfileirado[], int *nDesenfileirado){ Item *i; if(!estahVazia(f)){ i = f->primeiro; f->primeiro = i->prox; strcpy(*nomeDesenfileirado, i->nome); *nDesenfileirado = i->numero; free(i); }else{ fprintf(stderr, MSG_FILAVAZIA); return 0; } f->qtdItens--; return 1; } void mostrarFila(Fila *f){ Item *i = f->primeiro; while(i != f->ultimo){ cout << " [Numero: " << i->numero << ", Nome: " << i->nome << "] |"; i = i->prox; } cout << " [Numero: " << i->numero << ", Nome: " << i->nome << "]" << endl; } int quantidadeFila(Fila *f){ return f->qtdItens; } void mostrarCaracteristicas(Fila *f){ cout << " [Numero: " << f->primeiro->numero << ", Nome: " << f->primeiro->nome << "]" << endl; }aeroporto.h
aeroporto.cpp
#include <iostream> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "aeroporto.h" using namespace std; void quantosAvioesAguardam(Fila *f){ system("clear"); if(!estahVazia(f)){ cout << f->qtdItens << " Avioes estao aguardando para decolar." << endl; }else{ cout << "Nao ha avioes aguardando para decolar." << endl; } cout << endl; sleep(2); menuAeroporto(f); } void autorizarDecolagem(Fila *f){ Item *i; char *nm[30]; int *num; system("clear"); if (!estahVazia(f)){ desenfileirar(f, nm, num); cout << "Aviao [Numero: " << num << "] [Nome: " << nm << "] | Autorizado a decolar." << endl; }else{ cout << "Nao existem avioes para decolar." << endl; } sleep(2); menuAeroporto(f); } void adicionarAviaoFilaDecolagem(Fila *f){ char nm[30]; int num=0; system("clear"); cout << "Digite os dados do aviao a ser inserido na Fila de Decolagem" << endl; cout << "Numero: "; cin >> num; cout << endl; cout << "Nome: "; cin >> nm; enfileirar(f, num, nm); system("clear"); cout << "Aviao [" << num << "] [" << nm << "] adicionado com sucesso." << endl; sleep(2); menuAeroporto(f); } void listarAvioesFilaDecolagem(Fila *f){ Item *i; if(!estahVazia(f)){ system("clear"); i = f->primeiro; while(i != f->ultimo){ cout << "[" << i->numero << "] [" << i->nome << "] | "; i=i->prox; } cout << "[" << i->numero << "] [" << i->nome << "]" << endl; }else{ cout << "Nao existem avioes para decolar." << endl; } sleep(2); menuAeroporto(f); } void caracteristicasProximoDecolar(Fila *f){ if(!estahVazia(f)){ system("clear"); cout << "O proximo a decolar sera:" << endl; mostrarCaracteristicas(f); }else{ cout << "Nao existem avioes para decolar." << endl; } sleep(2); menuAeroporto(f); } int menuAeroporto(Fila *f){ int opt=1; while(opt != 6){ opt = 1; system("clear"); if(opt < 1 || opt > 6){ cout << "Opcao errada." << endl; cout << "Escolha entre 1 e 6." << endl; } cout << "1 - Quantos Avioes estao aguardando." << endl; cout << "2 - Autorizar proxima decolagem." << endl; cout << "3 - Adidionar aviao a espera." << endl; cout << "4 - Ver avioes aguardando." << endl; cout << "5 - Detalhes do proximo a decolar." << endl; cout << "6 - Sair." << endl; cout << endl; cout << "Opcao: "; cin >> opt; switch(opt){ case 1: quantosAvioesAguardam(f); case 2: autorizarDecolagem(f); case 3: adicionarAviaoFilaDecolagem(f); case 4: listarAvioesFilaDecolagem(f); case 5: mostrarCaracteristicas(f); case 6: cout << "Fechando aplicacao, aguarde..." << endl; sleep(3); return 0; default: menuAeroporto(f); } } return 0; }exFila.cpp
#include "aeroporto.cpp" int main(){ Fila *aeroporto = criaFila(); menuAeroporto(aeroporto); return 0; }Bom... estes são os arquivos, o programa funciona na maioria do tempo, o menu vai e volta tranquilo. O problema é que em alguns momentos ele dá um erro de segmentação que não estou conseguindo resolver, acredito ser relativo a algum ponteiro. E acredito também que o menu pode ser melhorado, se alguém puder dar uma luz, serei muito grato.
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.