Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: djpacheco3 en 3 Septiembre 2019, 21:30 pm



Título: [C++] Determinar el menor numero de billetas y monedas.
Publicado por: djpacheco3 en 3 Septiembre 2019, 21:30 pm
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


Título: Re: programacion en c++
Publicado por: Loretz en 3 Septiembre 2019, 23:17 pm
Parece que te han tomado el pelo. Ya no se usan pesetas, ahora son euros.


Título: Re: programacion en c++
Publicado por: djpacheco3 en 3 Septiembre 2019, 23:28 pm
Una funcion que ayude a unir los numeros a,b,c,d en un solo numero para poder redondearlo porfavor ayuda urgente!!!


Título: Re: programacion en c++
Publicado por: @XSStringManolo en 4 Septiembre 2019, 00:47 am
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
  1. /****VARIABLES****/
  2. int arrayBilletesMonedasEnCentimos={50000, 20000, 10000.........}
  3.  
  4. int arrayContadorBilletes {billeteDe500, billeteDe200......}
  5. ...
  6.  
  7. /****PROTOTIPO FUNCIONES****/
  8.  
  9.  
  10.  
  11.  
  12.  
  13. /****FUNCION MAIN****/
  14. int main()
  15. {
  16. int pesetas = 0;
  17. int centimosDeEuro = 0;
  18.  
  19. pesetas = ObtenerPesetasDelUsuario();
  20.  
  21. centimosDeEuro = CambioPesetasCentimosDeEuros(pesetas);
  22.  
  23. float euros = centimosDeEuro/100;
  24.  
  25. cout << endl << pesetas << " pesetas son " << euros << "euros." << endl;
  26.  
  27. ObtenerCambio(centimosDeEuro);
  28.  
  29. .....
  30.  
  31. }
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38. /***DEFINICION FUNCIONES***/
  39. unsigned int ObtenerPesetasDelUsuario()
  40. {
  41. cout << "pon pesetas" << endl;
  42. cin >> pesetas;
  43. return pesetas;
  44. }
  45.  
  46.  
  47. unsigned int CambioPesetasCentimosDeEuros (pesetas)
  48. {
  49. centimosEuro = pesetas * 0.60;
  50. return centimosEuro;
  51. }
  52.  
  53.  
  54. void ObtenerCambio (centimosEuro)
  55. {
  56.   for (int i = 0; centimosEuro != 0; ++i)
  57.   {
  58.      if (arrayBMEC[i] >= centimosEuro)
  59.      {
  60.  
  61.      centimosEuro -= arrayBMEC[i];
  62.      arrayCB[i] += 1;
  63.      }
  64.   }
  65. }
  66.  
  67.  
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  ;)


Título: Re: programacion en c++
Publicado por: djpacheco3 en 4 Septiembre 2019, 01:01 am
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


Título: Re: programacion en c++
Publicado por: @XSStringManolo en 4 Septiembre 2019, 02:12 am
La manera más sencilla que se me ocurre es usando un string de C++
Código
  1. array[tamaño] = {a, b, c, d};
  2. string numeroEnString ="";
  3. int numero;
  4.  
  5. for (i = 0; i != tamaño; ++i)
  6. {
  7. numeroEnString += array[ i ];
  8. }
  9. numero = static_cast<int>(numeroEnString);
  10.  

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
  1. int base = 1;
  2.  
  3. for (i = tamañoArray /*o i = string.size()*/; i != 0; --i)
  4. {
  5. numeroFinal += array[ i ]*base;
  6. base = base *10;
  7. }

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
  1. for (i = 0; i < tamaño; ++i)
  2. {
  3. base = base*10;
  4. }

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
  1. for (i = 1; i < tamaño; ++i)
  2. {
  3. base = base*10;
  4. }

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

Código
  1. numeroTruncado = numero/base;

Es decir
Código
  1. numeroTruncado =5661/1000;
  2.  
  3. numeroTruncado = 5;
  4.  

Multiplicas de vuelta por la base.

Código
  1. numeroSinTruncar = numeroTruncado*base;

Y te queda 5000.

Código
  1. Numero2 = NumeroOriginal - numeroTruncado = 661

Por último compruebo si debo aproximar o no.

Código
  1. if (numero2 > base/2)
  2. {
  3. numero = (numero - numero2) + base;
  4. }
  5.  
  6. else
  7. {
  8. numero = numero - numero2;
  9. }

Es decir:
Código
  1. Si (661 > 500)
  2. {
  3. numero = (5661 - 661) + 1000;
  4. } /*Esto da 6000*/
  5.  
  6. En caso contrario
  7. {
  8. numero = 5661 - 661;
  9. } /*Esto da 5000 */



Mod: Obligatorio el uso de etiquetas GeSHi.