elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Cambio en billetes y monedas en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cambio en billetes y monedas en C++  (Leído 14,801 veces)
AxelP

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Cambio en billetes y monedas en C++
« 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();
}         


En línea

Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Cambio en billetes y monedas en C++
« Respuesta #1 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




En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Cambio en billetes y monedas en C++
« Respuesta #2 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.
« Última modificación: 2 Octubre 2014, 00:08 am por eferion » En línea

AxelP

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Cambio en billetes y monedas en C++
« Respuesta #3 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.
« Última modificación: 2 Octubre 2014, 00:47 am por Eternal Idol » En línea

milx86

Desconectado Desconectado

Mensajes: 42


Ver Perfil
Re: Cambio en billetes y monedas en C++
« Respuesta #4 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  :)
« Última modificación: 2 Octubre 2014, 00:48 am por free_c0de » En línea

La abstracción es la clave para lidiar con la complejidad.
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Cambio en billetes y monedas en C++
« Respuesta #5 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
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Cambio en billetes y monedas en C++
« Respuesta #6 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
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Cambio en billetes y monedas en C++
« Respuesta #7 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
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hacer Billetes
Diseño Gráfico
@ZeRo~bLuE@ 8 22,697 Último mensaje 15 Agosto 2006, 07:40 am
por marlon_agz
[python] Calcular billetes « 1 2 »
Scripting
Meta 11 31,239 Último mensaje 11 Junio 2019, 11:28 am
por CIUDADANO Z
Ejercicio de monedas
Programación C/C++
spf9 3 2,656 Último mensaje 9 Enero 2015, 04:09 am
por rir3760
Tutorial de desglose o registro de billetes
Java
jelsir 2 2,656 Último mensaje 28 Septiembre 2015, 19:28 pm
por engel lex
Problema de Cambio de monedas
Java
GAticoxx 0 3,167 Último mensaje 4 Noviembre 2017, 04:09 am
por GAticoxx
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines