Ir para o conteúdo
msmsms

[RESOLVIDO] pequena duvida 1

Mensagens Recomendadas

msmsms

tenho o seguinte programa que deixo em baixo

é um programa simples que faz apenas 2 pedidos ao utilizador

esses pedidos são numeros do tipo float

acontece o seguinte:

quando abre a consola e eu como utilizador coloco um numero inteiro para o peso do joao por exemplo 70

o programa vai continuar e pedir o peso do pedro

mas se eu colocar que o peso do joao é um numero float 70.2 o programa termina e não me permite colocar o peso do pedro...

alguem me consegue dizer porque que isto acontece?

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

int main()
{
    float peso_joao;
    float peso_pedro;

    /*pedidos ao utilizador*/
    printf ("qual e o peso do joao? \n");
    scanf ("%d", &peso_joao);
    printf ("qual e o peso do pedro? \n");
    scanf ("%d", &peso_pedro);
}

Edit: adicionada a linguagem à tag de código (pmg)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msousa7

Boas Caro Amigo,

Você esta a ler as variaveis como se elas fossem inteiras.

tem de mudar o %d para %f, nos seus dois scanf's.

%d - Inteiros

%f - Flutuantes

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mundo

Tens que colocar uma condição de verificação, ou seja um if, é uma das opções, podes optar por ciclos tambem.

Boas Caro Amigo,

Você esta a ler as variaveis como se elas fossem inteiras.

tem de mudar o %d para %f, nos seus dois scanf's.

%d - Inteiros

%f - Flutuantes

msousa7 para o caso dele não se trata bem disso, o que lhe falta e as condiçoes de verificação de introduçao de dados

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msousa7

Tens que colocar uma condição de verificação, ou seja um if, é uma das opções, podes optar por ciclos tambem.

msousa7 para o caso dele não se trata bem disso, o que lhe falta e as condiçoes de verificação de introduçao de dados

Aconselho-te a releres a questão que msmsms fez.

Tente fazer exactamente o que o msmsms fez. executar o programa e ver quais os seus resultados.

A minha resposta está correctissima, pois o msmsms declarou as variáveis flutuantes mas esta a lelas como inteiras, logo ele ao executar o programa e inserir um numero decimal é MAIS que óbvio que o programa crasha e termina.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

O programa termina. Se lhe colocares um print a seguir a pedires o peso do pedro vês que o programa continua. Está a dar erro na leitura do peso do pedro porque não estás a receber um valor flutuante, mas um valor inteiro:

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

int main()
{
    int peso_joao;
    int peso_pedro;

    /*pedidos ao utilizador*/
    printf ("qual e o peso do joao? \n");
    scanf ("%d", &peso_joao);
    printf ("qual e o peso do pedro? \n");
    scanf ("%d", &peso_pedro);
    
    printf ("R: %d %d\n", peso_joao, peso_pedro);
}

Output:

qual e o peso do joao?

70.2

qual e o peso do pedro?

R: 70 1693440984

Quando o programa acaba de ler o 70, continuam a existir valores no buffer de input, logo passam para o scanf() seguinte que não consegue interpretar como valor inteiro.

Ambas as respostas estão correctas, apenas muda o ponto de vista. :confused:


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Duas sugestões:

1) usa double quando precisares de números com virgula, excepto se tiveres uma forte razão para escolher outro tipo de dados. Atenção que para tipo double, o conversor a usar no scanf é "%lf".

2) verifica o valor devolvido pelo scanf. Esse valor é que indica se a função funcionou ou não.

Explicando a razão da sugestão 2)

Quando metes 70.2 para o peso do joao, o input fica a apontar para o ponto (que nao faz parte dum numero inteiro e, por isso, não foi "comido" para o peso do joao). Depois, ao ler o peso do pedro, o scanf depara-se logo com o ponto e não o pode meter na variável, e devolve 0 (zero) para indicar o erro

    if (scanf ("%d", &peso_joao) != 1) fprintf(stderr, "Erro na leitura do peso do joao.\n");
    printf ("qual e o peso do pedro?\n");
    if (scanf ("%d", &peso_pedro) != 1) fprintf(stderr, "Erro na leitura do peso do pedro.\n");

A solução do msousa7 é a correcta. Mas se à solução dele adicionares as minhas sugestões não perdes nada :confused:


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msmsms

de facto alterando %d para %f resolveu o meu problema

não conheço ainda todos os %...

parece importante...

obrigado pela resposta mais descomplicada msousa7

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

int main()
{
    float peso_joao;
    float peso_pedro;

    /*pedidos ao utilizador*/
    printf ("qual e o peso do joao? \n");
    scanf ("%f", &peso_joao);
    printf ("qual e o peso do pedro? \n");
    scanf ("%f", &peso_pedro);
    return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mundo

Duas sugestões:

1) usa double quando precisares de números com virgula, excepto se tiveres uma forte razão para escolher outro tipo de dados. Atenção que para tipo double, o conversor a usar no scanf é "%lf".

2) verifica o valor devolvido pelo scanf. Esse valor é que indica se a função funcionou ou não.

Explicando a razão da sugestão 2)

Quando metes 70.2 para o peso do joao, o input fica a apontar para o ponto (que nao faz parte dum numero inteiro e, por isso, não foi "comido" para o peso do joao). Depois, ao ler o peso do pedro, o scanf depara-se logo com o ponto e não o pode meter na variável, e devolve 0 (zero) para indicar o erro

    if (scanf ("%d", &peso_joao) != 1) fprintf(stderr, "Erro na leitura do peso do joao.\n");
    printf ("qual e o peso do pedro?\n");
    if (scanf ("%d", &peso_pedro) != 1) fprintf(stderr, "Erro na leitura do peso do pedro.\n");

A solução do msousa7 é a correcta. Mas se à solução dele adicionares as minhas sugestões não perdes nada :confused:

O que eu entendi que ele queria era mais algo parecido com isto,

Ou entao com validaçao para so aceitar valores com virgula flutuante, se interpretei mal o que ele escreveu explicitamente, peço desculpa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

de facto alterando %d para %f resolveu o meu problema

não conheço ainda todos os %...

parece importante...

obrigado pela resposta mais descomplicada msousa7

Embora a resposta mais simples te possa ter ajudado mais, por agora, não te fiques por aí. Se me permites o conselho, aproveita as respostas dos outros para aprender melhor como funciona o scanf:

man scanf

Tens aí os literais que o scanf aceita, bem como as conversões que podes fazer. Vê também como o valor retornado pelo scanf te pode ajudar a verificar se o valor que leste é o que querias (tal como o pmg e outros te sugeriram).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.