miguel747 icon

Projeto2ED

miguel747 | PRO | 09/23/11 11:18:20 PM UTC | 0 ⭐ | 320 👁️ | Never ⏰ | []
C |

6.66 KB

|

None

|

0 👍

/

0 👎

/*
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