Ir ao conteúdo
  • Cadastre-se

C++ Erro no cadastro esta saindo antes de passar pelo peso


souzaoe

Posts recomendados

Boa tarde senhoras e senhores, estou terminando meu exercício, e cheguei em um situação que não consigo ver o erro, ocorre que, o programa segue a sequencia correta do cadastro de aluno, no entanto, ao sair da altura e ir para o peso, estepassa direto para a saida do cadastro criando um loop continuo, enquanto perdura as vagas no vetor, alguém poderia observar e me ajudar a sanar este erro, pois já não consigo mais observar a falha no programa, fica meu agradecimento e anexo o codigo para analise. tenhão todos uma boa tarde. 

 

Código:

Spoiler

// Programa: Academia
// Função : Cria um cadastro de aluno e calcula imc
// Entrada: nome, email, peso, altura
// Processamento: calcula o imc e compara a tabela  
// Saída: retonra lista dos alunos, lista IMC de aluno(nomes, imc e condição)
// observação: o sistema só sai quando o aluno escolher a opção sair 0
// Autor : Antonio Maria Feitosa Souza
// Data : 07/06/2018
// Seção de Declarações

// inclusão das bibliotecas
// isto será usado no mapa
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define MAX 3
// Criação da estrutura contato
//float resp; 

struct cadastro {
    char nome[30]; 
    char email[30];
    char resposta[20];
    float peso; 
    float altura; 
    float imc;
    int id; 
    
}; 


// Criando variaveis globais 
// declaração da variavel agenda
struct cadastro altura[MAX];

int opcao, i, j;
float altCalc; 
float pesCalc;
float resp;
char p1[20] = {"Abaixo do Peso"}; 
char p2[20] = {"Peso Ideal"}; 
char p3[20] = {"Sobre Peso"}; 
char p4[20] = {"Obesidade Grau1"}; 
char p5[20] = {"Obesidade Grau2"}; 
char p6[20] = {"Obesidade Grau3"}; 


// declaração das funções
//menur(); 
//imc(); 
//apagar(); 
//listar();
//cadastrar(); 
//listarimc(); 

imc (){
    
    
    float resp;
    for (i = 0; i < MAX; i++){
        altCalc = altura.altura;  
        pesCalc = altura.peso;
        resp = (pesCalc/(altCalc*altCalc));
        altura.imc = resp;
        if (resp > 0 && resp < 18.50)
            strcpy(altura.resposta, p1);
                     
        else if (resp>18.50 && resp<25)
            strcpy(altura.resposta, p2);    
                                            
        else if (resp>25 && resp<30)
            strcpy(altura.resposta, p3);
                                                     
        else if (resp>30 && resp<35)
            strcpy(altura.resposta, p4);
                     
        else if (resp>35 && resp<40 )
            strcpy(altura.resposta, p5);
                     
        else if(resp>40)
            strcpy(altura.resposta, p6);
        else
        break; 
            
                    
    }
    
                      
}
    
cadastrar(){
        
    printf("Escolha a posição a adicionar: "); 
    scanf("%d", &altura.id);
    printf("Digite o nome: ");
    scanf("%s", &altura.nome); 
    printf("Digite o email: ");
    scanf("%s", &altura.email);
    printf("Digite o altura: ");
    scanf("%.2f", &altura.altura);
    printf("Digite o peso: ");
    scanf("%.2f", &altura.peso);    
     
    
    imc();
    
    
}

listar()
{
    for (i = 0; i < MAX; i++){
                
        printf("%d: %s - %s - %.2f - %.2f\n", i, altura.nome, altura.email, altura.altura, altura.peso);     
    }     
    
}

apagar()
{
    int id; 
    listar(); 
    printf("\n Digite a id do aluno a ser removido: ");
    scanf("%d", id); 
    --id;
    altura.id=0; 
     
        
    
}

listarimc() 
{
    for (i = 0; i < MAX; i++){
                
        printf("%s: - %.2f - %.2f - %.2f\n", altura.nome, altura.peso, altura.imc, altura.resposta);     
    }     
    
}

menu()    
{
    do {
        
        
        printf("+-----------------------------------+\n"); 
        printf("         ACADEMIA ALUNOS             \n"); 
        printf("+---------------------------------+\n\n"); 
        printf("--     Escolha uma opção:          --\n"); 
        printf("-  1 - Cadastrar Aluno              -\n"); 
        printf("-  2 - Lista Alunos                 -\n"); 
        printf("-  3 - Apagar Alunos                -\n"); 
        printf("-  4 - Listar INC dos Alunos        -\n"); 
        printf("-  5 - Sair                         -\n");
        printf("+--------------------------------+\n\n" );  
        scanf("%d", &opcao); 
        
        switch(opcao){
            case 1:
                cadastrar();
            break;
            case 2: // pesquisa
                listar();
                                        
                break;
            case 3:
                apagar(); 
                break;
            case 4: // pesquisa    
                listarimc();
                break;                
            case 5:
                exit(0);
                //return 0;
                break; 
            default:
                printf("Opção invalida! \n");
                break;
        }    
        
            printf("Aperte uma tecla para continuar"); 
            
     
    } while (1 == 1); 
    return 0;
}

     
    // menu da academia
    


int main()
{
    setlocale(LC_ALL, "Portuguese"); 
    menu(); 
    return 0;
}

 

1_2_academia.rar

Link para o comentário
Compartilhar em outros sites

@souzaoe Olá. Esse 'problema' é bastante comum em C. Por isso q gosto do C. Ele não esconde nada do programador.

Uma das formas de contornar esse 'problema' é fazer uso de uma função q vou postar abaixo. Use ela após cada scanf em seu código. Ela serve p limpar o stdin, ou buffer de entrada, se preferir:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

Exemplo do uso dessa função no seu código:

 

printf("Escolha a posição a adicionar: ");
scanf("%d", &altura.id);
limpa_linha();

printf("Digite o nome: ");
scanf("%s", &altura.nome);
limpa_linha();

printf("Digite o email: ");
scanf("%s", &altura.email);
limpa_linha();

printf("Digite o altura: ");
scanf("%f", &altura.altura);
limpa_linha();

printf("Digite o peso: ");
scanf("%f", &altura.peso);
limpa_linha();

Outra função q tem a mesma finalidade e que foi criada por um colega aqui do fórum:

int fflush_stdin() {
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

Ela pode ser usada do mesmo modo q a função limpa_linha

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @souzaoe.

 

Recomendo revisar o código, pois existe toda uma cadeia de evolução. Primeiro é necessário deixar a estrutura melhor organizada.

 

Basicamente seria necessário primeiro reorganizar os cadastros... fazer testes... só a partir daí ir implementando as próximas etapas.

 

 

 

Alguns pontos:

 

1#

Seu código está em C puro, e não em C++. Apesar do código em C compilar em C++, eu sugiro OU você programa em C, OU programa em C++. Seu código está 100% em C, logo, faria faz sentido "estudar C".

 

Para simplificar, em vez de 1_2_academia.cpp use 1_2_academia.c.

 

Quando for programar em C++ "de verdade", ai "converteria para sintaxe correspondente"...

 

 

 

2#

Essa opção é mais facultativa, apesar de recomendada...

Melhor desativar a tabulação do editor de texto, ou seja, ao pressionar tab, fazer inserir espaços, no lugar da tabulação.

 

 

 

3#

Sobre:

57 minutos atrás, souzaoe disse:

struct cadastro {
    char nome[30];
    char email[30];
    char resposta[20];
    float peso;
    float altura;
    float imc;
    int id;
};

 

Por enquanto só um detalhe: o IMC é um cálculo, na minha interpretação, não faz parte do cadastro, ou seja, quando precisar desse dado, fará a conta. Resumindo: tiraria da struct.

 

 

 

4#

Sobre:

1 hora atrás, souzaoe disse:

struct cadastro altura[MAX];

 

Essa label altura não faz sentido. No programa está cadastrando o quê? não são alunos? então ficaria melhor usar algo como alunos[].

struct cadastro alunos[MAX];

Ou ainda:

//DADOS DO ALUNO
struct Aluno {
    char  nome[30]; 
    char  email[30];
    char  resposta[20];
    float peso; 
    float altura; 
    float imc;
    int   id;	
};

...

struct Aluno alunos[MAX];

 

 

 

5#

Sobre:

1 hora atrás, souzaoe disse:

cadastrar() {
    printf("Escolha a posição a adicionar: "); 
    scanf("%d", &altura[i].id);
    printf("Digite o nome: ");
    scanf("%s", &altura[i].nome); 
    printf("Digite o email: ");
    scanf("%s", &altura[i].email);
    printf("Digite o altura: ");
    scanf("%.2f", &altura[i].altura);
    printf("Digite o peso: ");
    scanf("%.2f", &altura[i].peso);	
    imc();
}

 

Como assim "posição a adicionar"? percebe que está jogando esse dado no ID do aluno. Aí teria que especificar melhor o que significa esse ID, mas provavelmente não tem relação como "posição". ID geralmente se refere a "identificação".. como o número de matrícula..

 

obs.: em relação as sugestões, seria alunos[ i] em vez de altura[].

 

 

***

 

Por ai vai.

 

Aí fica a seu critério o que poderia implementar ou não.

 

No aguardo.

 

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

  • Membro VIP

Sobre:

3 minutos atrás, giu_d disse:

@Simon Viegas Olá. Desculpa! Não tinha visto que o tópico era referente ao C++, devido a isso passei o código em C também

 

O código está em C mesmo, então está valendo. :)
 

adicionado 4 minutos depois

@giu_d, em relação a "esse bug do scanf()", para o C++ mudaria alguma coisa?

Link para o comentário
Compartilhar em outros sites

muito obrigado a todos, é mais ou menos isso mesmo, que os senhores e senhoras estão falando, desculpe-me a ignorância iniciando agora, no entanto, estou trabalhando mesmo em c, no caso não pode ser cadastro pois o problema pede altura, eu também pensei nesse caso na definição do vetor, mais pedia para fazer um vetor em altura e não em cadastro, fico grato pela atenção e vou verificar tudo que me informaram. 

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

  • Membro VIP
2 minutos atrás, giu_d disse:

@Simon Viegas

 

Sim. Com o uso da função get ou ignore já resolveria:


cin.get();
// ou
cin.ignore();

 

Entendi... mas ai seria em C++... me refiro utilizando o scanf() no C++.

adicionado 1 minuto depois
agora, souzaoe disse:

muito obrigado a todos, é mais ou menos isso mesmo, que os senhores e senhoras estão falando, desculpe-me a ignorância iniciando agora, no entanto, estou trabalhando mesmo em c, no caso não pode ser cadastro pois o problema pede altura, eu também pensei nesse caso na definição do vetor, mais pedia para fazer um vetor em altura e não em cadastro, fico grato pela atenção e vou verificar tudo que me informaram. 

 

Beleza. Tente fazer as alterações e poste o código aqui para analisarmos... se tiver dúvidas, só indicar onde.

Link para o comentário
Compartilhar em outros sites

desculpe-me senhoras e senhores, é que a mais de 10 anos estou afastado da tecnologia de informação, só no ramo do direito, mais voltei agora para terminar minha primeira faculdade que na época era tecnologia de dados, então estou em duas de engenharia de computação e engenharia de software, ai to com prova nesta quarta feira de geometria, e tenho este trabalho para entregar ate dia 22, já fiz boa parte, no entanto na epoca que estudei era pascal o mais usado em Belém, por incrivel que parece. Fico grato pelas orientações, pois ainda não tenho as manhas do C espero chegar a esta altura 

Link para o comentário
Compartilhar em outros sites

@Simon Viegas

14 minutos atrás, Simon Viegas disse:

Entendi... mas ai seria em C++... me refiro utilizando o scanf() no C++

Mas aí entra a questão de MIX de C com C++.

 

As funções funcionariam do mesmo modo. Mas no C++ também tem

16 minutos atrás, giu_d disse:

"esse bug do scanf()",

 

Só q no C++ ocorre esse "bug" com o uso dos comandos cin ou getline

 

Interessante o termo usado acima!

Link para o comentário
Compartilhar em outros sites

@souzaoe Nós não usamos "fflush(stdin);" pois:

 

Em 30/05/2018 às 17:45, isrnick disse:

A função fflush é para streams de saída apenas, e tem comportamento indefinido para streams de entrada (como o stdin), coincidentemente ela funciona para limpar o stdin em alguns compiladores, mas como o comportamento é indefinido pode não funcionar da mesma maneira em outros compiladores, por isso não é recomendado usar com stdin.

 

Citação

"For input streams (and for update streams on which the last operation was input), the behavior is undefined."
  
"Para streams de entrada (e para streams de atualização cuja última operação foi uma entrada), o comportamento é indefinido."

Fonte: http://en.cppreference.com/w/c/io/fflush

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, giu_d disse:

@isrnick E o q você diz do comando setbuf(stdin, NULL); ? Está me parecendo interessante usar esse comando

 

Pelo que eu li sobre essa função isso me parece uma péssima ideia... :lol:

 

Veja:

 

Citação

void setbuf( FILE *restrict stream, char *restrict buffer );

"If buffer is null, equivalent to setvbuf(stream, NULL, _IONBF, 0), which turns off buffering."

"Se buffer é null, é equivalente a setvbuf(stream, NULL, _IONBF, 0), o qual desliga/desabilita buffering."

Fonte: http://en.cppreference.com/w/c/io/setbuf

 

Então usar isso simplesmente desabilita o buffer no stdin...

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...