msmsms Posted February 26, 2012 Report Share Posted February 26, 2012 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 More sharing options...
msousa7 Posted February 26, 2012 Report Share Posted February 26, 2012 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 Link to comment Share on other sites More sharing options...
mundo Posted February 26, 2012 Report Share Posted February 26, 2012 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 More sharing options...
msousa7 Posted February 26, 2012 Report Share Posted February 26, 2012 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 More sharing options...
KTachyon Posted February 26, 2012 Report Share Posted February 26, 2012 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 More sharing options...
pmg Posted February 26, 2012 Report Share Posted February 26, 2012 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 More sharing options...
msmsms Posted February 26, 2012 Author Report Share Posted February 26, 2012 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 More sharing options...
mundo Posted February 26, 2012 Report Share Posted February 26, 2012 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 More sharing options...
Flinger Posted February 27, 2012 Report Share Posted February 27, 2012 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now