/* 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 #include #include #include #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;i3){ printf("Alerta Geral de Desvio de Aeronave!\n\n"); exit(1); } /*Preenchendo os voos em suas respectivas pistas (filas)*/ for(i=0;itipo){ 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; }