Ir ao conteúdo
  • Cadastre-se

C o sistema de venda de passagens de ônibus em linguagem c


RobertNL77

Posts recomendados

Preciso de Ajuda pra terminar o código, pois estou tendo dificuldades...... O código está quase pronto, porém  apresenta alguns erros.... 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <locale.h>

const float precoQuilometro = 2.41;
const float taxaEmbarque = 1.10;

typedef struct{
    int idCidade;
    char nome[60];
    char estado[2];
    char sigla[3];
}Cidade;

typedef struct{
    int horas;
    int minutos;
}Hora;

typedef struct{
    int idTrecho;
    int idCidadePartida;
    Hora partida;
    int idCidadeChegada;
    Hora chegada;
    int km;
}Trecho;

typedef struct{
    int idLinha;
    char placaOnibus[7];
    char empresa[50];
    Trecho trecho[20];
    int idInicio;
    int idFim;
}Linha;

Linha linhas[100];
Cidade cidades[200];
int idCidade = 0;
int idLinha = 0;

//Início Diego(módulo venda)
typedef struct{
    int idVenda;
    int idCliente;
    int idLinha;
    int idCidadeEmbarque;
    int idCidadeDesembarque;
    int poltrona;
    float PrecoPassagem;
}Passagem;

Passagem Passagens[100];
int idPassagem = 0;


int maxIdTrecho(int i){
    int j=0;
    while(linhas[i].trecho[j].idTrecho != 0){
    j++;
    }
    return j-1;
}

void consultaTrechoPartida(int i){
    int j, max;
    max = maxIdTrecho(i);
    printf("\t\t\t\t\t\t\t\t\tEMBARQUE \n\n");
    printf("------------------------------------\n");
    printf("Código - Cidade Partida\n\n");
    for(j=0; j<= max; j++){
        printf("%i - %s \n", linhas[i].trecho[j].idTrecho , cidades[linhas[i].trecho[j].idCidadePartida-1].nome);
    }
    printf("------------------------------------\n\n");
}

void consultaTrechoChegada(int i){
    int j, max;
    max = maxIdTrecho(i);
    printf("\t\t\t\t\t\t\t\t\tDESEMBARQUE\n\n");
    printf("------------------------------------\n");
    printf("Código - Cidade Chegada\n\n");
    for(j=0; j<= max; j++){
        printf("%i - %s \n", linhas[i].trecho[j].idTrecho , cidades[linhas[i].trecho[j].idCidadeChegada-1].nome);
    }
    printf("------------------------------------\n\n");
}


void consultaIdLinha(){
    int i;
    printf("\t\t\t\t\t\t\t\t\tSELECIONE A LINHA\n\n");
    printf("------------------------------------\n");
    printf("Código - Linha\n\n");
    for(i=0; i<= idLinha-1; i++){
        printf("%i - %s x %s \n", linhas[i].idLinha , cidades[linhas[i].idInicio-1].nome, cidades[linhas[i].idFim-1].nome);
    }
    printf("------------------------------------\n\n");
}

int calculoKm(int linha, int partida, int chegada){
    int i, km=0;
    for(i= partida; i<=chegada;i++){
      km +=linhas[linha].trecho[i].km;
    }
    return km;
}

int cliente(){
    int cpf;

    return cpf;
}

int escolhaPoltrona(){
    int poltrona;

    return poltrona;
}

void imprimirPassagem(){


}

void venda(){
    int i, linha, partida, chegada, km, poltrona;
    float precoPassagem;
    system("cls");
    cabecalho("VENDA DE PASSAGEM");
    consultaIdLinha();
    printf("Selecione o código da Linha: ");
    setbuf(stdin, NULL);
    scanf("%i%*c", &linha);
    setbuf(stdin, NULL);
    consultaTrechoPartida(linha-1);
    printf("\n\nSelecione o código do trecho da Cidade de Partida: ");
    setbuf(stdin, NULL);
    scanf("%i%*c", &partida);
    setbuf(stdin, NULL);
    consultaTrechoChegada(linha-1);
    printf("\n\nSelecione o código do trecho da Cidade de Chegada: ");
    setbuf(stdin, NULL);
    scanf("%i%*c", &chegada);
    setbuf(stdin, NULL);
    i = linha-1;
    printf("\n\nPartida: %s", cidades[linhas[i].trecho[partida-1].idCidadePartida-1].nome);
    printf("\t\t Chegada: %s%", cidades[linhas[i].trecho[chegada-1].idCidadeChegada-1].nome);
    printf("\n\nHorário de embarque: %i:%i\n", linhas[i].trecho[partida-1].partida.horas, linhas[i].trecho[partida-1].partida.minutos);
    printf("Previsão de chegada: %i:%i\n", linhas[i].trecho[chegada-1].chegada.horas, linhas[i].trecho[chegada-1].chegada.minutos);
    km = calculoKm(i, partida-1, chegada-1);
    precoPassagem = (km*precoQuilometro) + taxaEmbarque;

    //escrever função escolhaPoltrona()
    poltrona = escolhaPoltrona();

    //escrever função cliente(), com retorno do CPF do cliente.
    Passagens[idPassagem].idCliente = cliente();
    Passagens[idPassagem].idLinha = linha;
    Passagens[idPassagem].idCidadeEmbarque = partida;
    Passagens[idPassagem].idCidadeDesembarque = chegada;
    Passagens[idPassagem].PrecoPassagem = precoPassagem;
    Passagens[idPassagem].poltrona = poltrona;
    Passagens[idPassagem].idVenda = idPassagem;
    imprimirPassagem();
    idPassagem++;

    system("pause");

}


//Fim (módulo venda)


void cabecalho(char nome[50]){

    printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
    printf("\t\t\t\t\t\t\t\t\t  %s  \n", nome);
    printf("------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n");
    return 0;
}

void titulo(char nome[30], int i){
printf("\t\t\t\t\t\t\t\t\t%s: %i\n\n", nome, i);
}

void cadCidade(){
    int i, op;
    do{
        i = idCidade;
        system("cls");
        cabecalho("CADASTRO DE CIDADE");
        titulo("Código da cidade", i+1);
        cidades[i].idCidade = i+1;
        printf("\nNome: ");
        setbuf(stdin,NULL);
        scanf("%[^\n]s%*c", &cidades[i].nome);
        setbuf(stdin,NULL);
        printf("\nSigla da cidade (3 dígitos): ");
        setbuf(stdin,NULL);
        scanf("%[^\n]s%*c", &cidades[i].sigla);
        setbuf(stdin,NULL);
        printf("\nSigla do estado: ");
        setbuf(stdin,NULL);
        scanf("%[^\n]s%*c", &cidades[i].estado);
        setbuf(stdin,NULL);
        idCidade++;
        printf("\nCadastro realizado com sucesso.\n\n");
        printf("Deseja inserir novo cadastro?\n1- Sim.\t0-Não.\nOpção: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &op);
        setbuf(stdin,NULL);
        while(op!=1 && op!=0){
            printf("Opção inválida!\n");
            printf("Deseja inserir novo cadastro?\n1- Sim.\t\t0-Não.\nOpção: ");
            setbuf(stdin,NULL);
            scanf("%i%*c", &op);
            setbuf(stdin,NULL);
        }
    }while(op!=0);
}

void consultaIdCidade(){
    int i;
    printf("\t\t\t\t\t\t\t\t\tCidades\n\n");
    printf("------------------------------------\n");
    printf("Código - Cidade - Sigla\n\n");
    for(i=0; i<= idCidade-1; i++){
        printf("%i - %s - %s\n", cidades[i].idCidade, cidades[i].nome, cidades[i].sigla);
    }
    printf("------------------------------------\n\n");
}

void cadTrecho(int i){
    int op, j=0;
    do{
        system("cls");
        cabecalho("CADASTRO DE LINHA");
        printf("\n\n\t\t\t\t\t\t\t\tLinha %i: %s x %s\n\n", i+1, cidades[linhas[i].idInicio-1].nome, cidades[linhas[i].idFim-1].nome);
        printf("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
        printf("\n\n\t\t\t\t\t\t\t\tCadastrar trecho %i:\n\n", j+1);
        linhas[i].trecho[j].idTrecho = j+1;
        consultaIdCidade();
        printf("Código da cidade de partida: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].idCidadePartida);
        setbuf(stdin,NULL);
        printf("Cidade de partida: %s\n\n", cidades[linhas[i].trecho[j].idCidadePartida-1].nome);
        printf("Código da cidade de chegada: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].idCidadeChegada);
        setbuf(stdin,NULL);
        printf("Cidade de origem: %s\n\n", cidades[linhas[i].trecho[j].idCidadeChegada-1].nome);
        printf("\n\n\t\t\t\t\t\t\t\tHorário de partida\n\n");
        printf("Hora: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].partida.horas);
        setbuf(stdin,NULL);
        printf("Minutos: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].partida.minutos);
        setbuf(stdin,NULL);
        printf("\n\n\t\t\t\t\t\t\t\t\tHorário de chegada\n\n");
        printf("Hora: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].chegada.horas);
        setbuf(stdin,NULL);
        printf("Minutos: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].chegada.minutos);
        setbuf(stdin,NULL);
        printf("\n\n\t\t\t\t\t\t\t\t\tQuilometragem entre cidades\n\n");
        setbuf(stdin,NULL);
        scanf("%i%*c", &linhas[i].trecho[j].km);
        setbuf(stdin,NULL);
        j++;
        system("cls");
        printf("\nCadastro de trecho realizado com sucesso.\n\n");
        printf("Deseja inserir novo trecho?\n1- Sim.\t0-Não.\nOpção: ");
        setbuf(stdin,NULL);
        scanf("%i%*c", &op);
        setbuf(stdin,NULL);
        while(op!=1 && op!=0){
            printf("Opção inválida!\n");
            printf("Deseja inserir novo trecho?\n1- Sim.\t\t0-Não.\nOpção: ");
            setbuf(stdin,NULL);
            scanf("%i%*c", &op);
            setbuf(stdin,NULL);
        }
    }while(op!=0);
}

void cadLinha(){
    int i,op;
    do{
        i = idLinha;
        system("cls");
        cabecalho("CADASTRO DE LINHA");
        printf("\t\t\t\t\t\t\t\t\tLinha %i\n\n", i+1);
        linhas[i].idLinha = i+1;
        printf("Informe a placa do ônibus: ");
        scanf("%[^\n]s%*c", &linhas[i].placaOnibus);
        setbuf(stdin,NULL);
        printf("Informe a empresa: ");
        scanf("%[^\n]s%*c", &linhas[i].empresa);
        setbuf(stdin,NULL);
        consultaIdCidade();
        printf("\nCódigo da cidade de origem da linha: ");
        scanf("%i%*c", &linhas[i].idInicio);
        setbuf(stdin,NULL);
        printf("Cidade de origem da linha: %s\n", cidades[linhas[i].idInicio-1].nome);
        printf("\nCódigo da cidade do final da linha: ");
        scanf("%i%*c", &linhas[i].idFim);
        setbuf(stdin,NULL);
        printf("Cidade de origem da linha: %s\n\n", cidades[linhas[i].idFim-1].nome);
        system("pause");
        cadTrecho(i);
        idLinha++;
        system("cls");
        cabecalho("CADASTRO DE LINHA");
        printf("\nCadastro de linha realizado com sucesso.\n\n");
            printf("Deseja inserir nova linha?\n1- Sim.\t0-Não.\nOpção: ");
            scanf("%i%*c", &op);
            setbuf(stdin,NULL);
            while(op!=1 && op!=0){
                printf("Opção inválida!\n");
                printf("Deseja inserir nova linha?\n1- Sim.\t\t0-Não.\nOpção: ");
                scanf("%i%*c", &op);
                setbuf(stdin,NULL);
            }
        }while(op!=0);
}

void cadCliente(){
    int i;
    system("cls");
    cabecalho("CADASTRO DE CLIENTE");
    printf("\n\nAinda não implementado.\n\n");
    system("pause");
}


void menu(){
    int op;
    do{
        system("cls");
        printf("\t\t\t\t\t+--------+-----------+---------+--------------------------+------------+-----------+\n");
        printf("\t\t\t\t\t|                                 .::DRSD-TRANSPORTES::.                           |\n");
        printf("\t\t\t\t\t+--------+-----------+---------+--------------------------+------------+-----------+\n");
        cabecalho("MENU PRINCIPAL");
        printf("ESCOLHA UMA OPÇÃO\n\n");
        printf("1- CADASTRAR CIDADE\n");
        printf("2- CADASTRAR LINHA\n");
        printf("3- CADASTRO DE CLIENTE\n");
        printf("4- VENDA DE PASSAGEM\n");
        printf("0- SAIR\n\n");
        printf ("Opção: ");
        scanf("%i%*c", &op);
        switch(op){
            case 1:
                cadCidade();
                break;
            case 2:
                cadLinha();
                break;
            case 3:
                cadCliente();
                break;
            case 4:
                venda();
                break;
            case 0:
                exit(0);
            default:
                printf("\nOpção inválida.\n\n");
                system("pause");
                break;
        }
    }while(op!= 0);
}

int main()
{
    //Possibilita uso de caracteres especiais:
    setlocale(LC_ALL, "Portuguese");
    //Abre o programa em tela cheia (maximizado):
    keybd_event ( VK_MENU, 0x36, 0, 0 );
    keybd_event ( VK_RETURN, 0x1C, 0, 0 );
    keybd_event ( VK_RETURN, 0x1C, KEYEVENTF_KEYUP, 0 );
    keybd_event ( VK_MENU, 0x38, KEYEVENTF_KEYUP, 0 );

    menu();

    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

@RobertNL77    sim , tem muitos erros mesmo ,  e são erros de sintaxe e montagem do código ,  você chamou uma função " cabeçalho  " que está abaixo de onde se originou a chamada , e essa função " venda " , logo no começo você enviou um texto para a função cabeçalho , que recebe uma string , e assim o compilador não funciona , e para consertar poderia ser assim  :

void venda() 
{
    char msg[50]= "VENDA DE PASSAGEM";            // uma string contendo o texto
                                                  // ou pode usar a função strcpy também
    int i, linha, partida, chegada, km, poltrona;
    float precoPassagem;
    system("cls");
    cabecalho(msg/*"VENDA DE PASSAGEM"*/);        // envia a string para a função
    consultaIdLinha();
    printf("Selecione o código da Linha: ");
    setbuf(stdin, NULL);

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@RobertNL77

1 hora atrás, RobertNL77 disse:

setbuf(stdin, NULL);
scanf("%i%*c", &linha);
setbuf(stdin, NULL);

Já vi usarem erroneamente setbuf() pra zerar o tal buffer de entrada, mas qual seu uso aqui? já está lendo e ignorando o '\n' que sobra da leitura com %*c, e ainda chamou a função duas vezes entre a scanf()...

 

1 hora atrás, RobertNL77 disse:

system("cls");

Recomendo não usar: system() passa uma string para o sistema rodar, em certos casos pode não ser muito agradável e até perigoso.

Da pra fazer isso usando a API do Windows em poucas linhas.

 

1 hora atrás, RobertNL77 disse:

//Abre o programa em tela cheia (maximizado):
keybd_event ( VK_MENU, 0x36, 0, 0 );
keybd_event ( VK_RETURN, 0x1C, 0, 0 );
keybd_event ( VK_RETURN, 0x1C, KEYEVENTF_KEYUP, 0 );
keybd_event ( VK_MENU, 0x38, KEYEVENTF_KEYUP, 0 );

De onde isso veio? 🤔

Está simulando o pressionamento de teclas para deixar a janela do IDE em tela cheia? Se está fazendo um programa de console usando a API do Windows, pode chamar GetConsoleWindow() e ShowWindow(). Em 1 linha:

ShowWindow(GetConsoleWindow(), SW_MAXIMIZE);

 

1 hora atrás, RobertNL77 disse:

O código está quase pronto, porém  apresenta alguns erros....

Não comentou sobre... Da próxima vez, tente facilitar a vida de quem está disposto a te ajudar, disserte sobre os erros :D

E sim, alguns erros:

image.png.6bf05adf756bd10db554863667a9691f.png

Pelo menos é isso (não só isso) que me é mostrado com esse compilador aí.

Um exemplo:

image.png.8e5a3474519cba79c8f831fc3228e451.png

Basta interpretar: a função cabecalho está retornando o valor 0, porém, não deveria, pois é do tipo void. Se quiser, pode deixar lá um return sem nenhuma expressão subsequente, pois alguns compiladores acusam erro sem o comando.

 

Agora sua vez... Leia e interprete todo o resto, e se tiver dúvidas objetivas, pergunte :D

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 você direcionou a venda de passagens com o cadastro de linhas, não foi ? se possivel me ajudar a criar a parte da venda de passagens com ligação ao cliente cadastrado, eu seria muito grato. também quero criar uma função pra listar uma opção de imprimir passagem . Voltando ao assunto de cadastro de cliente, eu criei esse código separado, mas estou com dificuldade em linkar com o código original ......vou encaminhar aqui abaixo

meu conhecimento em C é bem pouco!! desde já agradeço 

 ----------------------------------------cadastro de cliente--------------------------------------------------

include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h>
typedef struct{
    
    char nome[200];
    int cpf;
    char sexo;
    int dataNas;
    
}cliente;


int quantidadeclientes=0;
cliente codigo[100];

void exibiTitulo(char* titulo){
    system("cls");
    system("Color 0B");
    printf("\t =======  Cadastro de Cliente: %s  =======\t \n", titulo);
}  
void cadastrarclientes(){
    
    exibiTitulo("Novo Cliente");
    printf("Informe os dados: \n\n");
    printf("\t\tNúmero: %i\n", quantidadeclientes+1);    
    printf("Nome do cliente: ");
    
        scanf("%[^\n]s%*c", &cliente[quantidadeclientes].nome);    
        
    printf("\n\nInforme o CPF:");
    scanf("%i%*c", &cliente[quantidadeclientes].cpf);
    
    printf("\n\nSexo:");
    scanf("%c%*c", &cliente[quantidadeclientes].sexo);
    
    printf("\n\nData de Nascimento:");
    scanf("%i%*c", &cliente[quantidadeclientes].dataNas);
    
    quantidadeclientes++;
    printf("\nConta cadastrada com sucesso!\n");
    system("pause");

}    

int main(){
    
    setlocale(LC_ALL,"portuguese");    
    
    void cadastrarcliente();
    
    
    return 0;        
}

Link para o comentário
Compartilhar em outros sites

@devair1010 você direcionou a venda de passagens com o cadastro de linhas, não foi ? se possivel me ajudar a criar a parte da venda de passagens com ligação ao cliente cadastrado, eu seria muito grato. também quero criar uma função pra listar uma opção de imprimir passagem . Voltando ao assunto de cadastro de cliente, eu criei esse código separado, mas estou com dificuldade em linkar com o código original ......vou encaminhar aqui abaixo

meu conhecimento em C é bem pouco!! desde já agradeço 

 ----------------------------------------cadastro de cliente--------------------------------------------------

#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct {
    char nome[30];
    int CPF;
    int data_nasc;
    char sexo[10];
}pessoa;

void cad_cliente(){
    int quant_cliente[100];
    pessoa cliente ;
    do{
        system("pause");
        printf(">>>>>>>>>>>>>>>>>>> CADASTRANDO CLIENTE <<<<<<<<<<<<<<<<<<<<<<<");
        printf("================================================================");
        printf("\n\n");
        printf("INFORMAR OS DADOS PESSOAIS...");
        PRINTF("\n");
        printf("\nNOME DO CLINTE...:");
        scanf("\n%s", &cliente[quant_cliente].nome);
        printf("\nCPF DO CLIENTE...:");
        scanf("\n%i", &cliente[quant_cliente].CPF);
        printf("\nSEXO DO CLIENTE...:");
        scanf("\n%[^\n]s%*c", &cliente[quant_cliente].sexo);
        printf("\nDATA DE NASCIMENTO DO CLIENTE...:");
        scanf("\n%i", &cliente[quant_cliente].data_nasc);
        quant_cliente++;
        printf("\n\n\n");
        
    }
    
    printf("*****DADOS CADASTRADOS*****");
    printf("\n");
    do{
    printf("O CLIENTE SE CHAMA: %s ", cliente.nome);
    printf("SEU CPF: %i ", cliente.CPF);
    printf("SEU SEXO: %s ", cliente.sexo);
    printf("SUA DATA DE NASCIMENTO: %i ", cliente.data_nasc");
}
}

int main(){
    cad_cliente();

    return 0;
}

Link para o comentário
Compartilhar em outros sites

 

Seu programa tem muitos erros ainda :(

 

Não deve deixar um programa crescer com várias funções sem testar nada. Já são 400 linhas. Só dificulta sua vida. 

 

Escreva em torno dos dados. Não escreva nada sem razão.

 

Uma função void sem parâmetros é um buraco negro, a menos de variáveis globais. E variáveis globais são um desastre de manutenção e uso, proibidas em vários lugares. Não entra nada, não sai nada. ãs vezes é só um desperdício, muitas vezes um erro.

 

2 horas atrás, RobertNL77 disse:

void cadastrarclientes()

 

Essa aqui é um bem provável desperdício. 

 

A gente  espera que uma função com esse nome insira um cliente num cadastro. Em um Cadastro de Clientes. Em 100% dos casos estará bem com algo assim:
 

#define     MAX_CLI_    (20)

typedef struct
{
    int     id;

} Cliente;

typedef struct
{
    int     id;
    char*   nome;
    int     n_clientes;
    Cliente cl[MAX_CLI_];

}   Cadastro;

int         cadastrar_cliente(Cliente*, Cadastro*);

 

Onde se espera que você passe um Cliente e um Cadastro para a função e ela retorna 0 se inseriu ok ou um código de erro. É o comum em C.

 

E é mais fácil de escrever e testar. Por isso é o comum ;) 

 


void menu() {
    int op;
    do {

// ...

int main()
{

    menu();

 

E esse é outro erro do mesmo tipo...

 

menu() é outro buraco negro. Você queria escrever na verdade
 

int		menu();

int mnain(void)
{
	int op = menu();
	switch(op){};

 

Não misture lógica com interface. Só vai te dar problemas e enfurecer outros que venham a ler seus programas. A lógica do seu programa foi transferida para dentro de menu() e main() só tem uma linha. Parece certo? Dica: não está.

 

menu() mostra umas opções e recolhe uma opção e retorna. Só isso. 

 

Sobre isso:

 

    //Possibilita uso de caracteres especiais:
    setlocale(LC_ALL, "Portuguese");

 

sabe o que significa o LC_ALL? isso é muito mais do que diz o comentário. E nada acrescenta ao seu programa num primeiro momento.

 

Veja na documentação e entenda
 

  • o que faz set_locale() com LC_ALL
     
  • o que ela retorna? E TESTE o retorno. 
     
    //Abre o programa em tela cheia (maximizado):
    keybd_event(VK_MENU, 0x36, 0, 0);
    keybd_event(VK_RETURN, 0x1C, 0, 0);
    keybd_event(VK_RETURN, 0x1C, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_MENU, 0x38, KEYEVENTF_KEYUP, 0);

 

Está programando em C num sistema que foi escrito em C. Não há razão para escrever isso. Mais ainda, keybd_event() é obsoleta há décadas. SendInput() seria a sucessora e não seria usada para algo assim.

 

2 horas atrás, Lucca Rodrigues disse:

ShowWindow(GetConsoleWindow(), SW_MAXIMIZE);

 

Pois é. 

 

Usar keybd_event() ou SendInput() para colocar algo no buffer de entrada para depois o driver do teclado gerar um SendMSg() para depois entrar no loop de mensagens da sua janela seria algo como colocar um parafuso em baixo da chave de fenda e ficar girando ;) e ainda reclamar que o parafuso escapa. Evite isso, ainda que funcione.

 

void cadCidade() {
    int i, op;
    do {
        i = idCidade;
        system("cls");
        cabecalho("CADASTRO DE CIDADE");
        titulo("Código da cidade", i + 1);
        cidades[i].idCidade = i + 1;
        printf("\nNome: ");
        setbuf(stdin, NULL);
        scanf("%[^\n]s%*c", &cidades[i].nome);
        setbuf(stdin, NULL);

 

Esse é o mesmo caso: as coisas misturadas assim só vão criar problemas. Vai atrasar os testes, a manutenção vai ser um desastre, flexibilidade mínima e por aí vai. 

Evite esses caminhos

 

Prepare seus dados. Conheça seis dados. E escreva o programa só depois disso. 

 

Na prática a função cadCidade() recebe um registro e insere num cadastro. De cidades. Não pode ter entrada e saída lá dentro. Uma função monta um registro de Cidade. E aí chama cadCidade() e passa esse registro. Assim pode por exemplo testar seu programa mais rápido, em minutos.

 

Do modo como está escrevendo tem entrada e saida e processamento tudo junto. É um desastre.

 

  • nunca use system(). De nada serve. Não vai aprender nada. E depois não vai mesmo oder usar em lugar nenhum. system() foi escrita em C. Deve ter outra maneira de limpar a tela. Mais segura por exemplo. Eu já postei umas aqui por exemplo
  • cabecalho() e titulo() são coisas ambíguas e provavelmente não precisa de nenhum dos dois
  • setbuf() não é para isso e sequer funciona em fluxos de entrada em todos compiladores. Se está precisando disso é porque misturou as operações de entrada e não pensou em como consumir os dados
  • scanf() retorna um int. É ingênuo (muito ingênuo mesmo) não testar: se você não ler o nome da cidade o que acha que vai ganhar lendo a sigla da cidade e continuando com o programa?
    • E sobre isso como trataria duas siglas com a mesma cidade ou duas cidades com a mesma sigla?

 

Recomendo rever essas coisas e postar o programa como ficou pra continuar daí.

 

 

 

:) não use acentos em comentários. Nem sempre aparece o que você espera e o propósito de um comentário persiste mesmo sem acento, mas se aparecerem letras estranhas no meio do texto de nada adianta

 

    //escrever função escolhaPoltrona()
    poltrona = escolhaPoltrona();

    //escrever função cliente(), com retorno do CPF do cliente.

 

Comentários assim em geral não somam muito

    system("pause");

 

Isso é um mal sinal: estaria usando um IDE que SEMPRE fecha a janela ao final? Não vai testar seu programa do modo normal, no Terminal ou na console? E aí vai ter que digitar um ENTER a toa no final? 

 

Só "pause" ?

O programa parece estar bem construído no geral, mas acho que precisa de mais uma entidade: existem os clientes, os trechos, as cidades e tal. Mas precisa ter um universo de Viagem dentro dos trechos. As passagem são vendidas para Trecho ou Cidade. 

 

São cadastradas viagens entre cidades , com horários, e as passagens são vendidas assim. Pense a partir da estrutura de Passagem...

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@RobertNL77    esse código de cadastro de clientes também tem erros e não funciona ,  e corrigido poderia ser assim  :

#define _CRT_SECURE_NO_WARNINGS  // para usar scanf no visual studio
#include<stdio.h>
#include<conio.h>
#define getch() _getch()         // para usar getch no visual studio
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
typedef struct
{
    char nome[30];
    char CPF[15];       // melhor que seja string , pois não vai usar para nenhum cálculo
    char data_nasc[10]; // melhor que seja string , pois int não vai funcionar
    char sexo[10];
    int cont;           // hum contador e não pode inicializar variáveis aqui dentro do struct
}pessoa;
// pessoa cli[10];      // poderia criar o vetor aqui  , sendo GlobaL
void cad_cliente(pessoa cliente[10])
{
    int quant_cliente=0;
    char c,op;
    do
    {
        printf(">>>>>>>>>>>>>>>>>>> CADASTRANDO CLIENTE <<<<<<<<<<<<<<<<<<<<<<<\n");
        printf("================================================================\n");
        printf("INFORMAR OS DADOS PESSOAIS...\n");
        printf("NOME DO CLINTE...: ");
        scanf("\n%s", &cliente[cliente[0].cont].nome);
        printf("CPF DO CLIENTE...: ");
        scanf("%s", &cliente[cliente[0].cont].CPF);
        printf("SEXO DO CLIENTE...: ");
        scanf("\n%[^\n]s%*c", &cliente[quant_cliente].sexo);
        printf("DATA DE NASCIMENTO DO CLIENTE...: ");
        scanf("%s", &cliente[cliente[0].cont].data_nasc);
        //quant_cliente++;
        cliente[0].cont++;
        printf("Outro Cadastro S/N ");
        while (c = fgetc(stdin) != '\n');              // limpando o buffer do teclado
    } while ( toupper( (char)getch() ) != 'N' );       // converter para maiúculas

    printf("\n\n*****DADOS CADASTRADOS*****\n\n");
    int q = 0;
    do
    {
        printf("O CLIENTE SE CHAMA -----: %s\n", cliente[0].     nome);
        printf("SEU CPF ----------------: %s\n", cliente[0].      CPF);
        printf("SEU SEXO ---------------: %s\n", cliente[0].     sexo);
        printf("SUA DATA DE NASCIMENTO -: %s\n", cliente[0].data_nasc);
        q++;
    } while ( q < quant_cliente );
}

int main()
{
    pessoa cli[10];                                 // cria o vetor com a qtd de elementos
    cli[0].cont = 0;                                // inicializa um contador
    printf("%d\n", cli[0].cont);                    //escreve o valor desse contador para simples conferência
    cad_cliente(cli);                               // chama a função cad_cliente enviando o vetor de struct 
    printf("\n\n E Dentro da Main de Novo !\n\n");  // escrever os mesmos dados aqui dentro da função main
    for(int j=0; j<cli[0].cont; j++)                // para conferir que os dados estejam certos
    {
        printf("O CLIENTE SE CHAMA -----: %s\n", cli[j].nome     );
        printf("SEU CPF ----------------: %s\n", cli[j].CPF      );
        printf("SEU SEXO ---------------: %s\n", cli[j].sexo     );
        printf("SUA DATA DE NASCIMENTO -: %s\n", cli[j].data_nasc);
    }
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, devair1010 disse:

 esse código de cadastro de clientes também tem erros e não funciona ,  e corrigido poderia ser assim  :

 

@devair1010 bacana sua iniciativa de propor sempre uma solução, mas talvez --- talvez --- pudesse explicar no post o que está errado, em linhas gerais, para facilitar a compreensão do que está escrevendo e do que estava errado no código original. Em muitos casos de iniciantes ou não tão iniciantes vale mais a explicação do que o código corrigido.

 

Comentários dentro do programa podem ser pouco para um iniciante ou para um leitor que está acompanhando o tópico.

 

Por outro lado postar apenas um código que supostamente funciona pode mostrar um conceito tipo URI ou esses outros sites de competição, onde o objetivo é só mostrar conhecimento ou talvez mostrar que a questão foi vista como um desafio para o forum.

 

Sobre o programa

 

typedef struct
{
    char nome[30];
    char CPF[15];       // melhor que seja string , pois não vai usar para nenhum cálculo
    char data_nasc[10]; // melhor que seja string , pois int não vai funcionar
    char sexo[10];
    int cont;           // hum contador e não pode inicializar
  		// variáveis aqui dentro do struct
  
}	pessoa;

 

Não acho que seja o que você queria escrever. O que cont está contando DENTRO da estrutura???

 

Veja:
 

int main()
{
    pessoa cli[10];                                 // cria o vetor com a qtd de elementos
    cli[0].cont = 0;                                // inicializa um contador
    printf("%d\n", cli[0].cont);                    //escreve o valor desse contador para simples conferência
    cad_cliente(cli);                               // chama a função cad_cliente enviando o vetor de struct 
    printf("\n\n E Dentro da Main de Novo !\n\n");  // escrever os mesmos dados aqui dentro da função main
    for(int j=0; j<cli[0].cont; j++)                // para conferir que os dados estejam certos
    {
        printf("O CLIENTE SE CHAMA -----: %s\n", cli[j].nome     );
        printf("SEU CPF ----------------: %s\n", cli[j].CPF      );
        printf("SEU SEXO ---------------: %s\n", cli[j].sexo     );
        printf("SUA DATA DE NASCIMENTO -: %s\n", cli[j].data_nasc);
      
      
      // ...

 

Cada registro de pessoa tem seu próprio cont. Para que serve? Está certo de que funciona? Ao escrever coisas assim em geral se escreve antes de tudo uma função que lista os caras. E outra que cria registros de teste. Assim testa em minutos.  E claro que se copia um programa para outro e para outro...

 

EXEMPLO

 


    int    cadastrar_cliente(Cliente*, Cadastro*);
    int    listar_cadastro( Cadastro* );

// e

    Cliente*    gera_cliente(); // para testar

 

Porque assim pode escrever um teste rápido para qualquer estrutura, porque tem a função que gera e tem a função que insere e a outra que lista e nunca mais pensa nisso...

 

Veja esse programa, copiado de outro mas usando essa estrutura

 

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

#define     MAX_CLI_    (8)

typedef struct
{
    int     id;

} Cliente;

typedef struct
{
    int     id;
    char    nome[20];
    int     n_clientes;
    Cliente cl[MAX_CLI_];

}   Cadastro;

int         cadastrar_cliente(Cliente*, Cadastro*);
int         listar_cadastro( Cadastro* );
Cliente*    gera_cliente(); // para testar

int main(void)
{
    const char* loja = "Clube do HW";
    Cadastro pessoas;
    pessoas.n_clientes = 0;
    pessoas.id = 42;
    strcpy( pessoas.nome, loja ); // o nome do cadastro

    // o loop cadastra novos clientes ate a funcao dar erro
    // o que deve acontecer quando nao couber mais ninguem
    // e ai lista o cadastro.
    // o minimo para testar

    Cliente*    pCliente = NULL; // o cliente
    int         status = 0;
    while (status == 0)
    {
        pCliente = gera_cliente(); // um novo
        status = cadastrar_cliente( pCliente, &pessoas );
        free(pCliente); // ja copiou
    };
    listar_cadastro( &pessoas );

    return 0;
};  // main()


int         cadastrar_cliente(Cliente* um, Cadastro* cad)
{
    if ( cad->n_clientes == MAX_CLI_ ) return -1; // nao cabe mais
    cad->cl[ cad->n_clientes ] = *um;
    cad->n_clientes += 1; // conta o novo;
    return 0;
};

int         listar_cadastro( Cadastro* C )
{
    if ( C == NULL ) return -1; // invalido
    printf( "listando cadastro '%s' id = %d, [%d clientes]\n\n",
        C->nome, C->id, C->n_clientes );
    for ( int i = 0; i < C->n_clientes; i+=1 )
    {
        printf("\t%4d:  %d\n", 1+i, C->cl[i].id );
    }
    printf("\n");
    return C->n_clientes;
};

Cliente*    gera_cliente()
{
    static int numero = 200;
    // c aponta para um Cliente novo
    Cliente* c = (Cliente*) malloc(sizeof(Cliente));
    c->id = numero;
    numero += 1;
    return c;
}; // para testar

 

Veja main() como é simples: cria um cadastro e enche com valores de teste. Depois lista e termina. Podia ser um cadastro complexo com 8000 clientes, e já estaria testando o sistema.

 

PS C:\src\CPP\flt> ./tst
listando cadastro 'Clube do HW' id = 42, [8 clientes]

           1:  200
           2:  201
           3:  202
           4:  203
           5:  204
           6:  205
           7:  206
           8:  207

PS C:\src\CPP\flt>

 

E compare com o usual de ficar parado em frente ao terminal digitando dados a olho para um cadastro A CADA TESTE.

 

--- fim do exemplo ---

 

DE VOLTA AO SEU PROGRAMA

 

Recomendo muito usar a convenção de manter a Primeira letra maiúscula em structs. Usar Pessoa e não pessoa.

 

Provavelmente o que quer escrever é o que eu mostrei no tópico #6 e usei no exemplo acima:

 

#define     MAX_CLI_    (20)

typedef struct
{
    int     id;

} Cliente;

typedef struct
{
    int     id;
    char*   nome;
    int     n_clientes;
    Cliente cl[MAX_CLI_];

}   Cadastro;

int         cadastrar_cliente(Cliente*, Cadastro*);

 

Onde Cadastro é um grupo de Pessoa, e o seu cont é o n_clientes. E você usa assim:

 


	Cadastro	pessoas;
	pessoas.n_clientes = 0;

	Cliente		um;

	if ( cadastrar_cliente( um, pessoas ) == 0 )
	{
		// ok...
	}

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto     esse código ficou muito bom ,  vou estuda-lo para entender bem com funciona ,  e aquele comentário

int cont;           // hum contador e não pode inicializar
                    // variáveis aqui dentro do struct na hora 
                    // em que se cria a struct

é por que o compilador sempre mostra erro quando faço a iniciaLização de variáveis lá dentro da struct no momento em que ela foi criada , mas depois dentro da função main ou em qualquer outra função , pode sim inicializar sem erro ,  e coloquei esse cont foi para fazer a contagem mesmo .     tento corrigir o código por que apenas explicando como funciona as funções , mostrando exemplos de outros códigos ,  ainda fica difícil saber o que fazer nesse que está com erro e é diferente dos exemplos .

Link para o comentário
Compartilhar em outros sites

12 minutos atrás, devair1010 disse:

é por que o compilador sempre mostra erro quando faço a iniciaLização de variáveis lá dentro da struct no momento em que ela foi criada , mas depois dentro da função main ou em qualquer outra função , pode sim inicializar sem erro ,  e coloquei esse cont foi para fazer a contagem mesmo .     tento corrigir o código por que apenas explicando como funciona as funções , mostrando exemplos de outros códigos ,  ainda fica difícil saber o que fazer nesse que está com erro e é diferente dos exemplos

 

Eu entendi isso.

 

O compilador tem que dar erro porque declarar uma struct ou um typedef não aloca memória, não tem onde gravar. Pode até parecer intuitivo você poder inicializar na declaração mas não é assim. Imagine se você declarar 

 

typedef struct
{
    char nome[30];
    char CPF[15];       // melhor que seja string , pois não vai usar para nenhum cálculo
    char data_nasc[10]; // melhor que seja string , pois int não vai funcionar
    char sexo[10];
    int cont;           // hum contador e não pode inicializar
  		// variáveis aqui dentro do struct
  
}	Pessoa;

Pessoa pessoa[30];
Pessoa* p[30];

 

Se fosse possível inicializar cont dentro da struct ao criar o vetor pessoa você pode esperar que todas apareçam já com cont = 0. Mas como ficaria com os ponteiros? Não seria coerente. 

 

O que eu tentei te explicar é que esse cont que você declarou está DENTRO da estrutura. Não vai contar nada porque cada struct pessoa tem um. Não vai usar isso para indexar e navegar por um vetor de pessoa... Está errado.

 

Compare com o programa que te mostrei

20 minutos atrás, devair1010 disse:

s lá dentro da struct no momento em que ela foi criada

 

Então... pode estar confundindo esse momento de criação... C não tem construtores como C++. Apenas aloca a região ao declarar algo daquele tipo. 

Mas esse não é o erro lá: cont está dentro da struct e você está tentando navegar em um vetor de pessoa sendo que cada elemento tem seu próprio cont...

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!