Jump to content
thinkabout

O aeroporto de Coimbra

Recommended Posts

thinkabout

Boas Pessoal,

Estou com dúvidas de como fazer o cabeçalho da aliena f)

int japartiu(voo aero[], tempo actual) {...} // Alinea f

Também estou com duvidas de como iniciar voos no array logo com a hora actual.


voo aero[MAX] = {{323,"TAP","faro", ??? },{12,"WOW","lenta", ??? }};

O aeroporto de Coimbra pretende um programa para gerir a informação relativa às partidas de

voos. Cada voo é identificado por: número do voo, nome da companhia, cidade destino e hora de

partida (horas e minutos).

a) Crie um tipo estruturado chamado struct tempo que permita armazenar as componentes de

uma determinada hora de um dia (horas e minutos).

b) Crie um tipo estruturado chamado struct voo que lhe permita armazenar a informação

relativa a um voo. O campo que armazena a hora de partida deve ser do tipo struct tempo.

c) Desenvolva uma função que escreva o conteúdo dos campos de uma variável estruturada do

tipo struct voo. A função recebe como argumento a variável já preenchida.

d) Desenvolva uma função que permita introduzir informação relativa a um novo voo. É

passado como argumento um ponteiro para a estrutura a inicializar.

e) Desenvolva uma função que altere a hora de partida de um voo. Recebe como argumento um

ponteiro para uma estrutura já preenchida e solicita ao utilizador as novas componentes da

hora para efectuar a alteração.

f) Desenvolva uma função que verifique se um determinado voo já partiu. Recebe como

argumentos uma estrutura do tipo struct voo onde está armazenada a informação do voo e

uma estrutura do tipo struct tempo onde está armazenada a hora actual. Devolve 1 se o voo já

tiver partido, ou 0, se isso ainda não tiver acontecido.

g) Declare uma tabela que lhe permita armazenar informação relativa a 300 voos. A tabela deve

ser uma variável local da função main().

h) Desenvolva uma função que permita adicionar informação sobre um ou mais novos voos à

tabela de voos. A função recebe como argumentos um ponteiro para o início da tabela e o

número de voos que esta contém. Devolve como resultado o número de voos que se

encontram na tabela depois das operações de inserção. É o utilizador que indica quantas

novas entradas quer inserir e que especifica a informação relativa a cada um dos novos voos.

i) Desenvolva uma função que liste a informação completa de todos os voos armazenados na

tabela. A função recebe como argumentos um ponteiro para o início da tabela e o número de

voos que esta contém.

j) Desenvolva uma função que verifique quais os voos que partem nos próximos 30 minutos.

Deve ser escrito o número, o destino e o tempo que falta para a partida de cada um desses

voos. Um ponteiro para o início da tabela de voos, o número de elementos que esta contém e

a hora actual são passados como argumentos.

k) Desenvolva uma função que retire da tabela todos os voos que já partiram. Um ponteiro para

o início da tabela, o número de elementos que esta contém e a hora actual são passados como

argumentos. Devolve como resultado o número de voos que ficaram na tabela.

l) Crie um programa que construa um menu com o seguinte formato:

1. Introduzir novos voos

2. Listar todos os voos

3. Listar proximos voos

4. Actualizar tabela de voos

5. Terminar

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ST_TAM  50
#define MAX 300

// Estrutura auxiliar para armazenar as componentes de uma hora: horas + minutos (alinea a))

struct tempo{
   int h, m;
};    

// Estrutura para armazenar informação sobre um voo (alinea b))

struct aviao
{
   int num;                    // Numero do voo 
   char companhia[sT_TAM];     // Companhia   
   char destino[sT_TAM];       // Cidade de destino
   struct tempo hora_p;        // Hora de partida
};    
typedef struct aviao voo;

// Função que obtém a hora do sistema e a devolve numa estrutura do tipo struct tempo
struct tempo hora_actual()
{
   time_t a;
   struct tm* b;
   struct tempo actual;

   time(&a);
   b = localtime(&a);
   actual.h = b->tm_hour;
   actual.m = b->tm_min;
   return actual;
}

void imprimeVoo(voo aero) //(alinea c)
{
   printf("Voo %d - Companhia %s - Cidade de destino %s, O voo e as horas %d e %d minutos\n",aero.num,aero.companhia,aero.destino,aero.hora_p.h,aero.hora_p.m);

}

