elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas con el vuelto en monedas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con el vuelto en monedas  (Leído 7,019 veces)
adripillo14

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Problemas con el vuelto en monedas
« en: 5 Noviembre 2012, 17:15 pm »

Hola, mi profesor a dado para realizar 1 problema de las monedas pero cambio algunas cosas, por ejemplo las cantidades de monedas aceptables son 0.25, 0.10, 0.05, 0.01. Tengo que descomponer el billete en esa cantidad y decir cuantas monedas son en total con un plus si quiero de cuanta cantidad de cada una.
Bueno, mi programa casi funciona bien, con enteros anda perfecto, con decimales anda mas o menos, por ejemplo con 1.5 anda bien tambien, pero si ingreso 1.4 o algun otro valor no sale nunca. Les muestro el codigo a ver si me pueden ayudar por favor.

Código:
int main(){

float cantidad;
float canta = 0;
float cante = 0;
float canti = 0;
int e = 0;
int f = 0;
int g = 0;
int h = 0;
cout << "escribe la cantidad" << endl;
cin >> cantidad;
while(cantidad != 0)
{
   if(cantidad >=0.25){
   cantidad -= 0.25;
   e++;
   }
else if(cantidad >=0.10){
     cantidad -= 0.10;
     f++;
    }
else if(cantidad >=0.05){
     cantidad -= 0.05;
     g++;
    }
else if(cantidad >=0.01){
     cantidad -= 0.01;
     h++;
    }
//cout << "de 0.25 = " << e << endl;
//cout << "de 0.10 = " << f << endl;
//cout << "de 0.5 = " << g << endl;
//cout << "de 0.1 = " << h << endl;

}

cout << "de 0.25 = " << e << endl;
cout << "de 0.10 = " << f << endl;
cout << "de 0.5 = " << g << endl;
cout << "de 0.1 = " << h << endl;

getch();
}

Veran que dentro de "while" hay comentadas unas lineas, las puse para probrar, el tema es que si las descomento el programa me dice exactamente las monedas, o sea funciona bien. El problema es que no para nunca, repite el resultado todo el tiempo.
Por esta misma razon es que estando como esta con el cout afuera del while funciona con numeros enteros y con algunos decimales nada mas.
Muchas gracias por su tiempo.


En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #1 en: 5 Noviembre 2012, 17:36 pm »

No he leído mucho pero el error creo que está aquí:

Código
  1. while(cantidad != 0)

Cantidad debe ser mayor o igual a 0. Nunca vas a tener cantidades negativas.

Como tú dices, si tienes 1.4 y vas restando .25, llegará un momento que saltes de un valor > 0 a otro valor < 0 entonces nunca será igual a 0 y el bucle se hará infinito.

Por tanto:

Código
  1. while(cantidad > 0)

Edito: debe ser mayor que 0 para que no se haga ciclo infinito.


« Última modificación: 5 Noviembre 2012, 19:10 pm por BatchianoISpyxolo » En línea

Puede que desees aprender a programar desde 0: www.espascal.es
adripillo14

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #2 en: 5 Noviembre 2012, 17:49 pm »

No he leído mucho pero el error creo que está aquí:

Código
  1. while(cantidad != 0)

Cantidad debe ser mayor o igual a 0. Nunca vas a tener cantidades negativas.

Como tú dices, si tienes 1.4 y vas restando .25, llegará un momento que saltes de un valor > 0 a otro valor < 0 entonces nunca será igual a 0 y el bucle se hará infinito.

Por tanto:

Código
  1. while(cantidad >= 0)

Gracias por responderme pero tampoco funciona asi.
En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #3 en: 5 Noviembre 2012, 19:08 pm »

No funciona por la precisión. :[

Siempre testea el valor de las variables así sabrás que pasa. O a couts o con gdb (por ejemplo)...

La solución está en que si tienes una cantidad inferior a .01 salgas del bucle.. O sea lo puedes hacer así:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8. float cantidad;
  9. float canta = 0;
  10. float cante = 0;
  11. float canti = 0;
  12. int e = 0;
  13. int f = 0;
  14. int g = 0;
  15. int h = 0;
  16. cout << "escribe la cantidad" << endl;
  17. cin >> cantidad;
  18. while(cantidad > 0)
  19. {
  20.    if(cantidad >= 0.25){
  21.        cantidad -= 0.25;
  22.        e++;
  23.    }
  24. else if(cantidad >= 0.10){
  25.     cantidad -= 0.10;
  26.     f++;
  27.    }
  28. else if(cantidad >= 0.05){
  29.     cantidad -= 0.05;
  30.     g++;
  31.    }
  32. else if(cantidad >= 0.01){
  33.     cantidad -= 0.01;
  34.     h++;
  35.    }
  36. else {
  37.    cantidad = -1;
  38.    h++;
  39.    }
  40. }
  41.  
  42. cout << "de 0.25 = " << e << endl;
  43. cout << "de 0.10 = " << f << endl;
  44. cout << "de 0.05 = " << g << endl;
  45. cout << "de 0.01 = " << h << endl;
  46. }
  47.  

¿

float canta = 0;
float cante = 0;
float canti = 0;

?
« Última modificación: 5 Noviembre 2012, 19:39 pm por BatchianoISpyxolo » En línea

Puede que desees aprender a programar desde 0: www.espascal.es
adripillo14

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #4 en: 5 Noviembre 2012, 19:34 pm »

No funciona por la precisión. :[

Siempre testea el valor de las variables así sabrás que pasa. O a couts o con gdb (por ejemplo)...

La solución está en que si tienes una cantidad inferior a .01 salgas del bucle.. O sea lo puedes hacer así:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.  
  8. float cantidad;
  9. float canta = 0;
  10. float cante = 0;
  11. float canti = 0;
  12. int e = 0;
  13. int f = 0;
  14. int g = 0;
  15. int h = 0;
  16. cout << "escribe la cantidad" << endl;
  17. cin >> cantidad;
  18. while(cantidad >= 0.01)
  19. {
  20.    if(cantidad >= 0.25){
  21.        cantidad -= 0.25;
  22.        e++;
  23.    }
  24. else if(cantidad >= 0.10){
  25.     cantidad -= 0.10;
  26.     f++;
  27.    }
  28. else if(cantidad >= 0.05){
  29.     cantidad -= 0.05;
  30.     g++;
  31.    }
  32. else if(cantidad >= 0.01){
  33.     cantidad -= 0.01;
  34.     h++;
  35.    }
  36.  
  37. }
  38.  
  39. cout << "de 0.25 = " << e << endl;
  40. cout << "de 0.10 = " << f << endl;
  41. cout << "de 0.5 = " << g << endl;
  42. cout << "de 0.1 = " << h << endl;
  43. }
  44.  

¿

float canta = 0;
float cante = 0;
float canti = 0;

?

Esas canta, cante y canti son por unas pruebas.

Con la solucion q me diste sale pero el resultado no es correcto en algunos casos como por ejemplo en 1.4
alguna otra idea?
En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #5 en: 5 Noviembre 2012, 19:35 pm »

... A mí sí me da.

Edito:

Me faltaba sumar la h del final. Edito el código arriba.

Cuando usas dos decimales no termina de funcionar bien.
« Última modificación: 5 Noviembre 2012, 19:43 pm por BatchianoISpyxolo » En línea

Puede que desees aprender a programar desde 0: www.espascal.es
adripillo14

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #6 en: 5 Noviembre 2012, 19:54 pm »

... A mí sí me da.

Edito:

Me faltaba sumar la h del final. Edito el código arriba.

Cuando usas dos decimales no termina de funcionar bien.

mira, esta es la salida de catidad = 1.4

Código:
cantidad = 1.4

de 0.25 = 5
de 0.10 = 1
de 0.05 = 0
de 0.01 = 5


deberia usar 1 de 0.05 y ninguna de 0.01.
En línea

adripillo14

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #7 en: 5 Noviembre 2012, 20:32 pm »

mira, esta es la salida de catidad = 1.4

Código:
cantidad = 1.4

de 0.25 = 5
de 0.10 = 1
de 0.05 = 0
de 0.01 = 5


deberia usar 1 de 0.05 y ninguna de 0.01.

Fijate algo, puse couts en cada for para ver el valor de "cantidad".
Cuando ingreo 1.4 empieza a restar y va lo mas bien hasta que le queda de resto "0.05".
Ahi deberia restarle al "0.05" y darle 0 de "cantidad" y salir, pero no. Cuando le queda de cantidad = 0.05 no resta a la parte de 0.05 sino que se la saltea y va direcamente a restar a la de 0.01 y empieza hasta que queda "cantidad = 0.02", al proximo resto "cantidad va a 0.00999".
La falla es que no resta 0.05 a 0.05, ahi deberia terminar.
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #8 en: 5 Noviembre 2012, 21:01 pm »

Citar
Creo que el planteamiento es quitar todas las posbles monedas de 0.249, a lo que resta las de 0.099 y así sucesivamente. ¿Por qué esos valores y no 0.25 y 0.10?. Por los dichosos redondeos que hacen que cantidad sea "ligeramente" inferior a partir del primer cálculo. Con este planteamiento resulta:
Código
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. using namespace std;
  5. int main(){
  6.  
  7.    float cantidad;
  8.    int e = 0,f = 0,g = 0,h = 0;
  9.  
  10.    cout << "escribe la cantidad: " ;
  11.    cin >> cantidad;
  12.    while(cantidad >= 0.249)
  13.        {
  14.            e++;cantidad -= 0.25;
  15.  
  16.         }
  17.     cout << "de 0.25 = " <<  (e)   << endl;
  18.     while(cantidad >= 0.099)
  19.        {
  20.                 f++;cantidad -= 0.1;
  21.  
  22.        }
  23.    cout << "de 0.10 = " <<  (f) << endl;
  24.    while(cantidad >= 0.049)
  25.        {
  26.                g++;cantidad -= 0.05;
  27.  
  28.        }
  29.    cout << "de 0.05 = " <<  (g) << endl;
  30.    while(cantidad >0)
  31.        {
  32.                h++;cantidad -= 0.01;
  33.  
  34.        }
  35.    cout << "de 0.01 = " <<  (h) << endl;
  36.    return 0;
  37. }
Saludos!.
En línea

adripillo14

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Problemas con el vuelto en monedas
« Respuesta #9 en: 5 Noviembre 2012, 21:41 pm »

Código
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4. using namespace std;
  5. int main(){
  6.  
  7.    float cantidad;
  8.    int e = 0,f = 0,g = 0,h = 0;
  9.  
  10.    cout << "escribe la cantidad: " ;
  11.    cin >> cantidad;
  12.    while(cantidad >= 0.249)
  13.        {
  14.            e++;cantidad -= 0.25;
  15.  
  16.         }
  17.     cout << "de 0.25 = " <<  (e)   << endl;
  18.     while(cantidad >= 0.099)
  19.        {
  20.                 f++;cantidad -= 0.1;
  21.  
  22.        }
  23.    cout << "de 0.10 = " <<  (f) << endl;
  24.    while(cantidad >= 0.049)
  25.        {
  26.                g++;cantidad -= 0.05;
  27.  
  28.        }
  29.    cout << "de 0.05 = " <<  (g) << endl;
  30.    while(cantidad >0)
  31.        {
  32.                h++;cantidad -= 0.01;
  33.  
  34.        }
  35.    cout << "de 0.01 = " <<  (h) << endl;
  36.    return 0;
  37. }
Saludos!.

EXCELENTE!!!!!!!!!. Hacia 3 dias que no duermo, MIL GRACIAS!!!!!!!!.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Acertijo Monedas « 1 2 »
Desafíos - Wargames
TheMaker 12 15,477 Último mensaje 17 Febrero 2011, 20:48 pm
por likinhell
Telefonos de monedas
Hacking
NIGHTCRAWLERR2D2 5 6,290 Último mensaje 17 Diciembre 2009, 22:28 pm
por Martin-Ph03n1X
Ejercicio de monedas
Programación C/C++
spf9 3 2,667 Último mensaje 9 Enero 2015, 04:09 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines