Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AxelP en 1 Octubre 2014, 23:07 pm



Título: Cambio en billetes y monedas en C++
Publicado por: AxelP en 1 Octubre 2014, 23:07 pm
Hola, espero puedan ayudarme, tengo que devolver el cambio en billetes de 200, 100, 50, 20 y monedas de 10, 5, 2, 1
es basándome en este código (la parte importante es la subrayada), funciona bien con los billetes, pero en las monedas me da de más o de menos:

Código:
int main()
{
    int continuar, chimichanga;
    continuar = 0;
    while (continuar == 0)
    {
    printf("\nMenu: \n 1.-Paque-te pongas feliz.  \n 2.-Paque-te llenes.  \n 3.-Paque-te enojes");
    printf("\nSelecciona tu paquete: ");
    scanf("%d",&chimichanga);
    int precio;
    int billetesA, sobra, billetesB, sobraB, billetesC, sobraC, billetesD, sobraD, monedaA, monedaB, sobraE, monedaC, sobraF, monedaD, sobraG;
   
    switch(chimichanga)
    {
                       case 1:
                                precio=100;
                            printf("Elegiste el paquete %d, su precio es de %d este incluye: ",chimichanga, precio);
                            printf("\n Chocolate caliente. \n 3 churros. \n 5 tacos.");
                            break;
                       case 2:
                                precio=80;
                                printf("Elegiste el paquete %d, su precio es de %d este incluye: ",chimichanga, precio);
                            printf("\n Cafe \n Concha \n Torta");
                            break;
                       case 3:
                                precio=40;
                            printf("Elegiste el paquete %d, su precio es de %d este incluye: ",chimichanga, precio);
                            printf("\n Agua. \n Bolillo. \n Chayote.");
                            break;
                       default:
                               printf("Escoge un paquete valido.");
    };
    int pago, cambio;
    printf("\n indica con cuanto vas a pagar: ");
    scanf("%d", &pago);
   [u] if (pago>=precio)
      {
           cambio=pago-precio;
           printf("\n su cambio es de: %d", cambio);
           billetesA=cambio/200;
           printf("\n %d billetes de 200", billetesA);
           sobra=cambio%200;
           billetesB=sobra/100;
           printf("\n %d billetes de 100", billetesB);
           sobraB=cambio%100;
           billetesC=sobraB/50;
           printf("\n %d billetes de 50", billetesC);
           sobraC=cambio%50;
           billetesD=sobraC/20;
           printf("\n %d billetes de 20", billetesD);
           sobraD=cambio%20;
           monedaA=sobraD/10;
           printf("\n %d monedas de 10", monedaA);
           sobraE=cambio%10;
           monedaB=sobraE/5;
           printf("\n %d monedas de 5", monedaB);
           sobraF=cambio%5;
           monedaC=sobraF/2;
           printf("\n %d monedas de 2", monedaC);
           sobraG=cambio%1;
           monedaD=sobraG/1;
           printf("\n %d monedad de 1", monedaD);   [/u]       
      }
        else
        {
            printf("\n pague lo que se indica.");
        };
        printf("\nQuieres escoger algun otro paquete? Presiona 0 si tu respuesta es si y 1 si es no: ");
    scanf("%d", &continuar);
    system("cls");    
    };
getch();
}         


Título: Re: Cambio en billetes y monedas en C++
Publicado por: Caster en 2 Octubre 2014, 00:03 am
Antes de nada, el código que posteas es C, no C++. No puedo compilar tu código ahora mismo y no estoy acostumbrado a depurarlo así a ojo, pero si por ejemplo elijo el paquete 2, el cual cuesta 80 y pago 100 ppr ejemplo, el cambio seria 20, hasta ahí bien, pero cuando calculas los billetes de 200 no tiene sentido porque no llega a 200 lo que tienes que devolver, la operación es 20/200 lo cual da como resultado 0.1, que es un decimal y las variables con las que trabaja el programa son de tipo entero, así que si no me equivoque hasta ahora, ahí debería de dar error.

Un saludo




Título: Re: Cambio en billetes y monedas en C++
Publicado por: eferion en 2 Octubre 2014, 00:06 am
No tiene sentido que uses tantas variables... las variables se pueden reutilizar, sobretodo si los resultados que almacenan son temporales y si no cambia el concepto del dato que estás almacenando en dicha variable. No te hace falta tener sobraA, sobraB, sobraC, .... puedes reutilizar "sobra".

Código
  1. sobraG=cambio%1;
  2. monedaD=sobraG/1;

Cualquier número módulo 1 da como resultado 0... la razón es que cualquier número es divisible entre 1 y la división es exacta, por lo que el módulo SIEMPRE es cero. Además, siguiendo la secuencia de tu algoritmo, ese %1 debería ser un %2, ya que el módulo se supone que lo estás calculando sobre el valor de la moneda o billtete anterior, que en este caso es 2, no 1.

Además X / 1 = X SIEMPRE también, por lo que puedes ahorrarte también la división.

la operación es 20/200 lo cual da como resultado 0.1, que es un decimal y las variables con las que trabaja el programa son de tipo entero, así que si no me equivoque hasta ahora, ahí debería de dar error.

Eso no da error. Si tu haces

Código
  1. int resultado = 20/200;

resultado acaba almacenando el valor 0, la parte decimal se ignora al tratarse de números enteros.


Título: Re: Cambio en billetes y monedas en C++
Publicado por: AxelP en 2 Octubre 2014, 00:18 am
Caster si,pero qué pasa si pago con un 780? Te lo agradezco.
eferion, tienes razón, no me había dado cuenta de eso, y la división la puse solo para evitarme cualquier posible error.
Muchas gracias a ambos, intentare para ver si puedo resolverlo.



Ya corregí eso y sigue sin salir, no se que esté mal.


Título: Re: Cambio en billetes y monedas en C++
Publicado por: milx86 en 2 Octubre 2014, 00:46 am
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int continuar, chimichanga;
  6.    continuar = 0;
  7.    while (continuar == 0)
  8.    {
  9.    printf("\nMenu: \n 1.-Paque-te pongas feliz.  \n 2.-Paque-te llenes.  \n 3.-Paque-te enojes");
  10.    printf("\nSelecciona tu paquete: ");
  11.    scanf("%d",&chimichanga);
  12.    int precio;
  13.    int billetes, sobra, moneda;
  14.  
  15.    switch(chimichanga)
  16.    {
  17.            case 1:
  18.                precio=100;
  19.            printf("Elegiste el paquete %d, su precio es de %d este incluye: ",chimichanga, precio);
  20.            printf("\n Chocolate caliente. \n 3 churros. \n 5 tacos.");
  21.            break;
  22.            case 2:
  23.                precio=80;
  24.                printf("Elegiste el paquete %d, su precio es de %d este incluye: ",chimichanga, precio);
  25.                printf("\n Cafe \n Concha \n Torta");
  26.                break;
  27.            case 3:
  28.                precio=40;
  29.                printf("Elegiste el paquete %d, su precio es de %d este incluye: ",chimichanga, precio);
  30.                printf("\n Agua. \n Bolillo. \n Chayote.");
  31.                break;
  32.            default:
  33.                printf("Escoge un paquete valido.");
  34.    };
  35.    int pago, cambio;
  36.    printf("\n indica con cuanto vas a pagar: ");
  37.    scanf("%d", &pago);
  38.    if (pago>=precio)
  39.     {
  40.           cambio=pago-precio;
  41.           printf("\n su cambio es de: %d", cambio);
  42.  
  43.           billetes= (int) cambio/200;
  44.           printf("\n %d billetes de 200", billetes);
  45.           sobra=(int) cambio%200;
  46.  
  47.  
  48.           billetes=(int) sobra/100;
  49.           printf("\n %d billetes de 100", billetes);
  50.           sobra=(int) sobra%100;
  51.  
  52.           billetes=(int) sobra/50;
  53.           printf("\n %d billetes de 50", billetes);
  54.           sobra=(int) sobra%50;
  55.  
  56.           billetes=(int) sobra/20;
  57.           printf("\n %d billetes de 20", billetes);
  58.           sobra=(int) sobra%20;
  59.  
  60.           moneda=(int) sobra/10;
  61.           printf("\n %d monedas de 10", moneda);
  62.           sobra=(int) sobra%10;
  63.  
  64.           moneda=(int) sobra/5;
  65.           printf("\n %d monedas de 5", moneda);
  66.           sobra=(int) sobra%5;
  67.  
  68.           moneda=(int) sobra/2;
  69.           printf("\n %d monedas de 2", moneda);
  70.           sobra=(int) sobra%2;
  71.  
  72.           printf("\n %d monedad de 1", sobra);
  73.     }
  74.        else
  75.        {
  76.            printf("\n pague lo que se indica.");
  77.        };
  78.        printf("\nQuieres escoger algun otro paquete? Presiona 0 si tu respuesta es si y 1 si es no: ");
  79.    scanf("%d", &continuar);
  80.    system("cls");
  81.    };
  82. }
  83.  


En lugar de
Código
  1. billetes=(int) sobra/100;
  2. printf("\n %d billetes de 100", billetes);
  3. sobra=(int) cambio%100;
  4.  
Debería ser
Código
  1. billetes=(int) sobra/100;
  2. printf("\n %d billetes de 100", billetes);
  3. sobra=(int) sobra%100;
  4.  
Y asi para los que siguen, en la primera si debes usar cambio, pero en las que siguen me parece que no.
Saludos  :)


Título: Re: Cambio en billetes y monedas en C++
Publicado por: Caster en 2 Octubre 2014, 07:21 am

Eso no da error. Si tu haces

Código
  1. int resultado = 20/200;

resultado acaba almacenando el valor 0, la parte decimal se ignora al tratarse de números enteros.

Eso lo pensé, pero ya despues de haber posteado.

Un saludo


Título: Re: Cambio en billetes y monedas en C++
Publicado por: eferion en 2 Octubre 2014, 08:35 am
En lugar de
Código
  1. billetes=(int) sobra/100;
  2. printf("\n %d billetes de 100", billetes);
  3. sobra=(int) cambio%100;
  4.  
Debería ser
Código
  1. billetes=(int) sobra/100;
  2. printf("\n %d billetes de 100", billetes);
  3. sobra=(int) sobra%100;
  4.  

No hace falta hacerlo así. Te lo demuestro:

supón un cambio de 265. esto son un billete de 200, uno de 50, una moneda de 10 y otra de 5
Código
  1. cambio = 265
  2. billetesA = 265 / 200 = 1 <-- 1 de 200
  3.  
  4. sobra = 265 % 200 = 65
  5. billetesB = 65 / 100 = 0  <-- 0 de 100
  6.  
  7. sobraB = 265 % 100 = 65
  8. billetesC = 65 / 50 = 1   <-- 1 de 50
  9.  
  10. sobraC = 265 % 50 = 15
  11. billetesD = 15 / 20 = 0   <-- 0 de 20
  12.  
  13. sobraD = 265 % 20 = 15
  14. monedaA= 15/10 = 1        <-- 1 de 10
  15.  
  16. sobraE = 265 % 10 = 5
  17. monedaB = 5 / 5 = 1       <-- 1 de 5
  18.  
  19. sobraF = 265 % 5 = 0
  20. monedaC = 0 / 2 = 0       <-- 0 de 2
  21.  
  22. sobraG = 265 % 2 = 0
  23. monedaD = 0 / 1 = 0       <-- 0 de 1


Título: Re: Cambio en billetes y monedas en C++
Publicado por: rir3760 en 2 Octubre 2014, 15:44 pm
tengo que devolver el cambio en billetes de 200, 100, 50, 20 y monedas de 10, 5, 2, 1 es basándome en este código
Los pasos del algoritmo ya te los explicaron de una forma satisfactoria, en cuanto a la implementación esta deja que desear ya que deberías utilizar arrays y un bucle para acortar el código fuente. Ejemplos de ello existen en la base de datos de los foros, solo tienes que utilizar el motor de busqueda.

Y una alternativa a realizar las operaciones de división y modulo directamente es utilizar la función div y el tipo div_t (el encabezado es <stdlib.h>):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   int den[] = {200, 100, 50, 20, 10, 5, 2, 1};
  7.   char *tipo[] = {"Billetes", " Monedas"};
  8.   int i = 0;
  9.   div_t r = {0, 388};
  10.  
  11.   do {
  12.      r = div(r.rem, den[i]);
  13.  
  14.      if (r.quot != 0)
  15.         printf("%s de %3d: %d\n", tipo[i / 4], den[i], r.quot);
  16.  
  17.      i++;
  18.   }while (r.rem != 0);
  19.  
  20.   return EXIT_SUCCESS;
  21. }

Un saludo