void listatotal(voo aero[], int total)
{
   int i;

   for (i = 0; i < total; i++)
   {
       imprimeVoo(aero[i]);
   }

}

int isereVoo(voo aero [], int total) // (alinea d)
{

   puts("Nr do voo");
   scanf("%d",&aero->num); // Nr do Voo
   fflush(stdin);
   puts("Companhia");
   gets(aero->companhia); 
   puts("Destino");
   gets(aero->destino);
   puts("Horas:Minutos");
   scanf("%d:%d" ,&aero->hora_p.h,&aero->hora_p.m);
   return total+1;
}

void alterahoraVoo(voo aero [], int total) // (alinea e)
{
   int nrvoo,horas,minutos,i;
   puts("Qual e nr do voo que pretende alterar ?"); 
   scanf("%d", &nrvoo);
   puts("Qual e a nova hora do voo ? h:m"); 
   scanf("%d:%d", &horas,&minutos);

   for (i = 0; i < total && aero[i].num != nrvoo; i++) // Posiciono no voo que quero alterar
   {
       ;
   }
   // Como o I não se altera já estou no indice que pretende.
   aero[i].hora_p.h=horas;
   aero[i].hora_p.m=minutos;

}

/*
Desenvolva uma função que verifique se um determinado voo já partiu.

Recebe como argumentos uma estrutura do tipo struct voo onde está armazenada a informação do voo e
uma estrutura do tipo struct tempo onde está armazenada a hora actual. 

Devolve 1 se o voo já tiver partido, ou 0, se isso ainda não tiver acontecido.
*/

int japartiu(voo aero[], tempo actual) // Alinea f
{


}

// Função auxiliar para mostrar o menu e obter a opção desejada pelo utilizador
// Devolve a opção seleccionada como resultado
int menu()
{
   int op;
   struct tempo actual = hora_actual();

   printf("%2.2d:%2.2d\n", actual.h, actual.m);

   printf("\n1 - Introduzir novos voos");
   printf("\n2 - Listar todos os voos");
   printf("\n3 - Listar proximos voos");
   printf("\n4 - Alterar hora do voo");
   printf("\n5 - Terminar");
   do{
       printf("\nOpcao: ");
       scanf("%d", &op);
   }while(op<1 || op>5);
   return op;
}    

int main(int argc, char *argv[])
{
   int i;

   // Declaração das variáveis locais: (alinea g))
   voo aero[MAX] = {{323,"TAP","faro"},{12,"WOW","lenta"}};
   int total=2;

   // Ciclo principal do programa
   do{
       i=menu();
       switch(i){
       case 1: total=isereVoo(aero,total); break;
       case 2: listatotal(aero,total);        break;
       case 3: japartiu(aero,hora_actual());        break;  
       case 4: alterahoraVoo(aero,total);         break;  
       }       
   }while(i!=5);    

   return 0;
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

Estou com dúvidas de como fazer o cabeçalho da aliena f)

O cabeçãlho está feito ... onde está o problema ?

Também estou com duvidas de como iniciar voos no array logo com a hora actual.

voo aero[MAX] = {{323,"TAP","faro", {23, 55} },{12,"WOW","lenta", {0, 43} }};


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout

O cabeçãlho está feito ... onde está o problema ?

Estou a enviar a informação assim.

void japartiu(voo aero[], tempo actual) // Alinea f
{
}

case 3: japartiu(aero,hora_actual());        break;  

Não sei... o compilador dá-me isto, ás tantas nem estou a perceber o que me é pedido :(.

Error 1 error C2146: syntax error : missing ')' before identifier 'actual'

Error 2 error C2081: 'tempo' : name in formal parameter list illegal

Error 3 error C2061: syntax error : identifier 'actual'

Error 4 error C2059: syntax error : ';'

Error 5 error C2059: syntax error : ')'

voo aero[MAX] = {{323,"TAP","faro", {23, 55} },{12,"WOW","lenta", {0, 43} }};

Em relação a isto, assim funciona.

Entretanto descobri o que queria.

int main(int argc, char *argv[])
{
...
   struct tempo embarque = hora_actual();

   voo aero[MAX] = {{323,"TAP","faro",embarque.h,embarque.m},{12,"WOW","lenta",1,15}};
...
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

Estou a enviar a informação assim.

void japartiu(voo aero[], tempo actual) // Alinea f
{
}

Error 1 error C2146: syntax error : missing ')' before identifier 'actual'

Error 2 error C2081: 'tempo' : name in formal parameter list illegal

Error 3 error C2061: syntax error : identifier 'actual'

Error 4 error C2059: syntax error : ';'

Error 5 error C2059: syntax error : ')'

"struct tempo"

o tipo de dados "tempo" não está difinido ... deveria ser "struct tempo"


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout

f) Desenvolva uma função que verifique se um determinado voo já partiu. Recebe como

argumentos uma estrutura do tipo struct voo onde está armazenada a informação do voo e

uma estrutura do tipo struct tempo onde está armazenada a hora actual. Devolve 1 se o voo já tiver partido, ou 0, se isso ainda não tiver acontecido.

int japartiu(voo aero[], struct tempo hora_actual) // Alinea f
{
   int i,nrvoo;

   puts("Qual o voo que quer verificar");
   scanf("%d", &nrvoo);

   i=procuravoo( aero,nrvoo); // Vou achar o Indice do voo que quero verificar

   if (aero[i].hora_p.h <= hora_actual.h && aero[i].hora_p.m < hora_actual.m)
   {
       puts("estou a retornar 0, ainda não parti"); // debug
       return 0;
   }

   puts("estou a retornar 1, pois já parti"); // debug
   return 1;
}

int procuravoo(voo aero [], int nrvoo)
{
   int i;

   for (i = 0; i < MAX  && aero[i].num != nrvoo; i++) // Posiciono no voo que quero alterar
   {
       ;
   }
       // Como o I não se altera já estou no indice que pretende.

   return i;
}

h) Desenvolva uma função que permita adicionar informação sobre um ou mais novos voos à

tabela de voos. A função recebe como argumentos um ponteiro para o início da tabela e o

número de voos que esta contém. Devolve como resultado o número de voos que se

encontram na tabela depois das operações de inserção. É o utilizador que indica quantas

novas entradas quer inserir e que especifica a informação relativa a cada um dos novos voos.

int isereVoos(voo aero [], int total) //  Alinea h 

   int i,quantidade;
   voo tmp;
   puts("Quantos voos queres inserir ?");
   scanf("%d", &quantidade);

   for (i = 0; i < quantidade; i++)
   {
   puts("Nr do voo");
   scanf("%d",&tmp.num); // Nr do Voo
   fflush(stdin);
   puts("Companhia");
   gets(tmp.companhia); 
   puts("Destino");
   gets(tmp.destino);
   puts("Horas:Minutos");
   scanf("%d:%d" ,&tmp.hora_p.h,&tmp.hora_p.m);

   aero[total]=tmp;

   total=total+1;
   }

   return total;
}

Agradeço ideias de melhoramento / correcções.

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

pensa bem no que acontece quando o voo não é encontrado

alem disso olha para o teu if de comparação de tempo e responde a esta questão :

- 03:03 é menor ou maior que 02:04 ? o que o if responde ?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout

pensa bem no que acontece quando o voo não é encontrado

alem disso olha para o teu if de comparação de tempo e responde a esta questão :

- 03:03 é menor ou maior que 02:04 ? o que o if responde ?

int japartiu(voo aero[], struct tempo hora_actual) // Alinea f
{
   int i,nrvoo;

   puts("Qual o voo que quer verificar");
   scanf("%d", &nrvoo);

   i=procuravoo( aero,nrvoo); // Vou achar o Indice do voo que quero verificar

   if (i == -1) // O voo não existe , logo vou-me embora.
   {
       return -1; 
   }

   if (aero[i].hora_p.h >= hora_actual.h && aero[i].hora_p.m > hora_actual.m)
   {
       puts("estou a retornar 0, ainda não parti"); // debug
       return 0; 
   }
   else
   {
       puts("estou a retornar 1, pois já parti"); // debug
       return 1;
   }

}

int procuravoo(voo aero [], int nrvoo) // O voo não pode ser o 0, pq o array como já foi iniciado está todo prenchido a 0 as posições não "declaradas".
{
   int i=0;

   if (nrvoo == aero[i].num) // Caso o voo seja o primeiro.
   {
       puts("O voo existe e esta no indice 0");
       return i; // O voo existe e está no indice 0
   }

   do // Vou pecorrendo os voos
   {
       i++;
   } while (i < MAX-1 &&  aero[i].num != nrvoo );


   if (i != MAX-1 ) // o  voo existe
   {
       printf("o voo esta no indice indice %d \n", i);
       return i;
   }
   else
   {
       if (i == MAX-1 && nrvoo == aero[i].num) // caso o voo seja o último do array
       {
           printf("o voo esta no indice indice %d \n", i);
           return MAX-1;
       }
       else
       {
           puts("O voo nao existe");
           return -1;
       }
   }

}

