Ir ao conteúdo
  • Cadastre-se
Luis Cardozo

C algoritmo IMC Linguagem C

Recommended Posts

Pessoal boa noite....

estou desenvolvendo um código sobre imc...ele ainda vai fazer parte de uma coisa maior pois estou tentando resolver por partes....

Gostaria que me ajudassem...pois sou novo nessa parte e estou aprendendo...

o problema é que independente do valor que eu preencher, sempre a condição é a mesma...

 

Já peço desculpas desde já, mas como disse estou aprendendo e gostaria que me ajudassem com dicas....e onde eu deixei passar despercebido o erro.

 

segue o cód:

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

float peso, alt,imc;
  char nome, email;
int main()
{
    char nome, email;
    float peso, alt, imc;
  
     
     printf("digite um nome:\n");
        scanf("%s", &nome);
     printf("digite email:\n");
        scanf("%s", &email);
     printf("digite altura:\n");
        scanf("%f", &alt);
     printf("digite peso:\n");
        scanf("%f", &peso);
        
    imc=peso/(alt*alt);
        
        if(imc<18.5)
            {
            
            printf("\n %.2f", imc);
            printf("\nCondição: BAIXO PESO.");
            }
            else if(imc>18.5 || imc<25)
            {
                 printf("\n %.2f", imc);
                 printf("\nCondição:PESO IDEAL.");
                 
            }
             else if(imc>25 || imc<30)
            {
                    printf("\n %.2f", imc);
                    printf("\nCondição:SOBREPESO.");
            }
             else if(imc>30 || imc<35)
            {
                    printf("\n %.2f", imc);
                    printf("\nCondição: OBESIDADE GRAU 1.");
            }
             else if(imc>35 || imc<40)
            {
                    printf("\n %.2f", imc);
                    printf("\nCondição: OBESIDADE GRAU 2.");
            }
              else if(imc>40)
            {
                    printf("\n %.2f", imc);
                    printf("\nCondição: OBESIDADE GRAU 3.");
            }
        
     
    

    return 0;
}

 

imc.txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre:

1 hora atrás, Luis Cardozo disse:

if(imc>18.5 || imc<25)

 

Você está usando OU, ou seja, "maior que 18.5 ou menos que 25", mas o correto seria E. Acho que seria && no lugar do ||. O mesmo pro restante.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 horas atrás, Simon Viegas disse:

Sobre:

 

Você está usando OU, ou seja, "maior que 18.5 ou menos que 25", mas o correto seria E. Acho que seria && no lugar do ||. O mesmo pro restante.

Valeu obrigado.....

Agora se eu fosse encaixar parte desse código, em um maior( pois dividi o problema para facilitar), como e onde deveria colocar a parte desse código no outro, para listar o imc, seri ali onde comecei ???

Já tentei e sempre não retorna como quero...

e outro problema é que não posso colocar o nome com espaço, o cód já preenche no lular do email..

desde já agradeço...

abaixo o cód. principal....

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


struct Aluno
{
    char nome[30];
    char email[15];
    float peso;
    float alt;
    float imc;    
};

struct Aluno cad [20];

int main()
{
    setlocale(LC_ALL,"Portuguese");
    //DECLARANDO OUTRAS VARIAVEIS NECESSARIAS
    int op,i,f=0,s=0;
    char Cont[30];
    
    for (i = 1; i <= 21; i++)
    
    
    do{
    printf("\nCADASTRO ALUNO ACADEMIA\n");
    printf("1 - CADASTRAR ALUNO:\n");
    printf("2 - LISTAR ALUNO:\n");
    printf("3 - EXCLUIR ALUNO:\n");
    printf("4 - LISTAR IMC ALUNOS:\n");
    printf("0 - Sair\n");
    scanf("%d", & op);
    
    switch (op)
    {
        case 1:
            printf("ESCOLHA A POSIÇÃO DE 1 A 20 : ");
            scanf("%d", &i);
            if(i>=21)
            {
                printf("POSIÇÃO INVÁLIDA, ESCOLHA NOVAMENTE:\n");
                i=1;
            }
            else
            {
                printf("POSIÇÃO: %d\n",i);
                printf("DIGITE O NOME:\n");
                scanf("%s", cad.nome);
                printf("DIGITE O EMAIL:\n");
                scanf("%s", cad.email);
                printf("DIGITE O PESO(kg):\n");
                scanf("%f", & cad.peso);
                printf("DIGITE A ALTURA (m):\n");
                scanf("%f", & cad.alt);
                system("cls");
                printf("\n\nCADASTRADO COM SUCESSO!!\n\n");
                
            }
            break;
        case 2:
            for(i=1; i<21; i++)
            {
                printf("%d: %s, %s\n",i,cad.nome,cad.email);
            }
            break;
        
        case 3:
        printf("DIGITE O NÚMERO PARA EXCLUIR:\n");
        scanf("%d",& i);
            if (i>=1 || i <=21)
            {
                strcpy(cad.nome, ""); // aqui você está trabalhando com string
                strcpy(cad.email, "");
                cad.peso = 0;
                cad.alt = 0;
                cad.imc = 0;
                
                printf("\n\nEXCLUIDO COM SUCESSO!!\n\n");
            }
            else
            {
                printf("NÚMERO INVÁLIDO");
            }
            break;
        case 4:
            for(i=1; i<21; i++)
            {
                cad.imc=cad.peso/(cad.alt*cad.alt);
        
                if(cad.imc<18.5)
            {
                    printf("\n %d: ,%.2f", cad.nome,cad.imc);
                    printf(" Condição: BAIXO PESO.");
            }
            else if(cad.imc>18.5 && cad.imc<25)
            {
                    printf("\n %d: %.2f", cad.nome,cad.imc);
                    printf(" Condição:PESO IDEAL.");
                 
            }
             else if(cad.imc>25 && cad.imc<30)
            {
                    printf("\n %d: %.2f", cad.nome,cad.imc);
                    printf(" Condição:SOBREPESO.");
            }
             else if(cad.imc>30 && cad.imc<35)
            {
                    printf("\n %d: %.2f", cad.nome,cad.imc);
                    printf(" Condição: OBESIDADE GRAU 1.");
            }
             else if(cad.imc>35 && cad.imc<40)
            {
                    printf("\n %d: %.2f", cad.nome,cad.imc);
                    printf(" Condição: OBESIDADE GRAU 2.");
            }
              else if(cad.imc>=40)
            {
                    printf("\n %d: %.2f", cad.nome,cad.imc);
                    printf(" Condição: OBESIDADE GRAU 3.");
            }
        }
            break;
        case 0:exit(0);
            s = 1;
            break;
            default:
            printf("OPÇÃO INVÁLIDA!\n");
            system("cls");
            break;
            
    }
    
    }
    while (1 == 1);
    return (0);
} 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara eu não sei trabalhar com Struct, porém nesse programa principal já pede alguns dados, então tu poderia pedir os dados do IMC nele e colocar o "programa do IMC" como uma função que só calcula o IMC que recebe os dados da principal para calcular o IMC e retorna o valor do IMC e a condição do paciente, ao invés de uma parte do código que calcula e pede os dados. A sua Principal ficaria só para receber os dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, PédePano disse:

Cara eu não sei trabalhar com Struct, porém nesse programa principal já pede alguns dados, então tu poderia pedir os dados do IMC nele e colocar o "programa do IMC" como uma função que só calcula o IMC que recebe os dados da principal para calcular o IMC e retorna o valor do IMC e a condição do paciente, ao invés de uma parte do código que calcula e pede os dados. A sua Principal ficaria só para receber os dados.

Tentei como disse, mas o maximo que consegui foi como está o cód acima....mudei um pouco as coisas....mas não fui muito além...pois dentro dos case onde mostrar o imc ele não aparece como eu esperava....

tem como me ajudar???

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 horas atrás, Luis Cardozo disse:

Valeu obrigado.....

Agora se eu fosse encaixar parte desse código, em um maior( pois dividi o problema para facilitar), como e onde deveria colocar a parte desse código no outro, para listar o imc, seri ali onde comecei ???

Já tentei e sempre não retorna como quero...

e outro problema é que não posso colocar o nome com espaço, o cód já preenche no lular do email..

desde já agradeço...

abaixo o cód. principal....

 

Veja, o IMC é um cálculo e não deve ser armazenado como um atributo, ou seja remova da struct. Apenas na hora de imprimir, efetue o cálculo e use-o.

 

Sugeriria criar um método, algo como Calc_IMC() que recebe o peso e altura e retorna o resultado do IMC da pessoa. Ai, quando precisar calcular, usaria algo como IMC=Calc_IMC(peso,altura).

 

No aguardo.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, Simon Viegas disse:

 

Veja, o IMC é um cálculo e não deve ser armazenado como um atributo, ou seja remova da struct. Apenas na hora de imprimir, efetue o cálculo e use-o.

 

Sugeriria criar um método, algo como Calc_IMC() que recebe o peso e altura e retorna o resultado do IMC da pessoa. Ai, quando precisar calcular, usaria algo como IMC=Calc_IMC(peso,altura).

 

No aguardo.

Opa....valeu...OBRIGADO!!!!

um comentário positivo ajuda em muito abrir a mente da gente...., fiz como falou, mas levemente diferente e deu certo.....ta funcionando....

 

Somente estou com o problema de leitura do nome...que esta lendo somente o primeiro nome, se eu colocar ex: pedro, ele vai ler correto.....mas se eu colocar : pedro dos santos, ele já pula lá pra pedir o peso....

Tentei de outras formas como:

 

printf("POSIÇÃO: %d\n",i);
                printf("DIGITE O NOME:\n");
                fflush(stdin);
                scanf(" %14[^\n]s", cad.nome);

                fflush(stdin);

 

Mas dai acontece que quando vai para cadastrar e depois de escolher a posição, ele já pula direto pedindo o peso....

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@Luis Cardozo Olá. Esse 'erro' de pular para a linha seguinte é bastante comum em C e tbém muito perguntado aqui no fórum. A causa disso eu costumo chamar de "sujeira no buffer de entrada" ou "sujeira no stdin".

Sugiro uma das funções abaixo para contornar o problema:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}
void fflush_stdin() {
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF);
}

A forma de usar qualquer uma dessas funções seria assim:

 

printf("DIGITE O NOME:\n");
scanf("%40[^\n]s", cad.nome); // aqui seria 40 e não 14. O nome foi definido com tamanho de 40 posições
limpa_linha();

printf("DIGITE O EMAIL:\n");
scanf("%[^\n]s", cad.email);
limpa_linha();

// sequência do código

Basicamente é chamar uma dessas funções depois de cada scanf. Com isso você limpa o stdin e nenhuma 'sujeira' vai interferir nas leituras seguintes do código

Só não entendi por que você colocou o '%14[^\n]s'.  Esse '14' é a parte q não entendi. Dessa forma você está fazendo q apenas 14 caracteres da string sejam lidos pelo scanf. Mude o tamanho para 40 e resolve o problema

Vi q você usou o comando fflush(stdin);. Eu também usava até há poucos dias, mas me ensinaram aqui mesmo nesse fórum que ele não é recomendado para limpar o stdin, devido a isso deixei de usar e também não recomendo q você use. Qualquer dessas funções q passei é mais eficaz q esse comando.

Obs: Não fui eu q criei essas funções :)

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 19/06/2018 às 00:20, giu_d disse:

@Luis Cardozo Olá. Esse 'erro' de pular para a linha seguinte é bastante comum em C e tbém muito perguntado aqui no fórum. A causa disso eu costumo chamar de "sujeira no buffer de entrada" ou "sujeira no stdin".

Sugiro uma das funções abaixo para contornar o problema:


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

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

A forma de usar qualquer uma dessas funções seria assim:

 


printf("DIGITE O NOME:\n");
scanf("%40[^\n]s", cad.nome); // aqui seria 40 e não 14. O nome foi definido com tamanho de 40 posições
limpa_linha();

printf("DIGITE O EMAIL:\n");
scanf("%[^\n]s", cad.email);
limpa_linha();

// sequência do código

Basicamente é chamar uma dessas funções depois de cada scanf. Com isso você limpa o stdin e nenhuma 'sujeira' vai interferir nas leituras seguintes do código

Só não entendi por que você colocou o '%14[^\n]s'.  Esse '14' é a parte q não entendi. Dessa forma você está fazendo q apenas 14 caracteres da string sejam lidos pelo scanf. Mude o tamanho para 40 e resolve o problema

Vi q você usou o comando fflush(stdin);. Eu também usava até há poucos dias, mas me ensinaram aqui mesmo nesse fórum que ele não é recomendado para limpar o stdin, devido a isso deixei de usar e também não recomendo q você use. Qualquer dessas funções q passei é mais eficaz q esse comando.

Obs: Não fui eu q criei essas funções :)

 

Valeu e obrigado a todos....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×