igorsk89 0 Denunciar post Postado Junho 13, 2015 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: 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). Voltei para o Menu Principal, e agora entrei na opção 3, que é efetuar uma venda de bilhete. Após comprar o bilhete, voltamos para o Menu principal.. e aí, vou visualizar se diminuiu as poltronas do voo que acabei de vender. 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. 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. Outro erro é na opção 4, quando tento consultar os bilhetes vendidos, insiro um CPF existente e fala que não foi localizado. E quando aparece.. Aparece assim.. Bugado! :pinch: :upset: E ainda começa do ticket nº 10, devia começar de 1. 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
_Isis_ 202 Denunciar post Postado Junho 14, 2015 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
igorsk89 0 Denunciar post Postado Junho 21, 2015 Consegui finalizar com sucesso. Obrigado pela ajuda. Pode encerrar o tópico. Compartilhar este post Link para o post Compartilhar em outros sites