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
Parece que te han tomado el pelo. Ya no se usan pesetas, ahora son euros.
Una funcion que ayude a unir los numeros a,b,c,d en un solo numero para poder redondearlo porfavor ayuda urgente!!!
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:
/****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 ;)
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
La manera más sencilla que se me ocurre es usando un string de C++
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:
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.
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;
for (i = 1; i < tamaño; ++i)
{
base = base*10;
}
Después truncas el numero dividiéndolo por esa cantidad.
numeroTruncado = numero/base;
Es decir
numeroTruncado =5661/1000;
numeroTruncado = 5;
Multiplicas de vuelta por la base.
numeroSinTruncar = numeroTruncado*base;
Y te queda 5000.
Numero2 = NumeroOriginal - numeroTruncado = 661
Por último compruebo si debo aproximar o no.
if (numero2 > base/2)
{
numero = (numero - numero2) + base;
}
else
{
numero = numero - numero2;
}
Es decir:
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.