Controle de tráfego aéreo - filas dinâmicas
Publicado por Diego Furtado (última atualização em 01/10/2009)
[ Hits: 14.902 ]
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
Loop de Várias Váriáveis Em Um Único Laço "For" em C
Embutir texto em arquivos de imagem
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta