[C++] Determinar el menor numero de billetas y monedas.

Iniciado por djpacheco3, 3 Septiembre 2019, 21:30 PM

0 Miembros y 1 Visitante están viendo este tema.

djpacheco3

determinar el menor numero de billetes y monedas de curso legal equivalentes a cierta cantidad de pesetas(cambio óptimo)



Mod: Obligatorio el uso de títulos descriptivos. Ultimo aviso.
https://foro.elhacker.net/reglas

Loretz

Parece que te han tomado el pelo. Ya no se usan pesetas, ahora son euros.

djpacheco3

Una funcion que ayude a unir los numeros a,b,c,d en un solo numero para poder redondearlo porfavor ayuda urgente!!!

@XSStringManolo

Buscando en Google 100 pesetas = 60 céntimos.
Una peseta son 0,6 céntimos. Es decir si multiplico cualquiera que sea el valor de pesetas por 0,6 voy a obtener ese valor en euros.
Por ejemplo 55 pesetas son 33 céntimos de euro.

Teniendo esto, ya puedes convertir cualquier cantidad de Pesetas a euros.

Ahora la parte del cambio. Se busca el cambio óptimo, es decir, darle la menor cantidad de billetes+monedas hasta llegar a la cantidad de euros. Tan sencillo como declarar todos los valores posibles de billetes y monedas e ir restándoselos a la cantidad de euros.

Ejemplo.
El usuario del programa quiere pasar sus 470 pesetas a euros en una máquina y que le de el cambio:
Pasamos pesetas a euros.
centimosDeEuro = pesetas*0'6;
Son 282 céntimos. Es decir 2 euros y 82 céntimos.

En un contenedor guardas todos los valores posibles de billetes y monedas.
500 200 100 50 20 10 5 2 1 0.50 0.20 0.10 0.05 0.02 0.01

Puedes representarlo todo en céntimos si te es más cómodo para no operar con decimales y haces el cambio a euros en el cout.

Ahora para devolver el cambio compruebas cual es la cantidad más grande que puedes dar de esa lista y se lo restas a la cantidad total, esto lo haces en bucle hasta acabar con todo el dinero.

2.82€ - 2€ = 0.82€
0.82€ - 0.50€ = 0.32€
0.32€ - 0.20€ = 0.12€
0.12€ - 0.10€ = 0.02€
0.02€ - 0.02€ = 0.00€

Es decir, le das de cambio una moneda de 2€, una moneda de 50 céntimos, una de 20 centimos, una de 10 centimos y una de 2 céntimos.

Puedes hacer algo estilo:

Código (cpp) [Seleccionar]
/****VARIABLES****/
int arrayBilletesMonedasEnCentimos={50000, 20000, 10000.........}

int arrayContadorBilletes {billeteDe500, billeteDe200......}
...

/****PROTOTIPO FUNCIONES****/





/****FUNCION MAIN****/
int main()
{
int pesetas = 0;
int centimosDeEuro = 0;

pesetas = ObtenerPesetasDelUsuario();

centimosDeEuro = CambioPesetasCentimosDeEuros(pesetas);

float euros = centimosDeEuro/100;

cout << endl << pesetas << " pesetas son " << euros << "euros." << endl;

ObtenerCambio(centimosDeEuro);

.....

}






/***DEFINICION FUNCIONES***/
unsigned int ObtenerPesetasDelUsuario()
{
cout << "pon pesetas" << endl;
cin >> pesetas;
return pesetas;
}


unsigned int CambioPesetasCentimosDeEuros (pesetas)
{
centimosEuro = pesetas * 0.60;
return centimosEuro;
}


void ObtenerCambio (centimosEuro)
{
  for (int i = 0; centimosEuro != 0; ++i)
  {
     if (arrayBMEC[i] >= centimosEuro)
     {
   
     centimosEuro -= arrayBMEC[i];
     arrayCB[i] += 1;
     }
  }
}


Completalo y déjalo bien presentado.


El otro ejercicio: " Una funcion que ayude a unir los numeros a,b,c,d en un solo numero para poder redondearlo ".

No sé a que se refiere "unirlos" en un solo número. Sumarlos? Poner uno al lado del otro?
Y menos aún entiendo lo de "que ayude"... Tienes que ayudar la función? O tiene que hacerlo?

Si un profesor me pide eso tal cual le hago algo así:

string numeros ="";
numeros += a;
numeros += b;
numeros += c;
numeros += d;

cout << endl << "El numero \"unido\" es: << static_cast<int>(numeros);

Y para aproximar miro el segundo y le sumo o no 1 al primero si es o pasa de 5 el segundo. Ya lo hago antes de meterlos en el string.

if (b >= 5) {a++; b=0; c=0; d=0;}
int numero = a;
numero = numero*1000;

Estes ejercicios son para que aprendas. Pero muchos profesores mandan hacer cosas sin explicar nada. Asique mírate libros de C++ por tu cuenta y pregunta por el foro lo que no entiendas o no consigas hacer. Si esperas que un profesor consultando un libro de cuando había pesetas se va a preocupar de enseñarte nada cuando ni se molesta en actualizar un libro de ejercicios o hacerlo el mismo... Pues vas fino  ;)

djpacheco3

Mira muchisisisimas gracias por lo anterior no es sumar por ejemplo:
A=5
B=6
C=6
D=1
Entonces el numero será 5661 y entonces el resultado redondeado será 5700
Y de eso yo quiero un procedimiento para poder hacer eso es lo que no entiendo de todo un ejercicio eso no mas una parte

@XSStringManolo

#5
La manera más sencilla que se me ocurre es usando un string de C++
Código (cpp) [Seleccionar]

array[tamaño] = {a, b, c, d};
string numeroEnString ="";
int numero;

for (i = 0; i != tamaño; ++i)
{
numeroEnString += array[ i ];
}
numero = static_cast<int>(numeroEnString);


Creo que se podía hacer cast de string a int, pero no te lo aseguro al 100%. Si no se puede simplemente lees el array/string al revés multiplicas cada número según su posición, por ejemplo incrementando la base*10 por cada iteración y sumas todos los números obtenidos.

Tipo:
Código (cpp) [Seleccionar]
int base = 1;

for (i = tamañoArray /*o i = string.size()*/; i != 0; --i)
{
numeroFinal += array[ i ]*base;
base = base *10;
}


En el ejemplo de 5661 cada iteración del bucle anterior haría lo siguiente:
1) num = 1 * 1; base = 1*10;
Num vale 1. Base vale 10.

2) num = 1 + 6*10; base = 10*10;
Num vale 61. Base vale 100;

3) num = 61 + 6*100; 100*10;
Num vale 661. base vale 1000.

4) num = 661 + 5*1000; 1000*10;
Num vale 5661. Base 10000.

Se acaban las iteraciones.

Ahora, para redondear yo lo haría de la siguiente manera. Soy poco ortodoxo y eficiente programando, asique igual es mejor que busques otros ejemplos jeje.

Si la segunda cifra empezando por la izquierda vale más o es igual a 5.

Tienes el tamaño. Por lo tanto sabes la cantidad de cifras que tienes.
En base a esto lo puedes hacer con operaciones simples.

Código (cpp) [Seleccionar]
for (i = 0; i < tamaño; ++i)
{
base = base*10;
}


1) base = 1*10

2) base = 10*10

3) base = 100*10

4) base = 1000*10


Como se te pasa por 10 le restas 1 iteración al bucle como quieras. Por ejemplo empezando con i = 1;

Código (cpp) [Seleccionar]
for (i = 1; i < tamaño; ++i)
{
base = base*10;
}


Después truncas el numero dividiéndolo por esa cantidad.

Código (cpp) [Seleccionar]
numeroTruncado = numero/base;

Es decir
Código (cpp) [Seleccionar]

numeroTruncado =5661/1000;

numeroTruncado = 5;


Multiplicas de vuelta por la base.

Código (cpp) [Seleccionar]
numeroSinTruncar = numeroTruncado*base;

Y te queda 5000.

Código (cpp) [Seleccionar]
Numero2 = NumeroOriginal - numeroTruncado = 661

Por último compruebo si debo aproximar o no.

Código (cpp) [Seleccionar]
if (numero2 > base/2)
{
numero = (numero - numero2) + base;
}

else
{
numero = numero - numero2;
}


Es decir:
Código (cpp) [Seleccionar]
Si (661 > 500)
{
numero = (5661 - 661) + 1000;
} /*Esto da 6000*/

En caso contrario
{
numero = 5661 - 661;
} /*Esto da 5000 */





Mod: Obligatorio el uso de etiquetas GeSHi.