Erro no codigo [RESOLVIDO]

1. Erro no codigo [RESOLVIDO]

Vinicius
vitnick

(usa Ubuntu)

Enviado em 06/03/2013 - 14:19h

O codigo "decompõe" uma quantidade de dinheiro em cedulas e moedas. Acontece que quando ele precisa de uma moeda de 10 centavos ou de 5 ou de 1, o programa trava. Nao consegui achar nenhum erro. Segue o codigo:




#include <stdio.h>

int main(){
float umcent = 0, cincocent = 0, dezcent = 0, vintecincocent = 0, cinquentacent = 0, um = 0, dois = 0, cinco = 0, dez = 0, vinte = 0, cinquenta = 0, cem = 0, N = 0, N2 = 0;
scanf("%f", &N);
N2 = N;
while(N2 > 0.00){
if(N2 >= 100){
cem++;
N2 = N2 - 100;
}

if(N2 >= 50 && N2 < 100){
cinquenta++;
N2 = N2 - 50;
}

if(N2 >= 20 && N2 < 50){
vinte++;
N2 = N2 - 20;
}

if(N2 >= 10 && N2 < 20){
dez++;
N2 = N2 - 10;
}

if(N2 >=5 && N2 < 10){
cinco++;
N2 = N2 - 5;
}

if(N2 >= 2 && N2 < 5){
dois++;
N2 = N2 - 2;
}

if(N2 >= 1 && N2 < 2){
um++;
N2 = N2 - 1;
}

if(N2 >= 0.50 && N2 < 1){
++cinquentacent;
N2 = N2 - 0.50;
}

if(N2 >= 0.25 && N2 < 0.50){
++vintecincocent;
N2 = N2 - 0.25;
}

if(N2 >= 0.10 && N2 < 0.25){
++dezcent;
N2 = N2 - 0.10;
}

if(N2 >= 0.05 && N2 < 0.10){
++cincocent;
N2 = N2 - 0.05;
}

if(N2 >= 0.01 && N2 < 0.05){
++umcent;
N2 = N2 - 0.01;
}


} //Fim do while

printf("NOTAS:\n");
printf("%.0f nota(s) de R$ 100.00\n", cem);
printf("%.0f nota(s) de R$ 50.00\n", cinquenta);
printf("%.0f nota(s) de R$ 20.00\n", vinte);
printf("%.0f nota(s) de R$ 10.00\n", dez);
printf("%.0f nota(s) de R$ 5.00\n", cinco);
printf("%.0f nota(s) de R$ 2.00\n", dois);
printf("MOEDAS:\n");
printf("%.0f moeda(s) de R$ 1.00\n", um);
printf("%.0f moeda(s) de R$ 0.50\n", cinquentacent);
printf("%.0f moeda(s) de R$ 0.25\n", vintecincocent);
printf("%.0f moeda(s) de R$ 0.10\n", dezcent);
printf("%.0f moeda(s) de R$ 0.05\n", cincocent);
printf("%.0f moeda(s) de R$ 0.01\n", umcent);


}



  


2. Re: Erro no codigo [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 06/03/2013 - 15:51h

O primeiro erro é colocar esse monte de if's. Desse jeito mesmo com apenas 4 centavos, o programa vai rodar todas as opções, gerando perda de despenho e desperdício de memória.

A melhor forma de fazer essa decomposição é dividindo os valores até que chegue nos centavos, mas obtendo resultados inteiros. Tipo:


N2 = 253,43
cem = (int) N2/100
N2 = N2-(centena*100)
cinquenta = (int) N2/50
N2 = N2-(cinquenta*50)
vinteecinco = (int) N2/25
N2 = N2-(vinteecinco*25)
dez = (int) N2/10
N2 = N2-(dez*10)
...


E assim até o final. Mas deve colocar uma condição para que, por exemplo, se não precisar de notas de dez, o programa não executar o trecho. Tipo:

if(N2>25){
vinteecinco = (int) N2/25
N2 = N2-(vinteecinco*25)
}
else if(N2>10){
dez = (int) N2/10
N2 = N2-(dez*10)
}



3. Re: Erro no codigo [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 06/03/2013 - 16:06h

Outra coisa também é que só a quantia financeira precisa ser float.
A quantidade de notas deve ser int.

Outra coisa, por exemplo, em C se você pegar um float com o valor 100.02 e dar um printf você vai ver algo como 100.019997, e daí na sua conta vai ficar às vezes faltando uma moeda de um centavo.

Tipo aquelas lojas que pra não colocar o preço de dois reais colocam 1,99 kkkk


Adaptando o seu código (mantendo a idéia dos ifs) eu fiz assim e funcionou:



#include <stdio.h>
/* Este programa decompõe uma
quantia financeira e separa nas maiores
unidades monetárias disponíveis*/
int main()
{
float N1, N2;
int cem=0,
cinq=0,
vint=0,
dez=0,
cinc=0,
dois=0,
um=0,
cinqcent=0,
vintcinccent=0,
dezcent=0,
cincocent=0,
umcent=0;
printf("Este programa divide uma quantia financeira, \npriorizando as maiores notas disponíveis.\nDigite a quantia: R$");
scanf("%f", &N1);
N2=N1;

while(N2>0)
{
if(N2>=100){
cem++;
N2=N2-100.00;
}

else if(N2>=50 && N2<100){
cinq++;
N2=N2-50.00;
}

else if(N2>=20 && N2<50){
vint++;
N2=N2-20.00;
}

else if(N2>=10 && N2<20){
dez++;
N2=N2-10.00;
}

else if(N2>=5 && N2<10){
cinc++;
N2=N2-5.00;
}

else if(N2>=2 && N2<5){
dois++;
N2=N2-2.00;
}

else if(N2>=1 && N2<2){
um++;
N2=N2-1.00;
}

else if(N2>=0.50 && N2<1){
cinqcent++;
N2=N2-0.50;
}

else if(N2>=0.25 && N2<0.50){
vintcinccent++;
N2=N2-0.25;
}

else if(N2>=0.10 && N2<0.25){
dezcent++;
N2=N2-0.10;
}

else if(N2>=0.050 && N2<0.10){
cincocent++;
N2=N2-0.050;
}

else if(N2>=0.099){
umcent++;
N2=N2-0.0099;
}
else
break;
} //Fim do while

printf("\nQuantia inicial: %.2f\n\n", N1);
printf("\tNOTAS:\n");
printf("%d notas de cem reais\n", cem);
printf("%d notas de cinquenta reais\n", cinq);
printf("%d notas de vinte reais\n", vint);
printf("%d notas de dez reais\n", dez);
printf("%d notas de cinco reais\n", cinc);
printf("%d notas de dois reais\n\n", dois);
printf("\tMOEDAS:\n");
printf("%d moedas de um real\n", um);
printf("%d moedas de cinquenta centavos\n", cinqcent);
printf("%d moedas de vinte e cinco centavos\n", vintcinccent);
printf("%d moedas de dez centavos\n", dezcent);
printf("%d moedas de cinco centavos\n", cincocent);
printf("%d moedas de um centavo\n", umcent);
}






4. Re: Erro no codigo [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 06/03/2013 - 16:13h

rei_astro escreveu:

O primeiro erro é colocar esse monte de if's. Desse jeito mesmo com apenas 4 centavos, o programa vai rodar todas as opções, gerando perda de despenho e desperdício de memória.

A melhor forma de fazer essa decomposição é dividindo os valores até que chegue nos centavos, mas obtendo resultados inteiros. Tipo:


N2 = 253,43
cem = (int) N2/100
N2 = N2-(centena*100)
cinquenta = (int) N2/50
N2 = N2-(cinquenta*50)
vinteecinco = (int) N2/25
N2 = N2-(vinteecinco*25)
dez = (int) N2/10
N2 = N2-(dez*10)
...


E assim até o final. Mas deve colocar uma condição para que, por exemplo, se não precisar de notas de dez, o programa não executar o trecho. Tipo:

if(N2>25){
vinteecinco = (int) N2/25
N2 = N2-(vinteecinco*25)
}
else if(N2>10){
dez = (int) N2/10
N2 = N2-(dez*10)
}


Mas, no caso, como a quantidade de notas ou moedas não precisam ser float, como escreveu o colega, não precisa do (int), ele já converte para inteiro implicitamente.



5. Re: Erro no codigo [RESOLVIDO]

Vinicius
vitnick

(usa Ubuntu)

Enviado em 06/03/2013 - 18:06h

Entendi galera. Valeu ae pra quem ajudou. Acho que é melhor eu refazer do jeito que o rei_astro falou. Estou começando em programação agora. É bom que eu ja começo sem manias que podem me atrapalhar la na frente. Obrigado ae. Vou marcar como resolvido. Caso apareça mais alguma duvida eu posto outra pergunta.
Valeu mesmo!


6. Re: Erro no codigo [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 06/03/2013 - 21:22h

rei_astro escreveu:
E assim até o final. Mas deve colocar uma condição para que, por exemplo, se não precisar de notas de dez, o programa não executar o trecho. Tipo:

if(N2>25){
vinteecinco = (int) N2/25
N2 = N2-(vinteecinco*25)
}
else if(N2>10){
dez = (int) N2/10
N2 = N2-(dez*10)
}


Eu testei aqui e não precisa desse if se você declarar as quantidades de notas como int.
Por exemplo digamos que N2=7
dez=N2/10;
N2=N2-(dez*10);

dez=7/10=0,7 e convertendo para int dez fica = 0
dessa forma
N2=N2-(0*10) então N2 fica igual antes sempre que a quantidade de notas for zero.

Testei com esse código aqui e deu certo:



#include <stdio.h>
/*outra maneira de dividir uma quantia monetária*/
float N1, N2;
int cem=0,
cinq=0,
vint=0,
dez=0,
cinc=0,
dois=0,
um=0,
cinqcent=0,
vintcinccent=0,
dezcent=0,
cincocent=0,
umcent=0;

void saida()
{
printf("\nQuantia inicial: R$%.2f\n\n", N1);
printf("\tNOTAS:\n");
printf("%d nota(s) de cem reais\n", cem);
printf("%d nota(s) de cinquenta reais\n", cinq);
printf("%d nota(s) de vinte reais\n", vint);
printf("%d nota(s) de dez reais\n", dez);
printf("%d nota(s) de cinco reais\n", cinc);
printf("%d nota(s) de dois reais\n\n", dois);
printf("\tMOEDAS:\n");
printf("%d moeda(s) de um real\n", um);
printf("%d moeda(s) de cinquenta centavos\n", cinqcent);
printf("%d moeda(s) de vinte e cinco centavos\n", vintcinccent);
printf("%d moeda(s) de dez centavos\n", dezcent);
printf("%d moeda(s) de cinco centavos\n", cincocent);
printf("%d moeda(s) de um centavo\n", umcent);
}

void moneycal()
{
cem=N2/100;
N2=N2-(cem*100);
cinq=N2/50;
N2=N2-(cinq*50);
vint=N2/20;
N2=N2-(vint*20);
dez=N2/10;
N2=N2-(dez*10);
cinc=N2/5;
N2=N2-(cinc*5);
dois=N2/2;
N2=N2-(dois*2);
um=N2;
N2=N2-um;
cinqcent=N2/0.500;
N2=N2-(cinqcent*0.500);
vintcinccent=N2/0.250;
N2=N2-(vintcinccent*0.250);
dezcent=N2/0.100;
N2=N2-(dezcent*0.100);
cincocent=N2/0.050;
N2=N2-(cincocent*0.050);
umcent=N2/0.00899;
}

int main()
{
system("clear||cls");
printf("Este programa divide uma quantia financeira, \npriorizando as maiores notas disponíveis.\nDigite a quantia: R$");
scanf("%f", &N1);
N2=N1;
moneycal();
saida();
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts