/*
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;
}
Comments