Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Universidade de Brasilia
- Departamento de Ciência da Computação
- Estruturas de Dados - Prof Díbio
- Alunos: Filipe Miguel Ribeiro 11/0029224 Hercules Nunes 11/0070747
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- #define DEP 3*60
- #define LAND 4*60
- /*Estruturas dos voos*/
- struct voo{
- char codigo[7] ;
- char tipo;//A ou D;
- int comb;
- time_t time;
- struct voo* prox;
- };
- typedef struct voo Voo;
- /*Estruturas das pistas*/
- struct fila{
- Voo* ini ;
- Voo* fim ;
- };
- typedef struct fila Fila ;
- /*Cabecalho das funcoes*/
- int geraRand(int min, int max);
- Voo* insereEV(Voo* EV, char* codigo, char t);
- void libera(Fila *f);
- void insere(Fila *f, Voo* aux);
- Voo* ins_fim(Voo* fim, Voo* aux);
- Fila *cria(void);
- void imprimeFila(Voo* ini);
- Voo *EVretira(Voo* EV);
- int BuscaComb0(Voo* EV, Fila** pista,time_t* agora);
- int max(int x1, int x2, int x3);
- int main(){
- time_t agora[3];
- int hora=((time(NULL)/3600)-3)%24, min = (time(NULL)/60)%60, seg = time(NULL)%60;
- int total_simulacao=0;
- int NApro=0, NDec=0, NVoos=0;
- int i, j = 0, comb0;
- Voo* EVlist=NULL;
- Fila *pista[3];
- char codigos[][7] = {"VG3001", "JJ4404", "LN7001", "TG1501",
- "GL7602", "TT1010", "AZ1009", "AZ1008", "AZ1010", "TG1506", "VG3002", "JJ4402", "GL7603",
- "RL7880", "AL0012", "TT4544", "TG1505", "VG3003", "JJ4403", "JJ4401", "LN7002", "AZ1002",
- "AZ1007", "GL7604", "AZ1006", "TG1503", "AZ1003", "JJ4403", "AZ1001", "LN7003", "AZ1004",
- "TG1504", "AZ1005", "TG1502", "GL7601", "TT4500", "RL7801", "JJ4410", "GL7607", "AL0029",
- "VV3390", "VV3392", "GF4681", "GF4690", "AZ1020", "JJ4435", "VG3010", "LF0920", "AZ1065",
- "LF0978", "RL7867", "TT4502", "GL7645", "LF0932", "JJ4434", "TG1510", "TT1020", "AZ1098",
- "BA2312", "VG3030", "BA2304", "KL5609", "KL5610", "KL5611"};
- for(i=0;i<3;i++)
- agora[i] = time(NULL);
- /*geração dos voos*/
- srand(time(NULL));
- NVoos = geraRand(32,64);
- NApro = geraRand(10,32);
- NDec = NVoos - NApro;
- /*Preenchendo o campo de codigos nos primeiros voos na lista de eventos*/
- for(i=0;i<NApro;i++)
- EVlist = insereEV(EVlist,codigos[i],'a');
- /*Preenchendo o campo de codigos os restantes dos voos com na lista de eventos*/
- for(i=NApro;i<NVoos;i++)
- EVlist = insereEV(EVlist,codigos[i],'d');
- /*Criação das pistas (filas)*/
- for(i=0;i<3;i++)
- pista[i] = cria();
- /*Computando a quantidade de voos com combustivel 0*/
- comb0 = BuscaComb0(EVlist,pista,agora);
- if(comb0>3){
- printf("Alerta Geral de Desvio de Aeronave!\n\n");
- exit(1);
- }
- /*Preenchendo os voos em suas respectivas pistas (filas)*/
- for(i=0;i<NVoos-comb0;i++){
- switch (EVlist->tipo){
- case 'a':
- if(j%2==0){
- agora[j%2]=agora[j%2]+LAND;
- EVlist->time=agora[j%2];
- insere(pista[j%2],EVlist);
- }
- else{
- agora[j%2]=agora[j%2]+LAND;
- EVlist->time=agora[j%2];
- insere(pista[j%2],EVlist);
- }
- j++;
- break;
- case 'd':
- agora[2]=agora[2]+DEP;
- EVlist->time=agora[2];
- insere(pista[2], EVlist);
- break;
- }
- EVlist = EVretira(EVlist);
- }
- /*Imprimindo os resultados dos eventos*/
- printf("******************************************************************\n");
- printf(" Aeroporto Internacional do Paraiso \n");
- printf("******************************************************************\n");
- printf("Hora Atual: %.2d:%.2d:%.2d\n", hora,min,seg);
- printf("NVoos: \t%d\n", NVoos);
- printf("NApro: \t%d\n", NApro);
- printf("Ndec: \t%d\n", NDec);
- printf("\nPista1: \n\n");
- imprimeFila(pista[0]->ini);
- printf("\nPista2: \n\n");
- imprimeFila(pista[1]->ini);
- printf("\nPista3: \n\n");
- imprimeFila(pista[2]->ini);
- for(i=0;i<3;i++)
- libera(pista[i]);
- return 0;
- }//fim do programa principal
- /**************************Funcoes************************/
- /*Insere o voo na lista de eventos e preenche o codigo e combustivel*/
- Voo* insereEV(Voo* EV, char* codigo, char t){
- Voo* v = (Voo*)malloc(sizeof(Voo));
- strcpy(v->codigo, codigo);
- if(t=='d')
- v->comb = 12;
- else
- v->comb = geraRand(0,12);
- v->tipo = t;
- v->prox = EV;
- return v;
- }
- /*cria a filas(pistas)*/
- Fila *cria(void){
- Fila* f = (Fila*)malloc(sizeof(Fila)) ;
- f->ini = f->fim = NULL ;
- return f ;
- }
- /*insere o novo voo no fim da lista de eventos*/
- Voo* ins_fim(Voo* fim, Voo* aux){
- Voo* p = (Voo*)malloc(sizeof(Voo)) ;
- strcpy(p->codigo,aux->codigo);
- p->tipo = aux->tipo;
- p->comb = aux->comb;
- p->time = aux->time;
- p->prox=NULL;
- if(fim!=NULL)
- fim->prox = p ;
- return p ;
- }
- /*Insere o voo na fila (pista)*/
- void insere(Fila *f, Voo* aux){
- f->fim = ins_fim(f->fim, aux);
- if (f->ini==NULL)
- f->ini = f->fim ;
- }
- /*Verifica se a fila esta vazia*/
- int vazia(Fila* f){
- return (f->ini==NULL);
- }
- /*Libera a fila*/
- void libera(Fila *f){
- Voo* q = f->ini;
- while(q!=NULL){
- Voo* t = q->prox ;
- free(q);
- q = t ;
- }
- free(f);
- }
- /*Gerador de numeros pseudoaleatorios*/
- int geraRand(int min, int max){
- int r;
- r=min+rand()%(max-min+1);
- return r;
- }
- /*Imprime os elementos da referida fila (pista)*/
- void imprimeFila(Voo* ini){
- while(ini!=NULL){
- printf("Voo: %s", ini->codigo);
- printf(" [%c(%.2d)] \tHorario: - %d:%.2d\n", ini->tipo, ini->comb,
- ((ini->time/3600)-3)%24,( (ini->time/60)%60)) ;
- ini = ini->prox;
- }
- }
- /*Retira o elemento da lista de eventos apos ser processado*/
- Voo* EVretira(Voo* EV){
- Voo* p = EV->prox;
- free(EV);
- return p;
- }
- //Busca os Voos com prioridade de atendimento e coloca nas filas
- int BuscaComb0(Voo* EV, Fila** pista,time_t* agora){
- int comb0=0;
- Voo* ant= (Voo*)malloc(sizeof(Voo));
- ant=NULL;
- //retira os primeiro evento da lista se tiverem combustivel 0
- //e coloca em uma das pistas
- while(EV->comb==0){
- EV->time = agora[comb0%3];
- agora[comb0%3] = agora[comb0%3] + LAND;
- insere(pista[comb0%3],EV);
- EV = EVretira(EV);
- comb0++;
- }
- ant = EV;
- EV = EV->prox;
- //retira um evento do meio da lista e coloca nas filas de pouso
- //em caso de combustivel 0
- while(EV!=NULL){
- if(EV->comb==0){
- EV->time = agora[comb0%3];
- agora[comb0%3] = agora[comb0%3] + LAND;
- insere(pista[comb0%3], EV);
- comb0++;
- EV = EVretira(EV);
- ant->prox = EV;
- }
- ant = EV;
- //retira o elemento do final da lista de eventos
- if(EV!=NULL)
- EV = EV->prox;
- }
- //retorna o numero de Voos com combustivel 0
- return comb0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement