Problemas con el vuelto en monedas

Iniciado por adripillo14, 5 Noviembre 2012, 17:15 PM

0 Miembros y 2 Visitantes están viendo este tema.

adripillo14

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.


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.

BatchianoISpyxolo

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

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:

while(cantidad > 0)

Edito: debe ser mayor que 0 para que no se haga ciclo infinito.
Puede que desees aprender a programar desde 0: www.espascal.es

adripillo14

Cita de: BatchianoISpyxolo en  5 Noviembre 2012, 17:36 PM
No he leído mucho pero el error creo que está aquí:

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:

while(cantidad >= 0)

Gracias por responderme pero tampoco funciona asi.

BatchianoISpyxolo

#3
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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;

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++;
    }
else {
    cantidad = -1;
    h++;
    }
}

cout << "de 0.25 = " << e << endl;
cout << "de 0.10 = " << f << endl;
cout << "de 0.05 = " << g << endl;
cout << "de 0.01 = " << h << endl;
}


¿

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

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

adripillo14

Cita de: BatchianoISpyxolo 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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>

using namespace std;

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.01)
{
   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;
}


¿

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?

BatchianoISpyxolo

#5
... 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.
Puede que desees aprender a programar desde 0: www.espascal.es

adripillo14

Cita de: BatchianoISpyxolo 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.

mira, esta es la salida de catidad = 1.4


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.

adripillo14

Cita de: adripillo14 en  5 Noviembre 2012, 19:54 PM
mira, esta es la salida de catidad = 1.4


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.

leosansan

CitarCreo 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 (cpp) [Seleccionar]
#include <iostream>
#include <stdio.h>

using namespace std;
int main(){

    float cantidad;
    int e = 0,f = 0,g = 0,h = 0;

    cout << "escribe la cantidad: " ;
    cin >> cantidad;
    while(cantidad >= 0.249)
        {
            e++;cantidad -= 0.25;

         }
     cout << "de 0.25 = " <<  (e)   << endl;
     while(cantidad >= 0.099)
        {
                 f++;cantidad -= 0.1;

        }
    cout << "de 0.10 = " <<  (f) << endl;
    while(cantidad >= 0.049)
        {
                g++;cantidad -= 0.05;

        }
    cout << "de 0.05 = " <<  (g) << endl;
    while(cantidad >0)
        {
                h++;cantidad -= 0.01;

        }
    cout << "de 0.01 = " <<  (h) << endl;
    return 0;
}

Saludos!.

adripillo14

Cita de: leosansan en  5 Noviembre 2012, 21:01 PM
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdio.h>

using namespace std;
int main(){

    float cantidad;
    int e = 0,f = 0,g = 0,h = 0;

    cout << "escribe la cantidad: " ;
    cin >> cantidad;
    while(cantidad >= 0.249)
        {
            e++;cantidad -= 0.25;

         }
     cout << "de 0.25 = " <<  (e)   << endl;
     while(cantidad >= 0.099)
        {
                 f++;cantidad -= 0.1;

        }
    cout << "de 0.10 = " <<  (f) << endl;
    while(cantidad >= 0.049)
        {
                g++;cantidad -= 0.05;

        }
    cout << "de 0.05 = " <<  (g) << endl;
    while(cantidad >0)
        {
                h++;cantidad -= 0.01;

        }
    cout << "de 0.01 = " <<  (h) << endl;
    return 0;
}

Saludos!.

EXCELENTE!!!!!!!!!. Hacia 3 dias que no duermo, MIL GRACIAS!!!!!!!!.