Controle de tráfego aéreo - filas dinâmicas
Publicado por Diego Furtado (última atualização em 01/10/2009)
[ Hits: 15.335 ]
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
Retorna o tempo ocioso em uma sessão do X
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Como implementar Raid (0, 1, 5, 6, 10 e 50)
fusermount3 no Ubuntu 25.10 - mantenha o perfil do AppArmor
[Resolvido] dlopen(): error loading libfuse.so.2 AppImages require FUSE to run.
Criação de diretórios e aplicação de restrições de acesso no Linux
Como programar um sistema de controle para distribuições linux em c? (0)
Compartilhar ZEBRA ZD220 na rede (2)
Como programar um software que seja utilizado para coleta de dados em ... (1)









