Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

O aeroporto de Coimbra

Mensagens Recomendadas

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;
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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}};
...
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ?

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.