Você está na página 1de 41

ndice

Relatrio 1 Estrutura de Dados


Concluses ..................................................................................................................... 02
Alocao Esttica de Memria ...................................................................................... 02
Programa 1.0
Descrio ........................................................................................................... 03
Arquivo funcoes.h .......................................................................................... 04
Arquivo main.c ............................................................................................... 06

Relatrio 2 Listas Ligadas


Programa 2.0
Descrio ........................................................................................................... 09
Funes .............................................................................................................. 09
ScreenShots ........................................................................................................ 10
Arquivo funcoes.h .......................................................................................... 11
Arquivo main.c ............................................................................................... 21
Programa 3.0
Descrio ........................................................................................................... 30
ScreenShots ........................................................................................................ 30
Arquivo funcoes.h .......................................................................................... 31
Arquivo main.c ............................................................................................... 37

Relatrio 1 Estrutura de Dados

Concluses
Como podemos acompanhar na leitura dos textos propostos, chegamos a algumas
concluses sobre determinados temas discutidos na matria.
Alocao de memria nada mais do que o processo de reservar (utilizar) um espao
de memria durante a execuo de um determinado programa, a alocao de memria
pode ser esttica ou dinmica, dependendo das necessidades do programa.
Ponteiros em C, so variveis que tem como valor o endereo de memria de outras
variveis, ele utilizado para fazer referencia ao endereo nele contido.
Estruturas. Quando se pensa em Estruturas, voc est pensando em um tipo de varivel
(ou dado) que guarde consigo vrios tipos de informaes relacionadas. Ou seja um
dado do tipo calendrio, que possa ser capaz de armazenar dias, meses e anos em
formato Inteiro, e tambm o nome dos meses e dias da semana em formato String. Na
prtica voc cria uma referencia a uma estrutura, e dentro dela voc ter as variveis de
tipo primitivo que guardaro as informaes inerentes aquele tipo de dado.
Vetores nada mais so do que uma sequencia de vrios valores de um mesmo tipo, por
exemplo do tipo inteiro. A ideia se usar os vetores toda vez que voc tiver que guardar
uma sequencia de informaes de um mesmo tipo, ao invs de se declarar inmeras
variveis para armazenar os valores, voc cria um vetor e armazena suas informaes
dentro deste vetor.
Strings de caracteres, so vetores do tipo char, que so usados para guardar uma cadeia
de caracteres, que podem formar palavras ou textos. O ultimo caractere de uma string
o caractere especial \0, que indica para o programa que a string acabou, mesmo que o
vetor contenha espao para mais caracteres. Na biblioteca String.h, existem vrias
funes para o tratamento das string, funes que vo desde retornar o tamanho da
string, copiar o contedo da string A para a string B, como tambm converter uma
string, em inteiro ou float, entre outros.

Alocao Esttica de Memria


A alocao de memria, o processo no qual o programa solicita o uso de memria ao
Sistema Operacional. Na alocao esttica de memria, na hora da compilao o
programa j sabe quanto de espao que ser utilizado pelas variveis. Desta forma, no
possvel alterar o tamanho deste espao durante a execuo do programa. Exemplo
disso um simples programinha que retorna a soma de dois inteiros, levando em conta
que as nicas variveis utilizadas pelo programa seriam 3 variveis do tipo inteiro (duas
para armazenar os valores dos operandos e uma para armazenar o resultado), o
programa reservaria de forma esttica 12 bytes (cada inteiro ocupa 4 bytes).
2

Programa 1.0

Descrio
Como foi proposto no passo 3 da 1 etapa, foi desenvolvido um programa em C, que
implementasse uma estrutura nominada avio, com os seguintes campos: Modelo,
Fabricante, Passageiros, Comprimento, Altura, Velocidade, Altitude, Motor.
O programa deveria ser capaz de cadastrar os dados na estrutura, e posteriormente fazer
a leitura dos dados cadastrados. Para tal foi desenvolvido um programa em forma de
menu com 3 opes: cadastrar novos avies, exibir os avies cadastrados e encerrar o
programa. O menu funciona atravs da leitura da opo do usurio pela funo Scanf,
que armazena a opo digitada em uma varivel Op, atravs do desvio condicional
(switch) os comandos relacionados a opo escolhida so executados.
O que existe de mais notvel neste simples programa, o a aplicao de 3 funes (que
so muito semelhantes entre si), criadas para tornar o programa mais seguro. A estas
funes foram dados os nomes CapturarS, CapturarI, CapturarF; suas atribuies so
respectivamente: Capturar uma String digitada pelo usurio, podendo o programador
definir o limite mximo de caracteres aceitos. Capturar em formato de string, nmeros
digitados pelo usurio, e retorn-los em formato de Inteiros, podendo o programador
determinar o limite mximo de dgitos aceitos. Capturar em formato de string, nmeros
digitados pelo usurio, e retorn-los em formado de Float, podendo o usurio utilizar a
vrgula no lugar do ponto, ou vice e versa, e tambm ficando a critrio do programador
o nmero mximo de dgitos(a vrgula ou ponto pontuado como um dgito pela
funo).
No demais o programa em si bem simples, fazendo apenas a atribuio de valores aos
campos da estrutura, e posteriormente imprimindo na tela, os valores contidos nos
campos da estrutura.

Arquivo - funcoes.h
#ifndef FUNCOES_H_INCLUDED
#define FUNCOES_H_INCLUDED
//Cabecalho das Funes
void CapturarS(char *Variavel[],int Tamanho); // Capturar String
int CapturarI(int Tamanho); // Capturar Inteiro
float CapturarF(int Tamanho); // Capturar Float
void InserirLinha(int Tamanho); // Imprimir Linha
//Funes
void CapturarS(char *Variavel[],int Tamanho){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
Tempo[i] = Teste;
}
}
Tempo[Final] = 0;
strcpy(Variavel,Tempo);
}
int CapturarI(int Tamanho){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{

if(Teste > 47 && Teste < 58){


Tempo[i] = Teste;
}else{
printf("%c",8);
printf(" ");
printf("%c",8);
i--;
}
}
}
Tempo[Final] = 0;
return atoi(Tempo);
}
float CapturarF(int Tamanho){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
if((Teste > 47 && Teste < 58) || (Teste == 46 || Teste ==
44)){
if(Teste == 44){
Teste = 46;
}
Tempo[i] = Teste;
}else{
printf("%c",8);
printf(" ");
printf("%c",8);
i--;
}
}
}
Tempo[Final] = 0;
return atof(Tempo);
}
void InserirLinha(int Tamanho){
int i = 0;
printf("\n");
for(i=0;i<Tamanho;i++){
printf("_");
}
}
#endif // FUNCOES_H_INCLUDED

Arquivo - main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIM 25
#include "funcoes.h"
struct aviao{
char modelo [15];
char fabricante [15];
int passageiros;
float comprimento;
float altura;
float velocidade;
float altitude;
char motor[15];
};

int main()
{
struct aviao VoebemAvioes[LIM];
int LoopP = 0, Op = 0, i = 0, indice = 0;
float TESTE = 0;
while (LoopP == 0){
system("cls");
fflush(stdin); // Limpar o Buffer caso o usurio digite um
caractere no Scanf (Windows)
printf("Escolha uma Opcao\n");
printf("\n1 - Cadastrar Novo Aviao");
printf("\n2 - Exibir Avioes Cadastrados");
printf("\n3 - Encerrar Aplicacao");
printf("\n\nDigite sua opcao: ");
scanf("%d", &Op);
switch(Op){
case 1:
system("cls");
if(indice == LIM){
printf("A lista de Avioes ja esta cheia!\n");
system("pause");
LoopP == 0;
}else{
LoopP = 2;
while(LoopP == 2){
system("cls");
printf("Digite Modelo do Aviao: ");
CapturarS(VoebemAvioes[indice].modelo,14);
printf("\n\nDigite o Fabricante do Aviao:

");

CapturarS(VoebemAvioes[indice].fabricante,14);
Passageiros do Aviao:

printf("\n\nDigite o numero maximo de


");
VoebemAvioes[indice].passageiros =

CapturarI(4);
printf("\n\nDigite o comprimento do Aviao:
");
VoebemAvioes[indice].comprimento =
CapturarF(6);
printf("\n\nDigite a altura do Aviao: ");
VoebemAvioes[indice].altura = CapturarF(6);
printf("\n\nDigite a veocidade max do Aviao:
");
VoebemAvioes[indice].velocidade =
CapturarF(6);
printf("\n\nDigite a altidue max do Aviao:
");
VoebemAvioes[indice].altitude = CapturarF(6);
printf("\n\nDigite o modelo do motor do Aviao:
");
CapturarS(VoebemAvioes[indice].motor,14);
system("cls");
printf("Os dados Inseridos para o novo Aviao
sao:\n");
printf("\nModelo:
%30s",VoebemAvioes[indice].modelo);
InserirLinha(42);
printf("\nFabricante:
%30s",VoebemAvioes[indice].fabricante);
InserirLinha(42);
printf("\nN Passageiros:
%27d",VoebemAvioes[indice].passageiros);
InserirLinha(42);
printf("\nComprimento:
%29.2f",VoebemAvioes[indice].comprimento);
InserirLinha(42);
printf("\nAltura:
%34.2f",VoebemAvioes[indice].altura);
InserirLinha(42);
printf("\nVelocidade:
%30.2f",VoebemAvioes[indice].velocidade);
InserirLinha(42);
printf("\nAltitude:
%32.2f",VoebemAvioes[indice].altitude);
InserirLinha(42);
printf("\nMotor:
%35s",VoebemAvioes[indice].motor);
InserirLinha(42);
printf("\n\n");
printf("Confirmar Informacoes? 1- Sim / 2 Nao\n");
scanf("%d",&LoopP);
}

indice++;
LoopP = 0;
}
break;
case 2:
system("cls");
printf("Modelo
|Fabricante
|Passag|Compri|Altura |Veloci|Altitu|Motor");
printf("\n");
printf("______________|______________|______|______|_______|______|___
___|_____________");

for(i=0;i<indice;i++){
printf("\n");
printf("
|
|
");
printf("\n");

printf("%-14s",VoebemAvioes[i].modelo);
printf("|%-14s",VoebemAvioes[i].fabricante);
printf("|%-4d ",VoebemAvioes[i].passageiros);
printf("|%-6.1f",VoebemAvioes[i].comprimento);
printf("|%-6.1f ",VoebemAvioes[i].altura);
printf("|%-6.1f",VoebemAvioes[i].velocidade);
printf("|%-6.1f",VoebemAvioes[i].altitude);
printf("|%-8s",VoebemAvioes[i].motor);
//printf("\n");
}
printf("\n");
printf("______________|______________|______|______|_______|______|___
___|_____________");
printf("\n\n");
system("pause");
break;
case 3:
LoopP = 1;
break;
default:
system("cls");
printf("Esta Opcao nao e valida!\n\n");
system("pause");
break;
}
}
return 0;
}

Relatrio 2 Listas Ligadas

Programa 2.0
Descrio do Programa
Foi proposto no passo 2 da 2 Etapa, que fosse desenvolvido um programa em
linguagem C que trabalha-se com uma estrutura de dados denominada Voo. A estrutura
deveria ser implementada de forma dinmica, e as aes cadastrar, consultar e remover,
deveriam ser implementadas atravs de funes.
Como no programa 1.0, utilizado um menu principal para dar acesso as funes do
programa. Algumas funes desenvolvidas para o programa 1.0 foram aprimoradas e
reutilizadas neste programa, so elas a CapturarS, CapturarI e CapturarF.

Descrio das Funes


Iniciar() : Esta funo a funo que inicializa a lista encadeada, retornando o valor
NULL como endereo para o ponteiro ancora da lista.
Vazio() : Esta funo utilizada para verificar se a lista est vazia. Ela verifica se o
ponteiro ancora da lista tem o valor NULL, retornando 1 se for verdadeiro, ou 0 se for
falso. Em outras palavras, se o ponteiro Ancora contiver o valor NULL a funo retorna
1, simbolizando que a lista est vazia.
Validar() : Verifica se os parmetros passados(que posteriormente sero utilizados para
inserir um novo elemento na lista), so vlidos. Ela imprime mensagens com os erros
encontrados, e retorna um inteiro com o nmero de erros, se no houver erros ela
retorna zero.
AdicionarVoo() : Esta funo adiciona um novo elemento a lista, com as informaes
passadas como parmetros, e retorna o endereo do novo item da lista.
ConsultaQTD() : Esta funo retorna o numero de elementos encontrados, com as
mesmas informaes passadas como parmetros.
ConsultarEnd() : Esta funo retorna o endereo do elemento da lista, com as mesmas
informaes passadas como parmetros, e na ordem informada. Em outras palavras, se
existem dois elementos na lista com as mesmas informaes dos parmetros
informados, e a ordem informada for 0(zero), ele vai retornar o endereo do primeiro
elemento encontrado, se a ordem for 1(um), ele retorna o endereo do segundo, se a
ordem for 2(dois) ele retorna o endereo do terceiro, e assim por diante.
ExibirTodos() : Esta funo exibe todos os elementos da lista.
ExibirDetalhes() : Esta funo exibe todos os detalhes do voo que tenha o seu nmero
igual ao informado.

Excluir() : Esta funo exclui elementos da lista, com base nos parmetros informados.

Telas do Programa

10

Arquivo - funcoes.h
#ifndef FUNCOES_H_INCLUDED
#define FUNCOES_H_INCLUDED
//Cabealho Funes
void CapturarS(char *Variavel[],int Tamanho); // Capturar String
int CapturarI(int Tamanho, int Digitos); // Capturar Inteiro
float CapturarF(int Tamanho); // Capturar Float
void ZerarEstrutura(voo *Estrutura);// Deixar Estrutura Zerada
voo* Iniciar(void); // Inicia a Lista Encadeada
int vazio(voo *Atual); // Funo para Retornar se Lista Esta vazia
int Validar(voo *Atual,voo Parametros); // Validar informaes
voo* AdicinoarVoo(voo *Atual, voo Auxiliar); // Adiciona novo item a
lista
int ConsultaQTD(voo *Atual, voo Parametros); // Retorna numero de
registros encontrados com base nos parmetros
voo* ConsultarEnd(voo *Atual, voo Parametros,int Ordem); // Retorna
Endereo de item da lista, com base em parmetros
void ExibirTodos(voo *Atual); // Exibe todos os itens da lista
void ExibirDetalhes(voo *Atual, int Num); // Exibi detalhes de um item
da lista, com base em parmetro
voo* Excluir(voo *Atual, voo Parametros); // Exclui itens da lista com
base em parmetros

// Funes
void CapturarS(char *Variavel[],int Tamanho){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
Tempo[i] = Teste;
}
if( i < -1){
i = -1;
printf(" ");
}
}

11

Tempo[Final] = 0;
strcpy(Variavel,Tempo);
}
int CapturarI(int Tamanho,int Digitos){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
if(Digitos > 9)
Digitos = 0;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 27)
return 0;
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
if(Teste > 47 && Teste < (58 - Digitos)){
Tempo[i] = Teste;
}else{
printf("%c",8);
printf(" ");
printf("%c",8);
i--;
}
}
if( i < -1){
i = -1;
printf(" ");
}
}
Tempo[Final] = 0;
return atoi(Tempo);
}

float CapturarF(int Tamanho){


int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();

12

if(Teste == 13 || Teste == 8){


if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
if((Teste > 47 && Teste < 58) || (Teste == 46 || Teste ==
44)){
if(Teste == 44){
Teste = 46;
}
Tempo[i] = Teste;
}else{
printf("%c",8);
printf(" ");
printf("%c",8);
i--;
}
}
if( i < -1){
i = -1;
printf(" ");
}
}
Tempo[Final] = 0;
return atof(Tempo);
}
void ZerarEstrutura(voo *Estrutura){
Estrutura->NumVoo = 0;
Estrutura->Data.dia = 0;
Estrutura->Data.mes = 0;
Estrutura->Data.ano = 0;
Estrutura->Data.nulo = 1;
Estrutura->Hora.hora = 0;
Estrutura->Hora.minuto = 0;
Estrutura->Hora.segundo = 0;
Estrutura->Hora.nulo = 1;
Estrutura->AeroportoSaida[0] = '\0';
Estrutura->AeroportoChegada[0] = '\0';
Estrutura->Rota[0] = '\0';
Estrutura->Tempo.hora = 0;
Estrutura->Tempo.minuto = 0;
Estrutura->Tempo.segundo = 0;
Estrutura->Tempo.nulo = 1;
Estrutura->Passageiros = 0;
}

13

voo* Iniciar(void){
return NULL;
}
int vazio(voo *Atual){
if (Atual == NULL)
return 1;
else
return 0;
}
int Validar(voo *Atual,voo Parametros){
int Erros = 0;
time_t Tempo;
int Teste;
voo Auxiliar;
ZerarEstrutura(&Auxiliar);
Auxiliar.NumVoo = 1;
Auxiliar.NumVoo = Parametros.NumVoo;
if(ConsultaQTD(Atual,Auxiliar) > 0){
printf("\nJa existe um voo com o numero informado:
%d\n",Parametros.NumVoo);
Erros++;
}
Tempo = time(NULL);
Teste = (Tempo/31556952)+1970;
if((Parametros.Data.ano < Teste) || (Parametros.Data.mes < 1 ||
Parametros.Data.mes > 12) || (Parametros.Data.dia < 1 ||
Parametros.Data.dia > 31)){
printf("\nA data informada nao e valida:
%02d/%02d/%04d\n",Parametros.Data.dia,Parametros.Data.mes,Parametros.D
ata.ano);
Erros++;
}else if ((Parametros.Data.mes == 4 || Parametros.Data.mes == 6 ||
Parametros.Data.mes == 9 || Parametros.Data.mes == 11) &&
(Parametros.Data.dia > 30)){
printf("\nA data informada nao e valida:
%02d/%02d/%04d\n",Parametros.Data.dia,Parametros.Data.mes,Parametros.D
ata.ano);
Erros++;
}else if(Parametros.Data.mes == 2 && Parametros.Data.dia > 29){
printf("\nA data informada nao e valida:
%02d/%02d/%04d\n",Parametros.Data.dia,Parametros.Data.mes,Parametros.D
ata.ano);
Erros++;
}
if (Parametros.Hora.hora > 23){
printf("\nA hora informada nao e valida:
%02d:%02d:%02d\n",Parametros.Hora.hora,Parametros.Hora.minuto,Parametr
os.Hora.segundo);
Erros++;
}else if(Parametros.Hora.minuto > 59){

14

printf("\nA hora informada nao e valida:


%02d:%02d:%02d\n",Parametros.Hora.hora,Parametros.Hora.minuto,Parametr
os.Hora.segundo);
Erros++;
}else if (Parametros.Hora.segundo > 59){
printf("\nA hora informada nao e valida:
%02d:%02d:%02d\n",Parametros.Hora.hora,Parametros.Hora.minuto,Parametr
os.Hora.segundo);
Erros++;
}
if (Parametros.Tempo.hora > 48){
printf("\nO tempo informado nao e valido:
%02d:%02d:%02d\n",Parametros.Tempo.hora,Parametros.Tempo.minuto,Parame
tros.Tempo.segundo);
Erros++;
}else if(Parametros.Tempo.minuto > 59){
printf("\nO tempo informado nao e valido:
%02d:%02d:%02d\n",Parametros.Tempo.hora,Parametros.Tempo.minuto,Parame
tros.Tempo.segundo);
Erros++;
}else if (Parametros.Tempo.segundo > 59){
printf("\nO tempo informado nao e valido:
%02d:%02d:%02d\n",Parametros.Tempo.hora,Parametros.Tempo.minuto,Parame
tros.Tempo.segundo);
Erros++;
}
Auxiliar = Parametros;
Auxiliar.NumVoo = 0;
Teste = ConsultaQTD(Atual,Auxiliar);
if ( Teste > 0){
printf("\nForam encontrados %d voos com as mesmas
informacoes.\n",Teste);
}
return Erros;
}
voo* AdicinoarVoo(voo *Atual, voo Auxiliar){
voo *novo = (voo*) malloc(sizeof(voo));
novo->NumVoo = Auxiliar.NumVoo;
novo->Data.dia = Auxiliar.Data.dia;
novo->Data.mes = Auxiliar.Data.mes;
novo->Data.ano = Auxiliar.Data.ano;
novo->Data.nulo = Auxiliar.Data.nulo;
novo->Hora.hora = Auxiliar.Hora.hora;
novo->Hora.minuto = Auxiliar.Hora.minuto;
novo->Hora.segundo = Auxiliar.Hora.segundo;
novo->Hora.nulo = Auxiliar.Hora.nulo;
strcpy(novo->AeroportoSaida,Auxiliar.AeroportoSaida);
strcpy(novo->AeroportoChegada,Auxiliar.AeroportoChegada);
strcpy(novo->Rota,Auxiliar.Rota);
novo->Tempo.hora = Auxiliar.Tempo.hora;
novo->Tempo.minuto = Auxiliar.Tempo.minuto;

15

novo->Tempo.segundo = Auxiliar.Tempo.segundo;
novo->Tempo.nulo = Auxiliar.Tempo.nulo;
novo->Passageiros = Auxiliar.Passageiros;
novo->Proxima = Atual;
return novo;
}
int ConsultaQTD(voo *Atual, voo Parametros){
int Dif = 0, Total = 0;
voo *Auxiliar = Atual;
while(Auxiliar != NULL){
if((Parametros.NumVoo != 0 ) && (Auxiliar->NumVoo !=
Parametros.NumVoo))
Dif++;
if((Parametros.Data.nulo != 1 ) && (Auxiliar->Data.dia !=
Parametros.Data.dia || Auxiliar->Data.mes != Parametros.Data.mes ||
Auxiliar->Data.ano != Parametros.Data.ano))
Dif++;
if((Parametros.Hora.nulo != 1 ) && (Auxiliar->Hora.hora !=
Parametros.Hora.hora || Auxiliar->Hora.minuto !=
Parametros.Hora.minuto || Auxiliar->Hora.segundo !=
Parametros.Hora.segundo))
Dif++;
if((Parametros.AeroportoSaida[0] != '\0' ) &&
(strcmp(Auxiliar->AeroportoSaida, Parametros.AeroportoSaida) != 0))
Dif++;
if((Parametros.AeroportoChegada[0] != '\0' ) &&
(strcmp(Auxiliar->AeroportoChegada, Parametros.AeroportoChegada) !=
0))
Dif++;
if((Parametros.Rota[0] != '\0' ) && (strcmp(Auxiliar->Rota,
Parametros.Rota) != 0))
Dif++;
if((Parametros.Tempo.nulo != 1 ) && (Auxiliar->Tempo.hora !=
Parametros.Tempo.hora || Auxiliar->Tempo.minuto !=
Parametros.Tempo.minuto || Auxiliar->Tempo.segundo !=
Parametros.Tempo.segundo))
Dif++;
if((Parametros.Passageiros != 0 ) && (Auxiliar->Passageiros !=
Parametros.Passageiros))
Dif++;
if(Dif == 0)
Total++;
Dif = 0;
Auxiliar = Auxiliar->Proxima;
}
return Total;
}
voo* ConsultarEnd(voo *Atual, voo Parametros,int Ordem){
int Dif = 0, Total = 0;
voo *Auxiliar = Atual;

16

while(Auxiliar != NULL){
if((Parametros.NumVoo != 0 ) && (Auxiliar->NumVoo !=
Parametros.NumVoo))
Dif++;
if((Parametros.Data.nulo != 1 ) && (Auxiliar->Data.dia !=
Parametros.Data.dia || Auxiliar->Data.mes != Parametros.Data.mes ||
Auxiliar->Data.ano != Parametros.Data.ano))
Dif++;
if((Parametros.Hora.nulo != 1 ) && (Auxiliar->Hora.hora !=
Parametros.Hora.hora || Auxiliar->Hora.minuto !=
Parametros.Hora.minuto || Auxiliar->Hora.segundo !=
Parametros.Hora.segundo))
Dif++;
if((Parametros.AeroportoSaida[0] != '\0' ) &&
(strcmp(Auxiliar->AeroportoSaida, Parametros.AeroportoSaida) != 0))
Dif++;
if((Parametros.AeroportoChegada[0] != '\0' ) &&
(strcmp(Auxiliar->AeroportoChegada, Parametros.AeroportoChegada) !=
0))
Dif++;
if((Parametros.Rota[0] != '\0' ) && (strcmp(Auxiliar->Rota,
Parametros.Rota) != 0))
Dif++;
if((Parametros.Tempo.nulo != 1 ) && (Auxiliar->Tempo.hora !=
Parametros.Tempo.hora || Auxiliar->Tempo.minuto !=
Parametros.Tempo.minuto || Auxiliar->Tempo.segundo !=
Parametros.Tempo.segundo))
Dif++;
if((Parametros.Passageiros != 0 ) && (Auxiliar->Passageiros !=
Parametros.Passageiros))
Dif++;
if(Dif == 0){
if(Total == Ordem)
return Auxiliar;
Total++;
}
Dif = 0;
Auxiliar = Auxiliar->Proxima;
}
}
void ExibirTodos(voo *Atual){
printf("______________________________________________________________
_________________\n");
printf("Num
|Data
|Horario |Saida
|Destino\n");
printf("______|___________|________|_____________________________|____
_________________\n");
while(Atual != NULL){
printf("%-5d |",Atual->NumVoo);
printf("%02d/%02d/%04d |",Atual->Data.dia,Atual>Data.mes,Atual->Data.ano);
printf("%02d:%02d
|", Atual->Hora.hora,Atual->Hora.minuto);

17

printf("%-29s|",Atual->AeroportoSaida);
printf("%s\n",Atual->AeroportoChegada);
printf("______|___________|________|_____________________________|____
_________________\n");
Atual = Atual->Proxima;
}
}
void ExibirDetalhes(voo *Atual, int Num){
int Teste = 0;
while (Atual != NULL && Teste == 0){
if (Atual->NumVoo == Num){
printf("
--------- Informacoes do Voo
---------\n");
printf("
________________________________________\n");
printf("
|Numero: %32d|\n",Atual>NumVoo);
printf("
|________________________________________|\n");
printf("
|Data:
%26d/%02d/%4d|\n",Atual->Data.dia,Atual->Data.mes,Atual->Data.ano);
printf("
|________________________________________|\n");
printf("
|Horario:
%25d:%02d:%02d|\n",Atual->Hora.hora,Atual->Hora.minuto,Atual>Hora.segundo);
printf("
|________________________________________|\n");
printf("
|Saida: %32s|\n",Atual>AeroportoSaida);
printf("
|________________________________________|\n");
printf("
|Chegada: %31s|\n",Atual>AeroportoChegada);
printf("
|________________________________________|\n");
printf("
|Rota: %34s|\n",Atual->Rota);
printf("
|________________________________________|\n");
printf("
|Tempo:
%27d:%02d:%02d|\n",Atual->Tempo.hora,Atual->Tempo.minuto,Atual>Tempo.segundo);
printf("
|________________________________________|\n");
printf("
|Passageiros: %27d|\n",Atual>Passageiros);
printf("
|________________________________________|\n\n");
Teste = 1;
}
Atual = Atual->Proxima;
}
if (Teste == 0){

18

printf("\n\nNao foi possivel localizar o voo com o numero:


%d",Num);
}
}
voo* Excluir(voo *Atual, voo Parametros){
int Dif = 0, Total = 0;
voo *Temp = NULL;
voo *Ant = NULL;
voo *Auxiliar = Atual;
while(Auxiliar != NULL){
if((Parametros.NumVoo != 0 ) && (Auxiliar->NumVoo !=
Parametros.NumVoo))
Dif++;
if((Parametros.Data.nulo != 1 ) && (Auxiliar->Data.dia !=
Parametros.Data.dia || Auxiliar->Data.mes != Parametros.Data.mes ||
Auxiliar->Data.ano != Parametros.Data.ano))
Dif++;
if((Parametros.Hora.nulo != 1 ) && (Auxiliar->Hora.hora !=
Parametros.Hora.hora || Auxiliar->Hora.minuto !=
Parametros.Hora.minuto || Auxiliar->Hora.segundo !=
Parametros.Hora.segundo))
Dif++;
if((Parametros.AeroportoSaida[0] != '\0' ) &&
(strcmp(Auxiliar->AeroportoSaida, Parametros.AeroportoSaida) != 0))
Dif++;
if((Parametros.AeroportoChegada[0] != '\0' ) &&
(strcmp(Auxiliar->AeroportoChegada, Parametros.AeroportoChegada) !=
0))
Dif++;
if((Parametros.Rota[0] != '\0' ) && (strcmp(Auxiliar->Rota,
Parametros.Rota) != 0))
Dif++;
if((Parametros.Tempo.nulo != 1 ) && (Auxiliar->Tempo.hora !=
Parametros.Tempo.hora || Auxiliar->Tempo.minuto !=
Parametros.Tempo.minuto || Auxiliar->Tempo.segundo !=
Parametros.Tempo.segundo))
Dif++;
if((Parametros.Passageiros != 0 ) && (Auxiliar->Passageiros !=
Parametros.Passageiros))
Dif++;
if(Dif == 0){
if (Auxiliar == Atual){
Atual = Auxiliar->Proxima;
Temp = Auxiliar->Proxima;
free(Auxiliar);
Auxiliar = Temp;
}else{
Ant->Proxima = Auxiliar->Proxima;
Temp = Auxiliar->Proxima;
free(Auxiliar);

19

Auxiliar = Temp;
}
Total++;
}else{
Ant = Auxiliar;
Auxiliar = Auxiliar->Proxima;
}
Dif = 0;
}
printf("\n\nForam Excluidos %d Registros\n\n",Total);
system("pause");
return Atual;
}
#endif // FUNCOES_H_INCLUDED

20

Arquivo - main.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct Datas DataVoo;
typedef struct Horarios HoraVoo;
typedef struct estrutura_voo voo;
struct Datas{
int dia;
int mes;
int ano;
int nulo;
};
struct Horarios{
int hora;
int minuto;
int segundo;
int nulo;
};
struct estrutura_voo{
int NumVoo;
DataVoo Data;
HoraVoo Hora;
char AeroportoSaida[30];
char AeroportoChegada [30];
char Rota [30];
HoraVoo Tempo;
int Passageiros;
struct voo *Proxima;
};
#include "funcoes.h"
int main()
{
int
voo
voo
voo

op = 0, LoopP = 0, LoopAux = 0, Resultados = 0, i = 0;


*ListaVoos = Iniciar();
*ResultadoVoo = NULL;
Auxiliar;

while(LoopP == 0){
system("cls");
printf("Menu de Opcoes:\n\n");
printf("1 - Adicionar Voo\n");
printf("2 - Consultar Voos\n");
printf("3 - Cancelar Voo\n");
printf("4 - Encerrar Aplicacao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,5);
switch (op){
case 1:
LoopAux = 1;
while (LoopAux == 1){

21

system("cls");
ZerarEstrutura(&Auxiliar);
printf("Digite o Numero deste Voo:
Auxiliar.NumVoo = CapturarI(5,0);

");

printf("\n\nInsira a data do Voo:");


printf("\nDia ");
Auxiliar.Data.dia = CapturarI(2,0);
printf(" /Mes ");
Auxiliar.Data.mes = CapturarI(2,0);
printf(" /Ano ");
Auxiliar.Data.ano = CapturarI(4,0);
Auxiliar.Data.nulo = 0;
printf("\n\nInsira o Horario do Voo:");
printf("\nHora ");
Auxiliar.Hora.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Hora.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Hora.segundo = CapturarI(2,0);
Auxiliar.Hora.nulo = 0;
printf("\n\nInforme o Aeroporto de Saida: ");
CapturarS(Auxiliar.AeroportoSaida,29);
printf("\n\nInforme o Aeroporto de Chegada: ");
CapturarS(Auxiliar.AeroportoChegada,29);
printf("\n\nInforme a Rota: ");
CapturarS(Auxiliar.Rota,29);
printf("\n\nInsira o Tempo previsto do Voo:");
printf("\nHora ");
Auxiliar.Tempo.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Tempo.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Tempo.segundo = CapturarI(2,0);
Auxiliar.Tempo.nulo = 0;
printf("\n\nInforme o numero de passageiros : ");
Auxiliar.Passageiros = CapturarI(4,0);
system("cls");
printf("
--------Informacoes do Voo ---------\n");
printf("
________________________________________\n");
printf("
|Numero:
%32d|\n",Auxiliar.NumVoo);
printf("
|________________________________________|\n");
printf("
|Data:
%26d/%02d/%4d|\n",Auxiliar.Data.dia,Auxiliar.Data.mes,Auxiliar.Data.an
o);
printf("
|________________________________________|\n");

22

printf("
|Horario:
%25d:%02d:%02d|\n",Auxiliar.Hora.hora,Auxiliar.Hora.minuto,Auxiliar.Ho
ra.segundo);
printf("
|________________________________________|\n");
printf("
|Saida:
%32s|\n",Auxiliar.AeroportoSaida);
printf("
|________________________________________|\n");
printf("
|Chegada:
%31s|\n",Auxiliar.AeroportoChegada);
printf("
|________________________________________|\n");
printf("
|Rota:
%34s|\n",Auxiliar.Rota);
printf("
|________________________________________|\n");
printf("
|Tempo:
%27d:%02d:%02d|\n",Auxiliar.Tempo.hora,Auxiliar.Tempo.minuto,Auxiliar.
Tempo.segundo);
printf("
|________________________________________|\n");
printf("
|Passageiros:
%27d|\n",Auxiliar.Passageiros);
printf("
|________________________________________|\n\n");
if (Validar(ListaVoos,Auxiliar) > 0){
printf("\n\nVoce precisa arrumar os problemas
informados...\n\n");
system("pause");
}else{
printf("\n\nConfirmar 1-Nao/2-Sim ? ");
printf("\nDigite sua escolha: ");
LoopAux = CapturarI(1,7);
if(LoopAux == 0)
LoopAux = 1;
}
}
ListaVoos = AdicinoarVoo(ListaVoos,Auxiliar);
break;
case 2:
printf("\n\n1-Exibir todos / 2-Exibir com base em
parametros de busca\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
switch(op){
case 1:
system("cls");
ExibirTodos(ListaVoos);
break;
case 2:
ZerarEstrutura(&Auxiliar);
system("cls");

23

printf("Usar Numero do Voo como Filtro? 1-Sim


/ 2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nDigite o Numero do Voo: ");


Auxiliar.NumVoo = CapturarI(5,0);
}
system("cls");
printf("Usar Data do Voo como Filtro? 1-Sim /
2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInsira a data do Voo:");


printf("\nDia ");
Auxiliar.Data.dia = CapturarI(2,0);
printf(" /Mes ");
Auxiliar.Data.mes = CapturarI(2,0);
printf(" /Ano ");
Auxiliar.Data.ano = CapturarI(4,0);
Auxiliar.Data.nulo = 0;
}
system("cls");
printf("Usar Horario do Voo como Filtro? 1-Sim
/ 2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInsira o Horario do Voo:");


printf("\nHora ");
Auxiliar.Hora.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Hora.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Hora.segundo = CapturarI(2,0);
Auxiliar.Hora.nulo = 0;
}
system("cls");
printf("Usar Aeroporto de Saida do Voo como
Filtro? 1-Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
printf("\n\nInforme o Aeroporto de Saida:
");
CapturarS(Auxiliar.AeroportoSaida,29);
}
system("cls");
printf("Usar Aeroporto de Chegada do Voo como
Filtro? 1-Sim / 2-Nao\n");

24

printf("\nDigite sua escolha:


op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInforme o Aeroporto de
Chegada: ");
CapturarS(Auxiliar.AeroportoChegada,29);
}
system("cls");
printf("Usar Rota do Voo como Filtro? 1-Sim /
2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInforme a Rota: ");


CapturarS(Auxiliar.Rota,29);
}
system("cls");
printf("Usar Tempo Previsto do Voo como
Filtro? 1-Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
printf("\n\nInsira o Tempo previsto do
Voo:");
printf("\nHora ");
Auxiliar.Tempo.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Tempo.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Tempo.segundo = CapturarI(2,0);
Auxiliar.Tempo.nulo = 0;
}
system("cls");
printf("Usar Numero de Passageiros do Voo como
Filtro? 1-Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
printf("\n\nInforme o numero de
passageiros : ");
Auxiliar.Passageiros = CapturarI(4,0);
}
system("cls");
Resultados = ConsultaQTD(ListaVoos,Auxiliar);
system("cls");
printf("Resultados encontrados:
%d\n\n",Resultados);
printf("______________________________________________________________
_________________\n");
printf("Num
|Data
|Horario |Saida
|Destino\n");

25

printf("______|___________|________|_____________________________|____
_________________\n");
for(i=0;i<Resultados;i++){
ResultadoVoo =
ConsultarEnd(ListaVoos,Auxiliar,i);
printf("%-5d |",ResultadoVoo->NumVoo);
printf("%02d/%02d/%4d |",ResultadoVoo>Data.dia,ResultadoVoo->Data.mes,ResultadoVoo->Data.ano);
printf("%02d:%02d
|", ResultadoVoo>Hora.hora,ResultadoVoo->Hora.minuto);
printf("%-29s|",ResultadoVoo>AeroportoSaida);
printf("%s\n",ResultadoVoo>AeroportoChegada);
printf("______|___________|________|_____________________________|____
_________________\n");
}

break;
}
printf("\n\nPara Detalhes do Voo digite seu numero, ou
tecle 'esc' para encerrar a consulta.\n");
printf("\nDigite sua escolha: ");
op = CapturarI(5,0);
if ( op != 0 ){
system("cls");
ExibirDetalhes(ListaVoos,op);
printf("\n\n");
system("pause");
}
break;
case 3:
LoopP = 1;
while(LoopP == 1){
system("cls");
printf("Sera necessario informar os parametros
para a exclusao do voo...\n\n");
system("pause");
ZerarEstrutura(&Auxiliar);
system("cls");
printf("Usar Numero do Voo como Filtro? 1-Sim / 2Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nDigite o Numero do Voo: ");

26

Auxiliar.NumVoo = CapturarI(5,0);
}
system("cls");
printf("Usar Data do Voo como Filtro? 1-Sim / 2Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInsira a data do Voo:");
printf("\nDia ");
Auxiliar.Data.dia = CapturarI(2,0);
printf(" /Mes ");
Auxiliar.Data.mes = CapturarI(2,0);
printf(" /Ano ");
Auxiliar.Data.ano = CapturarI(4,0);
Auxiliar.Data.nulo = 0;
}
system("cls");
printf("Usar Horario do Voo como Filtro? 1-Sim /
2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInsira o Horario do Voo:");
printf("\nHora ");
Auxiliar.Hora.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Hora.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Hora.segundo = CapturarI(2,0);
Auxiliar.Hora.nulo = 0;
}
system("cls");
printf("Usar Aeroporto de Saida do Voo como
Filtro? 1-Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInforme o Aeroporto de Saida: ");
CapturarS(Auxiliar.AeroportoSaida,29);
}
system("cls");
printf("Usar Aeroporto de Chegada do Voo como
Filtro? 1-Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInforme o Aeroporto de Chegada:
");
CapturarS(Auxiliar.AeroportoChegada,29);
}

27

system("cls");
printf("Usar Rota do Voo como Filtro? 1-Sim / 2Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInforme a Rota: ");
CapturarS(Auxiliar.Rota,29);
}
system("cls");
printf("Usar Tempo Previsto do Voo como Filtro? 1Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInsira o Tempo previsto do Voo:");
printf("\nHora ");
Auxiliar.Tempo.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Tempo.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Tempo.segundo = CapturarI(2,0);
Auxiliar.Tempo.nulo = 0;
}
system("cls");
printf("Usar Numero de Passageiros do Voo como
Filtro? 1-Sim / 2-Nao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 1){
LoopP++;
printf("\n\nInforme o numero de passageiros :
");
Auxiliar.Passageiros = CapturarI(4,0);
}
if(LoopP == 1){
system("cls");
printf("Voce nao inseriu nenhum parametro para
a exclusao!\n\n");
system("pause");
}
}
LoopP = 0;
Resultados = ConsultaQTD(ListaVoos,Auxiliar);
system("cls");
if (Resultados > 0){
printf("______________________________________________________________
_________________\n");
printf("Num
|Data
|Horario |Saida
|Destino\n");

28

printf("______|___________|________|_____________________________|____
_________________\n");
for(i=0;i<Resultados;i++){
ResultadoVoo =
ConsultarEnd(ListaVoos,Auxiliar,i);
printf("%-5d |",ResultadoVoo->NumVoo);
printf("%02d/%02d/%4d |",ResultadoVoo>Data.dia,ResultadoVoo->Data.mes,ResultadoVoo->Data.ano);
printf("%02d:%02d
|", ResultadoVoo>Hora.hora,ResultadoVoo->Hora.minuto);
printf("%-29s|",ResultadoVoo->AeroportoSaida);
printf("%s\n",ResultadoVoo->AeroportoChegada);
printf("______|___________|________|_____________________________|____
_________________\n");
}
printf("\n\nResultados encontrados:
%d\n\n",Resultados);
printf("Deseja Realmente Excluir o(s) %d Voo(s)?
1-Nao / 2-Sim\n",Resultados);
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
if(op == 2)
ListaVoos = Excluir(ListaVoos,Auxiliar);
}else{
printf("Nao foram encontrados resultados para os
parametros informados...\n\n");
system("pause");
}
break;
case 4:
LoopP = 1;
break;
}
}
return 0;
}

29

Programa 3.0

Descrio do Programa
Foi proposto no passo 3 da 2 Etapa, que fosse desenvolvido um programa em
linguagem C que trabalha-se com uma estrutura de dados denominada Passagem. Esta
estrutura, assim como a do programa anterior deveria ser implementada de forma
dinmica, e utilizaramos as funes cadastrarPassagem, e consultarPassagem, para
trabalhar com a estrutura.
Basicamente, o que foi feito foi adaptar as funes e a estrutura do programa 2.0 para
este novo programa, ento, basicamente as funes continuam as mesmas.

Telas do Programa

30

Arquivo - funcoes.h
#ifndef FUNCOES_H_INCLUDED
#define FUNCOES_H_INCLUDED
//Cabealho Funes
void CapturarS(char *Variavel[],int Tamanho); // Capturar String
int CapturarI(int Tamanho, int Digitos); // Capturar Inteiro
float CapturarF(int Tamanho); // Capturar Float
void ZerarEstrutura(Passagem *Estrutura);// Deixar Estrutura Zerada
Passagem* Iniciar(void); // Inicia a Lista Encadeada
int vazio(Passagem *Atual); // Funo para Retornar se Lista Esta
vazia
int Validar(Passagem *Atual,Passagem Parametros); // Validar
informacoes
Passagem* Adicinoar(Passagem *Atual, Passagem Auxiliar); // Adiciona
novo item a lista
int ConsultaQTD(Passagem *Atual, Passagem Parametros); // Retorna
numero de registros encontrados com base nos parametros
Passagem* ConsultarEnd(Passagem *Atual, Passagem Parametros,int
Ordem); // Retorna Endereo de item da lista, com base em parametros
void ExibirTodos(Passagem *Atual); // Exibe todos os itens da lista

//Funes
void CapturarS(char *Variavel[],int Tamanho){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
Tempo[i] = Teste;
}
if( i < -1){
i = -1;
printf(" ");
}
}

31

Tempo[Final] = 0;
strcpy(Variavel,Tempo);
}
int CapturarI(int Tamanho,int Digitos){
int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
if(Digitos > 9)
Digitos = 0;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();
if(Teste == 27)
return 0;
if(Teste == 13 || Teste == 8){
if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
if(Teste > 47 && Teste < (58 - Digitos)){
Tempo[i] = Teste;
}else{
printf("%c",8);
printf(" ");
printf("%c",8);
i--;
}
}
if( i < -1){
i = -1;
printf(" ");
}
}
Tempo[Final] = 0;
return atoi(Tempo);
}

float CapturarF(int Tamanho){


int i;
char Teste;
char Tempo[Tamanho + 1];
int Final;
Final = Tamanho;
for(i=0;i<Tamanho;i++){
fflush(stdin);
Teste = getche();

32

if(Teste == 13 || Teste == 8){


if (Teste == 13){
Final = i;
i = Tamanho;
}else{
Tempo[i] = Teste;
printf(" ");
printf("%c",Teste);
i = i - 2 ;
}
}else{
if((Teste > 47 && Teste < 58) || (Teste == 46 || Teste ==
44)){
if(Teste == 44){
Teste = 46;
}
Tempo[i] = Teste;
}else{
printf("%c",8);
printf(" ");
printf("%c",8);
i--;
}
}
if( i < -1){
i = -1;
printf(" ");
}
}
Tempo[Final] = 0;
return atof(Tempo);
}
void ZerarEstrutura(Passagem *Estrutura){
Estrutura->NumPass = 0;
Estrutura->NumVoo = 0;
Estrutura->Data.dia = 0;
Estrutura->Data.mes = 0;
Estrutura->Data.ano = 0;
Estrutura->Data.nulo = 1;
Estrutura->Horario.hora = 0;
Estrutura->Horario.minuto = 0;
Estrutura->Horario.segundo = 0;
Estrutura->Horario.nulo = 1;
Estrutura->Portao[0] = '\0';
}
Passagem* Iniciar(void){
return NULL;
}
int vazio(Passagem *Atual){
if (Atual == NULL)
return 1;

33

else
return 0;
}
int Validar(Passagem *Atual,Passagem Parametros){
int Erros = 0;
time_t Tempo;
int Teste;
Passagem Auxiliar;
ZerarEstrutura(&Auxiliar);
Auxiliar.NumPass = 1;
Auxiliar.NumPass = Parametros.NumPass;
if(ConsultaQTD(Atual,Auxiliar) > 0){
printf("\nJa existe uma Passagem com o numero informado:
%d\n",Parametros.NumPass);
Erros++;
}
Tempo = time(NULL);
Teste = (Tempo/31556952)+1970;
if((Parametros.Data.ano < Teste) || (Parametros.Data.mes < 1 ||
Parametros.Data.mes > 12) || (Parametros.Data.dia < 1 ||
Parametros.Data.dia > 31)){
printf("\nA data informada nao e valida:
%02d/%02d/%04d\n",Parametros.Data.dia,Parametros.Data.mes,Parametros.D
ata.ano);
Erros++;
}else if ((Parametros.Data.mes == 4 || Parametros.Data.mes == 6 ||
Parametros.Data.mes == 9 || Parametros.Data.mes == 11) &&
(Parametros.Data.dia > 30)){
printf("\nA data informada nao e valida:
%02d/%02d/%04d\n",Parametros.Data.dia,Parametros.Data.mes,Parametros.D
ata.ano);
Erros++;
}else if(Parametros.Data.mes == 2 && Parametros.Data.dia > 29){
printf("\nA data informada nao e valida:
%02d/%02d/%04d\n",Parametros.Data.dia,Parametros.Data.mes,Parametros.D
ata.ano);
Erros++;
}
if (Parametros.Horario.hora > 23){
printf("\nA hora informada nao e valida:
%02d:%02d:%02d\n",Parametros.Horario.hora,Parametros.Horario.minuto,Pa
rametros.Horario.segundo);
Erros++;
}else if(Parametros.Horario.minuto > 59){
printf("\nA hora informada nao e valida:
%02d:%02d:%02d\n",Parametros.Horario.hora,Parametros.Horario.minuto,Pa
rametros.Horario.segundo);
Erros++;
}else if (Parametros.Horario.segundo > 59){
printf("\nA hora informada nao e valida:
%02d:%02d:%02d\n",Parametros.Horario.hora,Parametros.Horario.minuto,Pa
rametros.Horario.segundo);
Erros++;

34

return Erros;
}
Passagem* Adicinoar(Passagem *Atual, Passagem Auxiliar){
Passagem *novo = (Passagem*) malloc(sizeof(Passagem));
novo->NumPass = Auxiliar.NumPass;
novo->NumVoo = Auxiliar.NumVoo;
novo->Data.dia = Auxiliar.Data.dia;
novo->Data.mes = Auxiliar.Data.mes;
novo->Data.ano = Auxiliar.Data.ano;
novo->Data.nulo = Auxiliar.Data.nulo;
novo->Horario.hora = Auxiliar.Horario.hora;
novo->Horario.minuto = Auxiliar.Horario.minuto;
novo->Horario.segundo = Auxiliar.Horario.segundo;
novo->Horario.nulo = Auxiliar.Horario.nulo;
strcpy(novo->Portao,Auxiliar.Portao);
novo->Proxima = Atual;
return novo;
}
int ConsultaQTD(Passagem *Atual, Passagem Parametros){
int Dif = 0, Total = 0;
Passagem *Auxiliar = Atual;
while(Auxiliar != NULL){
if((Parametros.NumPass != 0 ) && (Auxiliar->NumPass !=
Parametros.NumPass))
Dif++;
if((Parametros.NumVoo != 0 ) && (Auxiliar->NumVoo !=
Parametros.NumVoo))
Dif++;
if((Parametros.Data.nulo != 1 ) && (Auxiliar->Data.dia !=
Parametros.Data.dia || Auxiliar->Data.mes != Parametros.Data.mes ||
Auxiliar->Data.ano != Parametros.Data.ano))
Dif++;
if((Parametros.Horario.nulo != 1 ) && (Auxiliar->Horario.hora
!= Parametros.Horario.hora || Auxiliar->Horario.minuto !=
Parametros.Horario.minuto || Auxiliar->Horario.segundo !=
Parametros.Horario.segundo))
Dif++;
if((Parametros.Portao[0] != '\0' ) && (strcmp(Auxiliar>Portao, Parametros.Portao) != 0))
Dif++;
if(Dif == 0)
Total++;
Dif = 0;
Auxiliar = Auxiliar->Proxima;
}

35

return Total;
}
Passagem* ConsultarEnd(Passagem *Atual, Passagem Parametros,int
Ordem){
int Dif = 0, Total = 0;
Passagem *Auxiliar = Atual;
while(Auxiliar != NULL){
if((Parametros.NumPass != 0 ) && (Auxiliar->NumPass !=
Parametros.NumPass))
Dif++;
if((Parametros.NumVoo != 0 ) && (Auxiliar->NumVoo !=
Parametros.NumVoo))
Dif++;
if((Parametros.Data.nulo != 1 ) && (Auxiliar->Data.dia !=
Parametros.Data.dia || Auxiliar->Data.mes != Parametros.Data.mes ||
Auxiliar->Data.ano != Parametros.Data.ano))
Dif++;
if((Parametros.Horario.nulo != 1 ) && (Auxiliar->Horario.hora
!= Parametros.Horario.hora || Auxiliar->Horario.minuto !=
Parametros.Horario.minuto || Auxiliar->Horario.segundo !=
Parametros.Horario.segundo))
Dif++;
if((Parametros.Portao[0] != '\0' ) && (strcmp(Auxiliar>Portao, Parametros.Portao) != 0))
Dif++;
if(Dif == 0){
if(Total == Ordem)
return Auxiliar;
Total++;
}
Dif = 0;
Auxiliar = Auxiliar->Proxima;
}
}
void ExibirTodos(Passagem *Atual){
printf("_____________________________________________\n");
printf("Num
|Voo
|Data
|Horario |Portao
|\n");
printf("______|______|___________|________|__________|\n");
while(Atual != NULL){
printf("%-5d |",Atual->NumPass);
printf("%-5d |",Atual->NumVoo);
printf("%02d/%02d/%04d |",Atual->Data.dia,Atual>Data.mes,Atual->Data.ano);
printf("%02d:%02d
|", Atual->Horario.hora,Atual>Horario.minuto);
printf("%-10s|\n",Atual->Portao);
printf("______|______|___________|________|__________|\n");
Atual = Atual->Proxima;
}
}
#endif // FUNCOES_H_INCLUDED

36

Arquivo - main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct Datas DataPassagem;
typedef struct Horarios HoraPassagem;
typedef struct passagem Passagem;
struct Datas{
int dia;
int mes;
int ano;
int nulo;
};
struct Horarios{
int hora;
int minuto;
int segundo;
int nulo;
};
struct passagem{
int NumPass;
int NumVoo;
DataPassagem Data;
HoraPassagem Horario;
char Portao [11];
struct passagem *Proxima;
};
#include "funcoes.h"
int main()
{
int op =
Passagem
Passagem
Passagem

0, LoopP = 0, LoopAux = 0, Resultados = 0, i = 0;


*ListaPassagem = Iniciar();
*ResultadoPass = NULL;
Auxiliar;

while(LoopP == 0){
system("cls");
printf("Menu de Opcoes:\n\n");
printf("1 - Adicionar Passagem\n");
printf("2 - Consultar Passagem\n");
printf("3 - Encerrar Aplicacao\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,6);
switch (op){
case 1:
LoopAux = 1;
while (LoopAux == 1){
system("cls");
ZerarEstrutura(&Auxiliar);
printf("Digite o Numero desta Passagem:
Auxiliar.NumPass = CapturarI(5,0);

");

37

printf("\n\nDigite o Numero do Voo:


Auxiliar.NumVoo = CapturarI(5,0);

");

printf("\n\nInsira a data de Embarque:");


printf("\nDia ");
Auxiliar.Data.dia = CapturarI(2,0);
printf(" /Mes ");
Auxiliar.Data.mes = CapturarI(2,0);
printf(" /Ano ");
Auxiliar.Data.ano = CapturarI(4,0);
Auxiliar.Data.nulo = 0;
printf("\n\nInsira o Horario de Embarque:");
printf("\nHora ");
Auxiliar.Horario.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Horario.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Horario.segundo = CapturarI(2,0);
Auxiliar.Horario.nulo = 0;
printf("\n\nInforme o Portao de Saida: ");
CapturarS(Auxiliar.Portao,10);
system("cls");
printf("
------- Informacoes
da Passagem -------\n");
printf("
________________________________________\n");
printf("
|Numero:
%32d|\n",Auxiliar.NumPass);
printf("
|________________________________________|\n");
printf("
|N. Voo:
%32d|\n",Auxiliar.NumVoo);
printf("
|________________________________________|\n");
printf("
|Data:
%26d/%02d/%4d|\n",Auxiliar.Data.dia,Auxiliar.Data.mes,Auxiliar.Data.an
o);
printf("
|________________________________________|\n");
printf("
|Horario:
%25d:%02d:%02d|\n",Auxiliar.Horario.hora,Auxiliar.Horario.minuto,Auxil
iar.Horario.segundo);
printf("
|________________________________________|\n");
printf("
|Portao:
%31s|\n",Auxiliar.Portao);
printf("
|________________________________________|\n\n");
if (Validar(ListaPassagem,Auxiliar) > 0){
printf("\n\nVoce precisa arrumar os problemas
informados...\n\n");
system("pause");
}else{

38

printf("\n\nConfirmar 1-Nao/2-Sim ? ");


printf("\nDigite sua escolha: ");
LoopAux = CapturarI(1,7);
if(LoopAux == 0)
LoopAux = 1;
}
}
ListaPassagem = Adicinoar(ListaPassagem,Auxiliar);
break;
case 2:
printf("\n\n1-Exibir todos / 2-Exibir com base em
parametros de busca\n");
printf("\nDigite sua escolha: ");
op = CapturarI(1,7);
switch(op){
case 1:
system("cls");
ExibirTodos(ListaPassagem);
break;
case 2:
ZerarEstrutura(&Auxiliar);
system("cls");
printf("Usar Numero da Passagem como Filtro?
1-Sim / 2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nDigite o Numero da Passagem:


");
Auxiliar.NumPass = CapturarI(5,0);
}
system("cls");
printf("Usar Numero do Voo como Filtro? 1-Sim
/ 2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nDigite o Numero do Voo: ");


Auxiliar.NumVoo = CapturarI(5,0);
}
system("cls");
printf("Usar Data como Filtro? 1-Sim / 2Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInsira a data:");
printf("\nDia ");
Auxiliar.Data.dia = CapturarI(2,0);
printf(" /Mes ");

39

Auxiliar.Data.mes = CapturarI(2,0);
printf(" /Ano ");
Auxiliar.Data.ano = CapturarI(4,0);
Auxiliar.Data.nulo = 0;
}
system("cls");
printf("Usar Horario como Filtro? 1-Sim / 2Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInsira o Horario:");
printf("\nHora ");
Auxiliar.Horario.hora = CapturarI(2,0);
printf(" :Minuto ");
Auxiliar.Horario.minuto = CapturarI(2,0);
printf(" :Segundo ");
Auxiliar.Horario.segundo = CapturarI(2,0);
Auxiliar.Horario.nulo = 0;
}
system("cls");
printf("Usar Portao de Embarque como Filtro?
1-Sim / 2-Nao\n");
printf("\nDigite sua escolha:
op = CapturarI(1,7);
if(op == 1){

");

printf("\n\nInforme o Portao: ");


CapturarS(Auxiliar.Portao,10);
}

system("cls");
Resultados =
ConsultaQTD(ListaPassagem,Auxiliar);
system("cls");
printf("Resultados encontrados:
%d\n\n",Resultados);
printf("_____________________________________________\n");
printf("Num
|Voo
|Data
|Horario
|Portao
|\n");
printf("______|______|___________|________|__________|\n");
for(i=0;i<Resultados;i++){
ResultadoPass =
ConsultarEnd(ListaPassagem,Auxiliar,i);
printf("%-5d |",ResultadoPass->NumPass);
printf("%-5d |",ResultadoPass->NumVoo);
printf("%02d/%02d/%04d |",ResultadoPass>Data.dia,ResultadoPass->Data.mes,ResultadoPass->Data.ano);

40

printf("%02d:%02d
|", ResultadoPass>Horario.hora,ResultadoPass->Horario.minuto);
printf("%-10s|\n",ResultadoPass->Portao);
printf("______|______|___________|________|__________|\n");
}

break;
}
printf("\n\n");
system("pause");
break;
case 3:
LoopP = 1;
break;
}
}
return 0;
}

41