Cambio en billetes y monedas en C++

Iniciado por AxelP, 1 Octubre 2014, 23:07 PM

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

AxelP

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:

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();
}         

Caster

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



eferion

#2
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".


sobraG=cambio%1;
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.

Cita de: Caster en  2 Octubre 2014, 00:03 AM
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

int resultado = 20/200;

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

AxelP

#3
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.

milx86

#4

#include <stdio.h>

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 billetes, sobra, moneda;

   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);
   if (pago>=precio)
    {
          cambio=pago-precio;
          printf("\n su cambio es de: %d", cambio);

          billetes= (int) cambio/200;
          printf("\n %d billetes de 200", billetes);
          sobra=(int) cambio%200;


          billetes=(int) sobra/100;
          printf("\n %d billetes de 100", billetes);
          sobra=(int) sobra%100;

          billetes=(int) sobra/50;
          printf("\n %d billetes de 50", billetes);
          sobra=(int) sobra%50;

          billetes=(int) sobra/20;
          printf("\n %d billetes de 20", billetes);
          sobra=(int) sobra%20;

          moneda=(int) sobra/10;
          printf("\n %d monedas de 10", moneda);
          sobra=(int) sobra%10;

          moneda=(int) sobra/5;
          printf("\n %d monedas de 5", moneda);
          sobra=(int) sobra%5;

          moneda=(int) sobra/2;
          printf("\n %d monedas de 2", moneda);
          sobra=(int) sobra%2;

          printf("\n %d monedad de 1", sobra);
    }
       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();
}



En lugar de

billetes=(int) sobra/100;
printf("\n %d billetes de 100", billetes);
sobra=(int) cambio%100;

Debería ser

billetes=(int) sobra/100;
printf("\n %d billetes de 100", billetes);
sobra=(int) sobra%100;

Y asi para los que siguen, en la primera si debes usar cambio, pero en las que siguen me parece que no.
Saludos  :)
La abstracción es la clave para lidiar con la complejidad.

Caster

Cita de: eferion en  2 Octubre 2014, 00:06 AM

Eso no da error. Si tu haces

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

eferion

Cita de: free_c0de en  2 Octubre 2014, 00:46 AM
En lugar de

billetes=(int) sobra/100;
printf("\n %d billetes de 100", billetes);
sobra=(int) cambio%100;

Debería ser

billetes=(int) sobra/100;
printf("\n %d billetes de 100", billetes);
sobra=(int) sobra%100;


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

cambio = 265
billetesA = 265 / 200 = 1 <-- 1 de 200

sobra = 265 % 200 = 65
billetesB = 65 / 100 = 0  <-- 0 de 100

sobraB = 265 % 100 = 65
billetesC = 65 / 50 = 1   <-- 1 de 50

sobraC = 265 % 50 = 15
billetesD = 15 / 20 = 0   <-- 0 de 20

sobraD = 265 % 20 = 15
monedaA= 15/10 = 1        <-- 1 de 10

sobraE = 265 % 10 = 5
monedaB = 5 / 5 = 1       <-- 1 de 5

sobraF = 265 % 5 = 0
monedaC = 0 / 2 = 0       <-- 0 de 2

sobraG = 265 % 2 = 0
monedaD = 0 / 1 = 0       <-- 0 de 1

rir3760

Cita de: AxelP en  1 Octubre 2014, 23:07 PMtengo 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>):
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   int den[] = {200, 100, 50, 20, 10, 5, 2, 1};
   char *tipo[] = {"Billetes", " Monedas"};
   int i = 0;
   div_t r = {0, 388};

   do {
      r = div(r.rem, den[i]);
     
      if (r.quot != 0)
         printf("%s de %3d: %d\n", tipo[i / 4], den[i], r.quot);
     
      i++;
   }while (r.rem != 0);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language