Jump to content

[RESOLVIDO] pequena duvida 1


msmsms
 Share

Recommended Posts

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)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

“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

Link to comment
Share on other sites

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 😕

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!

Link to comment
Share on other sites

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;
}
Link to comment
Share on other sites

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 😕

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.