Estou a assumir que os dados são perfeitos.

Aqui se tiver um voo às 23.45 e outro 01:34, dá barraca porque não estou a ter em consideração o dia.

Tal com o - 03:03 é menor ou maior que 02:04 ? o que o if responde ?, dá asneira.

Infelizmente não tenho muito tempo para limar estes detalhes.

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

j) Desenvolva uma função que verifique quais os voos que partem nos próximos 30 minutos.

Deve ser escrito o número, o destino e o tempo que falta para a partida de cada um desses

voos. Um ponteiro para o início da tabela de voos, o número de elementos que esta contém e

a hora actual são passados como argumentos.

void proxtrintaminutos(voo aero [], int total, struct tempo hora_actual) // alinea j
{
   int i,tempo=0;

   for (i = 0; i < total; i++)
   {
       tempo=segundos(abs(hora_actual.h-aero[i].hora_p.h), abs(hora_actual.m-aero[i].hora_p.m));
       if (tempo < 1800)
       {
           printf("Este voo vai sair daqui a menos de 30 minutos -\n ");
           imprimeVoo(aero[i]);
       }
   }
}

int segundos(int horas, int minutos)
{
return (((horas*60)+minutos)*60); // Transformação de horas em minutos
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
thinkabout

k) Desenvolva uma função que retire da tabela todos os voos que já partiram. Um ponteiro para

o início da tabela, o número de elementos que esta contém e a hora actual são passados como

argumentos. Devolve como resultado o número de voos que ficaram na tabela.

int limpavoosquejaforam(voo aero [], int total, struct tempo hora_actual)
{
int i,total2;

for (i = 0; i <= total; i++)  // O total pode ser alterado porque se vou tirar o que está no último depois não preciso lá ir.
{
	printf("estou a verificar o indice %d \n", i);
	if (aero[i].hora_p.h <= hora_actual.h && aero[i].hora_p.m < hora_actual.m) 
	{
	printf("vou modificar o voo %d e vou copiar para cima dele a informação que esta no indice %d \n", i,total-1);
	aero[i]=aero[total-1];
	total = total-1;	
	}
}
printf("Fiquei com %d voos no total \n", total);
return total;
}

Share this post


Link to post
Share on other sites
HappyHippyHippo

Infelizmente não tenho muito tempo para limar estes detalhes.

um detalhe suficiente para inutilizar todas as funções/alínias que usam esse método de comparação de tempos


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
thinkabout

um detalhe suficiente para inutilizar todas as funções/alínias que usam esse método de comparação de tempos

Yep vi isso , quando fiz o resto do exercício.

Apesar de não ser muito o meu feitio, há outros tópicos das matérias que eu tenho que ver além das estruturas.

E os profs passam a vida a dizer "Há e tal assumam que os dados são perfeitos..."

Ainda andei um pouco de volta do difftime, mas não atinei com a função.

A alinea j)

int segundos(int horas, int minutos)
{
       return (((horas*60)+minutos)*60); // Transformação de horas em minutos
}

Acabei por resolver assim.

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

Yep vi isso , quando fiz o resto do exercício.

Apesar de não ser muito o meu feitio, há outros tópicos das matérias que eu tenho que ver além das estruturas.

E os profs passam a vida a dizer "Há e tal assumam que os dados são perfeitos..."

Ainda andei um pouco de volta do difftime, mas não atinei com a função.

o exemplo dos dados que apresentei, os dados são validos ("perfeitos"), logos o problema é sério e não pode ser ignorado, pela simples razão que é parte fundamental do problema.

exemplos:

f) Desenvolva uma função que verifique se um determinado voo já partiu

a função resolve correctamente isto: não porque não verifica correctamente valores de tempo válidos !!

logo está intrinsecamente errado.

A alinea j)

int segundos(int horas, int minutos)
{
       return (((horas*60)+minutos)*60); // Transformação de horas em minutos
}

Acabei por resolver assim.

no teu problema não existe informação ao nível dos segundos, por isso bastaria ter uma função para resolução ao minuto.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.