Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

igorsk89

Cadastro de vôos - Empresa Aérea

Recommended Posts

O objetivo de tudo é desenvolver um sistema que mantém uma gestão de bilhetes aéreos e das informações contidas no sistema.
E o mesmo está representado por um menu.

 

Imagem do menu:

 

751455565d.png

 

Até então, OK!
A opção 1 foi feita sem problemas, a opção 2 também.

Imagem da opção 2 rodando.

obs: (eu,como usuário, que cadastrei essas informações).

 

b57e7aabbd.png

 

 

Voltei para o Menu Principal, e agora entrei na opção 3, que é efetuar uma venda de bilhete.

 

973b77ed40.png

 

Após comprar o bilhete, voltamos para o Menu principal.. e aí, vou visualizar se diminuiu as poltronas do voo que acabei de vender.

 

c407b39afa.png

 

Até aqui ok (aparentemente).. Foi vendido um bilhete e subtraiu 1 nas poltronas livres do voo 1..

Porém, quando tento comprar para o vôo 2, ele subtrai as poltronas do voo 1 ao invés de subtrair as poltronas do voo 2.

 

41501f3e8e.png

 

 

Volto p/ o menu e vou na opção 2 e vejo que nao comprei ticket para o voo 2, e sim subtraiu no voo 1.

O que fazer ?? já revisei todo o código e não encontro o erro.

 

 

cb3e759378.png

 

 

 

Outro erro é na opção 4, quando tento consultar os bilhetes vendidos, insiro um CPF existente e fala

que não foi localizado.

 

 

 

74955c4038.png

 

 

 

E quando aparece.. Aparece assim.. Bugado! :pinch: :upset:

E ainda começa do ticket nº 10, devia começar de 1.

 

 

d6650aa210.png

 

 

CÓDIGO ABAIXO:

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
int cont,y,z,i,f; // variáveis globais de controle (contador para cadastro de vôos e etc).
typedef struct CadastroNovoVoo{            //estrutura (struct) para armazenar variáveis.
	char origem_voo[50];
	char destino_voo[50];
	int capacidade_maxima;
} NovoVoo;

typedef struct Comprartickets{ 
	char nome[60];
	char cpf[16];
	int numvoo;
	int numticket;
} Comprar_tickets;

NovoVoo nv[5];          //assinando a struct.
Comprar_tickets ct[10];   // assinando a struct.

void Cadastrovoo(){                 // função para cadastro de vôos.
		system("cls");
		fflush(stdin);
		printf("Digite a origem do voo %d: ",cont+1);
		gets(nv[cont].origem_voo);
		fflush(stdin);
		printf("\n");
		printf("Digite o destino do voo %d: ",cont+1);
		gets(nv[cont].destino_voo);
		fflush(stdin);
		printf("\n");
		printf("Digite a capacidade maxima de passageiros: ");
		scanf("%d",&nv[cont].capacidade_maxima);
		printf("\n\n\t\t\t >>> Vôo [%d] cadastrado com sucesso !! <<< \n\n",cont+1);
		cont++;
}

void Info_voos(){                        //função para informar os vôos cadastrados.
		for(y=0;y < cont;y++){	
		printf("Voo %d:\n",y+1);
		printf("Origem: %s -> Destino: %s\n",nv[y].origem_voo,nv[y].destino_voo);
		printf("Poltronas livres: %d\n",nv[y].capacidade_maxima);
		printf("**************\n\n");
}
}

void ComprarBilhetes(){          // função para a compra de bilhetes.
	    printf("Digite seu nome: ");
		scanf("%s",&ct[z].nome);
		fflush(stdin);
		printf("\n");
		printf("Digite seu CPF: ");
		gets(ct[z].cpf);
		printf("\n");
		printf("Digite o numero do voo: ");
		scanf("%d",&ct[z].numvoo);
		printf("\n");
		ct[z].numvoo += -1;
		if (nv[ct[z].numticket].capacidade_maxima >= 1) {
		printf("\n\t\t\tParabéns!! Bilhete comprado com sucesso.");
		nv[ct[z].numticket].capacidade_maxima --;
		ct[z].numticket =  z*z+10;	
		z++;
	}else{
		printf("\nDesculpe, não há poltronas livres :( .");
	}
}

