GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

1. GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Dan
dan108

(usa Outra)

Enviado em 06/04/2016 - 14:22h

Galera estou precisando de uma mão e não consegui resolver!
Estou realizando um programa do site urionlinejudge, que solicita o seguinte:



Leia um valor de ponto flutuante com duas casas decimais. Este valor representa um valor monetário. A seguir, calcule o menor número de notas e moedas possíveis no qual o valor pode ser decomposto. As notas consideradas são de 100, 50, 20, 10, 5, 2. As moedas possíveis são de 1, 0.50, 0.25, 0.10, 0.05 e 0.01. A seguir mostre a relação de notas necessárias.

Entrada

O arquivo de entrada contém um valor de ponto flutuante N (0 ≤ N ≤ 1000000.00).

Saída

Imprima a quantidade mínima de notas e moedas necessárias para trocar o valor inicial, conforme exemplo fornecido.

https://www.urionlinejudge.com.br/judge/pt/problems/view/1021


Fiz o código dessa forma: (OBS: Sei que não é eficiente, porem, deveria resolver)

#include<stdio.h>
int main(int argc, char const *argv[])
{
int n100=0,n50=0,n20=0,n10=0,n5=0,n2=0,m1=0,m050=0,m025=0,m010=0,m005=0,m001=0;
double numero;
scanf("%lf\n\n",&numero);

while (numero >= 0.01)
{
while (numero >= 100.0)
{
numero -=100.0;
n100 +=1;
}
while (numero >= 50.0)
{
numero -=50.0;
n50 +=1;
}
while (numero >= 20.0)
{
numero -=20.0;
n20 +=1;
}
while (numero >= 10.0)
{
numero -=10.0;
n10 +=1;
}
while (numero >= 5.0)
{
numero -=5.0;
n5 +=1;
}
while (numero >= 2.0)
{
numero -=2.0;
n2 +=1;
}
while (numero >= 1.0)
{
numero -=1.0;
m1 +=1;
}
while (numero >= 0.50)
{
numero -= 0.50;
m050+=1;
}
while (numero >= 0.25)
{
numero -= 0.25;
m025+=1;
}
while (numero >= 0.10)
{
numero -= 0.10;
m010+=1;
}
while (numero >= 0.05)
{
numero -= 0.05;
m005+=1;
}
while (numero >= 0.01)
{
numero -= 0.01;
m001+=1;
}
}
printf("NOTAS:\n");
printf ("%i nota(s) de R$ 100.00\n",n100);
printf ("%i nota(s) de R$ 50.00\n",n50);
printf ("%i nota(s) de R$ 20.00\n",n20);
printf ("%i nota(s) de R$ 10.00\n",n10);
printf ("%i nota(s) de R$ 5.00\n",n5);
printf ("%i nota(s) de R$ 2.00\n",n2);
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n",m1);
printf("%d moeda(s) de R$ 0.50\n",m050);
printf("%d moeda(s) de R$ 0.25\n",m025);
printf("%d moeda(s) de R$ 0.10\n",m010);
printf("%d moeda(s) de R$ 0.05\n",m005);
printf("%d moeda(s) de R$ 0.01\n",m001);
printf("%lf\n",numero);
return 0;
}



esse
printf("%lf\n",numero);  
no fim é so pre mostrar se fica alguma coisa na variável que esta sendo decrementada. Ele mostra que tem 0.01 e não entra no
while (numero >= 0.01)  
. Outra coisa é que esta sendo solicitado a entrada de dados duas vezes quando rodo o programa.
Se alguém puder me dar essa mão ae eu agradeço muito


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/04/2016 - 13:22h

Veja o seguinte tópico para uma discussão já feita neste fórum sobre problema idêntico ao seu: https://www.vivaolinux.com.br/topico/C-C++/Duvida-iniciante-3.

3. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/04/2016 - 18:52h

O problema com a leitura se deve aos "\n" dentro da string de formatação de scanf(). Tire-os, que vai funcionar (mas leia também sobre o funcionamento da função, para entender o porquê de ser errado usá-los naquele ponto).


4. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Dan
dan108

(usa Outra)

Enviado em 07/04/2016 - 10:33h

paulo1205 escreveu:

O problema com a leitura se deve aos "\n" dentro da string de formatação de scanf(). Tire-os, que vai funcionar (mas leia também sobre o funcionamento da função, para entender o porquê de ser errado usá-los naquele ponto).


valeu cara! Era isso mesmo em relação a entrada de dados. Porem ainda continuo com o problema de valor incorreto no programa. Fiz algumas modificações mas ainda continua dando errado.


#include<stdio.h>
int main(int argc, char const *argv[])
{
int n100=0,n50=0,n20=0,n10=0,n5=0,n2=0,m1=0,m050=0,m025=0,m010=0,m005=0,m001=0;
float numero=0;

scanf("%f",&numero);
while (numero >= 100.0)
{
numero -=100.0;
n100 +=1;
}
while (numero >= 50.0)
{
numero -=50.0;
n50 +=1;
}
while (numero >= 20.0)
{
numero -=20.0;
n20 +=1;
}
while (numero >= 10.0)
{
numero -=10.0;
n10 +=1;
}
while (numero >= 5.0)
{
numero -=5.0;
n5 +=1;
}
while (numero >= 2.0)
{
numero -=2.0;
n2 +=1;
}
while (numero >= 1.0)
{
numero -=1.0;
m1 +=1;
}
while (numero >= 0.50)
{
numero -= 0.50;
m050+=1;
}
while (numero >= 0.25)
{
numero -= 0.25;
m025+=1;
}
while (numero >= 0.10)
{
numero -= 0.10;
m010+=1;
}
while (numero >= 0.05)
{
numero -= 0.05;
m005+=1;
}
while (numero >= 0.01)
{
numero -= 0.01;
m001+=1;
}
printf("NOTAS:\n");
printf ("%i nota(s) de R$ 100.00\n",n100);
printf ("%i nota(s) de R$ 50.00\n",n50);
printf ("%i nota(s) de R$ 20.00\n",n20);
printf ("%i nota(s) de R$ 10.00\n",n10);
printf ("%i nota(s) de R$ 5.00\n",n5);
printf ("%i nota(s) de R$ 2.00\n",n2);
printf("MOEDAS:\n");
printf("%d moeda(s) de R$ 1.00\n",m1);
printf("%d moeda(s) de R$ 0.50\n",m050);
printf("%d moeda(s) de R$ 0.25\n",m025);
printf("%d moeda(s) de R$ 0.10\n",m010);
printf("%d moeda(s) de R$ 0.05\n",m005);
printf("%d moeda(s) de R$ 0.01\n",m001);
printf("%f\n",numero);

return 0;
}


A saída


0.02
NOTAS:
0 nota(s) de R$ 100.00
0 nota(s) de R$ 50.00
0 nota(s) de R$ 20.00
0 nota(s) de R$ 10.00
0 nota(s) de R$ 5.00
0 nota(s) de R$ 2.00
MOEDAS:
0 moeda(s) de R$ 1.00
0 moeda(s) de R$ 0.50
0 moeda(s) de R$ 0.25
0 moeda(s) de R$ 0.10
0 moeda(s) de R$ 0.05
1 moeda(s) de R$ 0.01
0.010000


Repare que a variável que esta armazenando o numero que vai ser decrementado inda esta com valor no fim de 0.010000 e não entra no ultimo while.



5. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Dan
dan108

(usa Outra)

Enviado em 09/04/2016 - 09:44h

Valeu ae mano. Acabei nem conseguindo mas deixa queto.


6. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

zOpek
zOpek

(usa Outra)

Enviado em 12/04/2016 - 22:21h

Você esqueceu do bloco que engloba tudo isso;

While (numero) ou While (numero!=0) {

Todos os while's aqui;

}

Todos os Printf aqui;



7. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Dan
dan108

(usa Outra)

Enviado em 12/04/2016 - 22:38h

zOpek escreveu:

Você esqueceu do bloco que engloba tudo isso;

While (numero) ou While (numero!=0) {

Todos os while's aqui;

}

Todos os Printf aqui;


Não entendi muito bem irmão. Como assim? Como isso poderia afetar na variável que esta sendo atribuída ao valor que o usuário coloca e esta esta sendo decrementada nos while's e no fim, no ultimo print, ela ainda consta como valor 0.01 e não entra no while correspondente ?




8. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Dan
dan108

(usa Outra)

Enviado em 13/04/2016 - 01:49h

ENS escreveu:

Boa noite!

O problema é que o número inserido é transformado em binário e com isso perde na conversão o valor inicial.

Mas se no código houve algumas verificações pode-se atingir o resultado esperado.

Abaixo está o seu código revisado, veja se atende.


Valeu pela resposta. Não sabia que acontecia esse tipo de problemas em C. Mas muito obrigado pela dica.




9. Re: GCC solicita duas vezes a entrada de dados para o SCANF [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/04/2016 - 02:04h

É... Não dá mesmo para ter muita esperança.

Tem gente que gasta um tempão tentando ajudar os outros a entender conceitos e a estimulá-los a pensar com a própria cabeça par fazer seus próprios trabalhos.

E tem quase sempre um ou outro pelego rasteiro que estraga tudo dando resposta pronta, para que o outro aluno não tenha trabalho de pensar. E, se bobear, o destruidor ainda acaba levando o crédito de “melhor resposta”.


10. GCC solicita duas vezes a entrada de dados para o SCANF

ENS
ENS

(usa Manjaro Linux)

Enviado em 13/04/2016 - 02:12h

paulo1205 escreveu:

É... Não dá mesmo para ter muita esperança.

Tem gente que gasta um tempão tentando ajudar os outros a entender conceitos e a estimulá-los a pensar com a própria cabeça par fazer seus próprios trabalhos.

E tem quase sempre um ou outro pelego rasteiro que estraga tudo dando resposta pronta, para que o outro aluno não tenha trabalho de pensar. E, se bobear, o destruidor ainda acaba levando o crédito de “melhor resposta”.


Boa noite Paulo!

Desculpe-me por atrapalhar seu auxilio ao rapaz, não costumo dar o trabalho pronto, mas como era algo simples não achei mal algum.

Em outros tópicos que esteja conduzindo o auxílio não irei atrapalhar novamente.

Abs

-----------------------------------------------------------------------------------------------------------------
Feitiço do tempo:
O amanhã nunca chegará.


11. Re: GCC solicita duas vezes a entrada de dados para o SCANF

Dan
dan108

(usa Outra)

Enviado em 13/04/2016 - 02:31h

paulo1205 escreveu:

É... Não dá mesmo para ter muita esperança.

Tem gente que gasta um tempão tentando ajudar os outros a entender conceitos e a estimulá-los a pensar com a própria cabeça par fazer seus próprios trabalhos.

E tem quase sempre um ou outro pelego rasteiro que estraga tudo dando resposta pronta, para que o outro aluno não tenha trabalho de pensar. E, se bobear, o destruidor ainda acaba levando o crédito de “melhor resposta”.


Juro que ates de perguntar aqui já havia pesquisado em outros lugares. Como não achei respos, mandei um email para meu professor de programação da faculdade para perguntar oque havia de errado. Ele acabou não me respondendo e não tive outra escolha. Já venho acompanhando o fórum a muito tempo e já presenciei algumas brigas pelo fato de pessoas darem resposta diretas acostumando os inscientes, principalmente de linux, a acharem sempre respostas prontas e não pesquisarem. Eu sou contra também mas isso era uma dúvida fácil e boba. Além disso já programo em python e esse tipo de coisa não acontece "lá". Isso me intrigou mais ainda.

Desculpe pelo ocorrido.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts