Controle de tráfego aéreo - filas dinâmicas
Publicado por Diego Furtado (última atualização em 01/10/2009)
[ Hits: 15.255 ]
Um simples código para fins didáticos de controle aéreo utilizando filas.
#include <stdio.h>
#include <stdlib.h>
#define max 10
#pragma region Protótipos e estruturas da Pilha
typedef struct Celula_Str *Apontador;
typedef int TipoChave;
typedef struct TipoItem {
TipoChave Chave;
} TipoItem;
typedef struct Celula_Str {
TipoItem Item;
Apontador Prox;
} Celula;
typedef struct TipoFila {
Apontador Frente, Tras;
} TipoFila;
void FfVazia (TipoFila *);
bool Vazia (TipoFila);
bool Enfileira (TipoItem, TipoFila *);
void imprimir (TipoFila);
bool Desenfileira (TipoItem *, TipoFila *);
bool ListaFila(TipoFila);
#pragma endregion
#pragma region Protótipos do programa
int menu();
int ListaPista(int *);
int LiberaPista(int *);
int VerificaHangar(int *);
bool Pousar(int *, int);
int ListaHangar(int *);
int Decolar(int *, int);
int BuscaHangar(int, int *);
#pragma endregion
int main() {
int opcao, aviao, numero, check;
int pista[3] = { 0 };
int hangar[max] = { 0 };
char op;
TipoItem itemEsperaDecolagem;
TipoItem itemEsperaPouso;
TipoFila filaEsperaDecolagem;
TipoFila filaEsperaPouso;
FfVazia(&filaEsperaDecolagem);
FfVazia(&filaEsperaPouso);
do {
system("cls");
opcao = menu();
switch (opcao) {
#pragma region Opções de Chegada do aviao
case 1 : //Solicitar autorização para pouso
check = ListaPista(pista);
if (check < 0) {
printf("Digite o numero do aviao para solicitacao de pouso : ");
scanf("%d", &aviao);
printf("\nTodas as pistas estao ocupadas neste momento, adicionando aviao %d a espera para pouso\n", aviao);
itemEsperaPouso.Chave = aviao;
if (Enfileira(itemEsperaPouso, &filaEsperaPouso))
printf("Aviao %d inserido na fila de espera com sucesso!\n", itemEsperaPouso.Chave);
}
else
printf("Existem %d pistas liberadas para pouso!\n", check);
break;
case 2 : //Liberar pista para pouso
do {
check = ListaPista(pista);
if ( check > 0) {
printf("Aviao na fila de espera para pouso?(s/n) ");
fflush(stdin);
op = getchar();
if (op == 's') {
if (Desenfileira(&itemEsperaPouso, &filaEsperaPouso))
printf("%d Pistas liberadas para pouso!\nPouso do aviao %d liberado!\n", check, itemEsperaPouso.Chave);
if (Pousar(pista, itemEsperaPouso.Chave))
printf("Aviao %d em pouso\n", itemEsperaPouso.Chave);
}
else {
printf("Digite o numero do aviao a pousar: ");
scanf("%d",&aviao);
if (Pousar(pista, aviao))
printf("Aviao %d em pouso\n", aviao);
}
}
else
printf("Pistas cheias, execute a solicitacao primeiro!\n");
printf("Deseja pousar outro aviao?(s/n)");
fflush(stdin);
op = getchar();
system("cls");
} while (op != 'n');
break;
case 3 : //Finalizar pouso e colocar avião no Hangar
check = (VerificaHangar(hangar)); //Verifica uma posição livre no hangar
if (check >= 0) {
numero = LiberaPista(pista);
hangar[check] = pista[numero];
pista[numero] = 0;
}
else
printf("Hangar Cheio!\nO Aviao sera destruido!\n");
break;
#pragma endregion
#pragma region Opções de Saída do avião
case 4 : //Inserir na fila para Decolagem
check = ListaPista(pista);
ListaHangar(hangar);
printf("Digite o numero do Aviao para solicitacao de decolagem : ");
scanf("%d", &aviao);
numero = BuscaHangar(aviao, hangar);
if (numero >= 0) {
printf("Hangar %d liberado\n", numero+1);
hangar[numero] = 0;
printf("Adicionando aviao %d a espera para decolagem\n", aviao);
itemEsperaDecolagem.Chave = aviao;
if (Enfileira(itemEsperaDecolagem, &filaEsperaDecolagem))
printf("Aviao %d inserido na fila de espera com sucesso!\n", itemEsperaDecolagem.Chave);
}
printf("Existem %d pistas liberadas para decolagem nesse momento\n", check);
break;
case 5 : //Inserir na Pista para decolagem
check = ListaPista(pista);
do {
if (Vazia(filaEsperaDecolagem))
printf("Nao existem avioes na fila para decolagem\n");
else {
if (check > 0) {
if (Desenfileira(&itemEsperaDecolagem, &filaEsperaDecolagem))
printf("%d Pistas liberadas para decolagem!\nDecolagem do aviao %d liberada!\n", check, itemEsperaDecolagem.Chave);
check = Decolar(pista, itemEsperaDecolagem.Chave);
if (check > 0)
printf("Aviao %d Decolando na Pista %d\n", itemEsperaDecolagem.Chave, check);
}
else
printf("Todas as pistas estao ocupadas!\n");
}
printf("Deseja Inserir outro aviao na pista?(s/n)");
fflush(stdin);
scanf("%d", &op);
} while (op != 'n');
break;
case 6 : //Finalizar decolagem
check = LiberaPista(pista);
if (check >= 0)
pista[check] = 0;
break;
}//Fim do Switch Case
#pragma endregion
system("pause");
system("cls");
fflush(stdin);
check = ListaPista(pista);
printf("Avioes na espera para pouso : ");
if (!ListaFila(filaEsperaPouso))
printf("\nNao existem avioes na espera para pouso\n");
printf("Avioes na espera para Decolagem : ");
if (!ListaFila(filaEsperaDecolagem))
printf("\nNao existem avioes na espera para decolagem\n");
system("pause");
} while (opcao != 7);
return 0;
}
#pragma region Funções Fila
void FfVazia (TipoFila *Fila) {
Fila->Frente = (Apontador) malloc(sizeof(Celula));
Fila->Tras = Fila->Frente;
Fila->Frente->Prox = NULL;
}
bool Vazia (TipoFila Fila) {
return (Fila.Frente == Fila.Tras);
}
bool Enfileira(TipoItem Item, TipoFila *Fila) {
Fila->Tras->Prox = (Apontador) malloc(sizeof(Celula));
Fila->Tras = Fila->Tras->Prox;
Fila->Tras->Item = Item;
Fila->Tras->Prox = NULL;
return true;
}
bool Desenfileira (TipoItem *Item, TipoFila *Fila) {
Apontador q;
if (Vazia(*Fila)) {
printf("Fila Vazia!\n");
return false;
}
else {
q = Fila->Frente;
Fila->Frente = Fila->Frente->Prox;
*Item = Fila->Frente->Item;
free(q);
}
return true;
}
bool ListaFila(TipoFila X) {
Apontador aux; // Apontador temporário para rodar a fila
aux = X.Frente->Prox;
if (Vazia(X))
return false;
else {
while (aux != NULL) {
printf("%d\t", aux->Item.Chave);
aux = aux->Prox;
}
printf("\n");
}
return true;
}
#pragma endregion
int menu () {
int opcao;
printf(
"\t\t\t#########################################\n"
"\t\t\t# SISTEMA DE CONTROLE AEREO #\n"
"\t\t\t#########################################\n"
"\t\t\t#_ 1 . Solicitar pouso _#\n"
"\t\t\t#_ 2 . Inserir aviao para pouso _#\n"
"\t\t\t#_ 3 . Finalizar pouso _#\n"
"\t\t\t#_ 4 . Solicitar decolagem _#\n"
"\t\t\t#_ 5 . Inserir aviao para decolagem _#\n"
"\t\t\t#_ 6 . Finalizar decolagem _#\n"
"\t\t\t#_ 7 . Sair do programa _#\n"
"\t\t\t#########################################\n"
);
scanf("%d", &opcao);
return opcao;
}
#pragma region Entrada do avião
int ListaPista(int *pista) {
int check[2] = {0};
printf("PISTA\t\tAVIAO\n");
for (int i = 0; i < 3; i++) {
if (pista[i] == 0) {
printf("Pista %d\t =>\t -\n", i+1);
check[0]++;
check[1] = i;
}
else
printf("Pista %d\t =>\t %d\n", i+1, pista[i]);
}
if (check[0] == 3 || check[0] == 2 || check[0] == 1)
return check[0]; //Quantidade de pistas vazias
else
return -1; //Pista Cheia
}
int LiberaPista(int *pista) {
system("cls");
int check = ListaPista(pista);
int numero;
bool verifica;
if (check == 3) {
printf("Nao existem avioes nas pistas!\nNao autorizado!\n");
return -1;
}
else {
do {
printf("Digite o numero da Pista para finalizar a atividade: ");
scanf("%d", &numero);
numero--;//Acertando o numero da pista com posição no vetor
if (pista[numero]) {
printf("Pista %d liberada com sucesso!\nAviao %d\n", numero+1, pista[numero]);
return numero;
}
else {
printf("Nao ha avioes na pista %d!\nEscolha outra pista!", numero);
verifica = false;
}
} while (verifica = false);
}
return -1;
}
bool Pousar(int *pista, int aviao) {
int numeroPista;
printf("Digite o numero da Pista para pouso: ");
scanf("%d", &numeroPista);
numeroPista--; //Acertando o numero da pista com posição no vetor
if (pista[numeroPista] != 0)
printf("Pista %d ocupada, escolha outra acima\n", numeroPista);
else
pista[numeroPista] = aviao;
return true;
}
#pragma endregion
#pragma region Saída do avião
int VerificaHangar(int *hangar){
for (int i = 0; i < max; i++){
if (!hangar[i])
return i;
}
return -1;
}
int ListaHangar(int *hangar) {
int i = 0, j = 0;
printf("Avioes no Hangar : \nAviao\t\t\tHangar\n");
while (i < max) {
if (hangar[i] > 0) {
printf(" %d\t\t\t %d\n", hangar[i], i+1);
j++;
}
i++;
}
printf("Quantidade de Avioes no Hangar : %d\n", j);
return j; //Retorna a quantidade de avioes no hangar
}
int Decolar(int *pista, int aviao) {
int numeroPista;
printf("Digite o numero da Pista para Decolagem: ");
scanf("%d", &numeroPista);
numeroPista--;//Acertando o numero da pista com posição no vetor
if (pista[numeroPista] != 0) {
printf("A pista ocupada, escolha outra acima\n");
return -1;
}
else
pista[numeroPista] = aviao;
return numeroPista+1;
}
int BuscaHangar(int aviao, int *hangar) {
int i = 0;
while (i < max) {
if (hangar[i] == aviao)
return i;
i++;
}
return -1;
}
#pragma endregion
Um parser para tratar opções passadas para um programa em C
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)
Alternativas ao Multilogin para gerenciamento de múltiplas contas/prof... (0)