void BilhetesVendidos(){
    char verificar_cpf[16];
	fflush(stdin);
	printf("Digite seu CPF: ");
	gets(verificar_cpf);
	for(i=0;i < z;i++){
		if(strcmp(ct[i].cpf,verificar_cpf)==0){              //comparando cpf com o comando "strcmp" da bibliote string.h        
			printf("\nTicket nº: %d", ct[i].numticket);
			printf("\nNome: %s", ct[i].nome);
			printf("\nCPF: %s", ct[i].cpf);
			printf("\nNúmero do Vôo: %d", ct[i].numvoo+1);
		}else{
			printf("\nInfelizmente, o CPF não foi localizado.");
			break;
		}
	}
}

main(){
setlocale(LC_ALL,"Portuguese");       // Definição para uso de configurações em português.
int opcao;


do{
system("cls");
printf("\t\t\t**** COMPANHIA AEREA I.G.M. **** \n\n");    
printf("\t\t\t#### SEJA BEM VINDO(A) #### \n");     
printf(":: Menu de Opções ::\n\n");
printf("1 - Cadastrar um novo vôo\n");
printf("2 - Visualizar informações de vôos\n");
printf("3 - Realizar vendas de bilhetes\n");
printf("4 - Consultar bilhetes vendidos\n");
printf("5 - Cancelar Bilhetes\n");
printf("6 - Relatório de passageiros por vôo\n");
printf("7 - Encerrar o sistema\n\n");
printf("Escolha uma opção:  ");
scanf("%d",&opcao);
//printf("\a");   // beepzinho.
system("cls");
switch(opcao){
	case 1:                                    //cadastrar um novo voo
	Cadastrovoo(); 
	printf("\n\n");
	system("pause");
	break;
	case 2:                                   //Visualizar informações de vôos
	Info_voos();
	printf("\n\n");
	system("pause");
	break;
	case 3:                               //Realizar vendas de bilhetes
	    ComprarBilhetes();              
	    printf("\n\n");
		system("pause");
		break;
    case 4:
    	BilhetesVendidos();
    	printf("\n\n");
    	system("pause");
    	break;
	/*case 5:
		cancelartickets();
		printf("\n\n");
		system("pause");
		break;
		*/
}

}while(opcao != 7);


system("pause");
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Arranque fora esse fflush na entrada padrão (comportamento indefinido) e esse gets (risco de buffer overflow).
Repare que a struct voo nem tem número do voo...

 

Sugiro que ao invés de decrementar a capacidade máxima (porque essa é uma informação da aeronave e é fixa), você crie uma função que conte quantos assentos estão livres ou uma variável complementar (poltronas_livres) dentro da struct voo.
Se você ainda não chegou na parte de alocação dinâmica, deixe a variável reserva (a lista de passagens vendidas) como um array simples mesmo, mas terá que complementar as comparações de capacidade máxima, já que a soma da capacidade dos voos pode ser maior que o tamanho máximo declarado da lista de reservas.

 

Veja se a lógica abaixo te ajudar a identificar o problema, já que teu código não compila no Linux.

#if defined (__linux__)
#define CLRSCR system("clear")
#elif defined (__WIN32)
#define CLRSCR system("cls")
#else
#error "Sistema não suportado."
#endif

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

/*  DADOS DE VOOS   */
#define MAX_DESCRICAO 50
#define MAX_VOOS 5

struct voo {
	char origem_voo[MAX_DESCRICAO];
	char destino_voo[MAX_DESCRICAO];
	int capacidade_maxima;
	int poltronas_ocupadas;
	int numvoo;
};

struct voo voos_disponiveis[MAX_VOOS];

void init_voos();
int existe_voo_nao_cadastrado();
void cadastrar_voos();
void pesquisar_voo();
int existe_voo_com_numero(int pos_max, int numvoo);



/*  DADOS DE PASSAGENS  */

#define MAX_NOME 60
#define MAX_CPF 12

struct passagem { 
	char nome[MAX_NOME];
	char cpf[MAX_CPF];
	int numvoo;
	int numticket;
};

int MAXIMO_PASSAGENS;
struct passagem * reservas = NULL;

void cadastrar_passagem();
void init_passagens();
void cancelar_passagem();
int pesquisar_passageiro(char cpf[MAX_CPF], int numvoo);

/*  FIM  */



enum _op{CADASTRO_VOO, CADASTRO_PASSAGEM, PESQUISAR_VOO, CANCELAR_PASSAGEM, SAIR};
void menu_principal();
 
int main(void){
	int opcao = -1;
 	init_voos();

 	while (opcao != SAIR) {
 		CLRSCR;
 		menu_principal();
		scanf("%d%*c",&opcao);
		if (opcao < CADASTRO_VOO || opcao > SAIR) {
			puts("Opção inválida. Tente novamente. (Pressione uma tecla p/ continuar)");
		} else if (opcao == CADASTRO_VOO) {
			cadastrar_voos();
		} else if (opcao == PESQUISAR_VOO) {
			pesquisar_voo();
		} else if (opcao == CADASTRO_PASSAGEM) {
			cadastrar_passagem();
		} else if (opcao == CANCELAR_PASSAGEM) {
			cancelar_passagem();
		}
		getchar();
	}

	free(reservas);
	return 0;
}


/*  IMPLEMENTACAO FUNCOES VOO  */
int existe_voo_com_numero(int pos_max, int numvoo) {
	if(!pos_max) return 0; // Primeiro voo cadastrado.

	int i;
	for(i=0; i<pos_max && voos_disponiveis[i].numvoo != numvoo; i++);
	return (i < pos_max);
}

void init_voos() {
	for(int i=0; i<MAX_VOOS; i++)
		voos_disponiveis[i].numvoo = -1; // Indicador de voo não cadastrado.
}

int existe_voo_nao_cadastrado() {
	int i;
	for(i=0; i<MAX_VOOS && voos_disponiveis[i].numvoo != -1; i++);
	return i;
}

void cadastrar_voos() {
	int numvoo;
	int pos_voo_vazio = existe_voo_nao_cadastrado();

	puts("*** @VOO\\Cadastro ***");

	if (pos_voo_vazio < MAX_VOOS) {
		printf("Informe o número do voo: ");
		scanf("%d%*c", &numvoo);

		if (existe_voo_com_numero(pos_voo_vazio, numvoo)) {
			puts("Número de voo já cadastrado.");
		} else {
			printf("Informe a origem do voo: ");
			fgets(voos_disponiveis[pos_voo_vazio].origem_voo, MAX_DESCRICAO, stdin);
			printf("Informar o destino do voo: ");
			fgets(voos_disponiveis[pos_voo_vazio].destino_voo, MAX_DESCRICAO, stdin);
			printf("Informe a capacidade máxima: ");
			scanf("%d%*c", &voos_disponiveis[pos_voo_vazio].capacidade_maxima);
			voos_disponiveis[pos_voo_vazio].numvoo = numvoo;
			voos_disponiveis[pos_voo_vazio].poltronas_ocupadas = 0;
		}
		MAXIMO_PASSAGENS += voos_disponiveis[pos_voo_vazio].capacidade_maxima;
		init_passagens();

	} else {
		puts("Não há espaço para mais voos.");
	}
}

void pesquisar_voo() {
	int numvoo;
	int i;

	puts("*** @VOOS\\Pesquisa ***");
	printf("Informe o número do voo: ");
	scanf("%d%*c", &numvoo);

	for(i=0; i<MAX_VOOS && voos_disponiveis[i].numvoo != numvoo; i++);
	if (i >= MAX_VOOS) {
		puts("Voo não encontrado.");
	} else {
		puts("-----------------------------");
		printf("Número do voo: %d\n", numvoo);
		printf("Capacidade: %d\n", voos_disponiveis[i].capacidade_maxima);
	}
}



/*   IMPLEMENTACAO FUNCOES PASSAGEM  */
void cadastrar_passagem() {
	char _tmp_cpf[MAX_CPF];
	char _tmp_nome[MAX_NOME];
	int numvoo;

	puts("*** @PASSAGENS\\Cadastro ***");

	printf("Informe o número do voo: ");
	scanf("%d%*c", &numvoo);

	// Verifique se o voo está cheio antes de prosseguir.


	printf("Digite seu CPF: ");
	fgets(_tmp_cpf, MAX_CPF, stdin);
	_tmp_cpf[strlen(_tmp_cpf)-1] = '\0';

	//Verifique se o cpf já possui passagem para o voo informado (ou para qualquer outro voo) antes de prosseguir.

	printf("Informe o nome: ");
	fgets(_tmp_nome, MAX_NOME, stdin);
	_tmp_nome[strlen(_tmp_nome)-1] = '\0';

	strncpy(reservas[poltronas_ocupadas].cpf, _tmp_cpf, MAX_CPF);
	strncpy(reservas[poltronas_ocupadas].nome, _tmp_nome, MAX_NOME);
	reservas[poltronas_ocupadas].numvoo = numvoo;

	// Gerando numero do bilhete aleatoriamente.
	// Se quiser, use um contador.
	srand(time(NULL));
	reservas[poltronas_ocupadas].numticket = abs(rand());

	reservas[poltronas_ocupadas].poltronas_ocupadas++; // Incremento da variável específica do voo.
	poltronas_ocupadas++; // Incremento da variavel global p/ evitar percorrer a lista de voos.
}


void init_passagens() {
	struct passagem * _tmp = realloc(reservas, sizeof(struct passagem) * (MAXIMO_PASSAGENS));
	if (!_tmp) {
		puts("Erro na alocação de memória.");
	} else {
		reservas = _tmp;
	}
}


void pesquisar_passageiro(char cpf[MAX_CPF], int numvoo) {
	int = 0;
	for(i=0; i<MAXIMO_PASSAGENS; i++) {
		if (reservas[i].numvoo != -1 && reservas[i].numvoo == numvoo && strcmp(reservas[i].cpf, cpf) == 0) break;
	}
	return i;
}

void cancelar_passagem() {
	int numvoo;

	puts("*** @PASSAGENS\\Cancelar ***");
	printf("Informe o número do voo: ");
	scanf("%d%*c", &numvoo);

	int pos_voo = existe_voo_com_numero(numvoo);
	char _tmp_cpf[MAX_CPF];

	if (pos_voo > MAX_VOOS) {
		puts("Voo não encontrado.");
	} else {
		printf("Informe o CPF: ");
		fgets(_tmp_cpf, MAX_CPF, stdin);
		_tmp_cpf[strlen(_tmp_cpf)-1] = '\0';

		int pos_passageiro = pesquisar_passageiro(_tmp_cpf, numvoo);
		if (pos_passageiro > MAXIMO_PASSAGENS) {
			puts("Não existe passagem para este usuario no voo informado.");
		} else {
			reservas[pos_passageiro].numvoo = -1;
			voos_disponiveis[pos_voo].poltronas_ocupadas--;
			poltronas_ocupadas--;
		}
	}
}
void menu_principal() {
	puts("*** @COMPANHIA AEREA\\Menu principal ***");
	printf("%d. Cadastrar voo\n", CADASTRO_VOO);
	printf("%d. Cadastrar passagem\n", CADASTRO_PASSAGEM);
	printf("%d. Pesquisar voo\n", PESQUISAR_VOO);
	printf("%d. Cancelar passagem\n", CANCELAR_PASSAGEM);
	printf("%d. Sair\n", SAIR);
	printf(">> ");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.