• Viernes 3 de Mayo de 2024, 00:29

Autor Tema:  Redondeo a favor del consumidor C+  (Leído 1897 veces)

aarielvacon

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Redondeo a favor del consumidor C+
« en: Sábado 23 de Abril de 2011, 19:26 »
0
Hola a todos ? Por primera vez voy a utilizar este foro para consultarles acerca de un ejercicio que tengo que hacer.
Elaborar un programa que calcule el impuesto que se aplica a una cierta compra de la siguiente
forma:
• Si el importe de una compra es mayor a $500.- el impuesto será del 16%.
• En caso contrario, el impuesto será del 18%.
Sin embargo, ante la escasez de monedas de 1 centavo, el importe final de la compra debe ser
redondeado, en favor del cliente, hasta un múltiplo de 5 centavos. Es decir, si el importe fuera de
$5,17.- entonces la suma a abonar sería $5,15.-. El programa debe solicitar el ingreso de la
compra y calcular y mostrar el subtotal (compra + impuesto) y el total a abonar (subtotal
redondeado).
Ejemplo:
Valor de la compra: 521
Subtotal: 604.36
Importe a abonar: 604.35

De este problema ya hice todo esto
#include <stdio.h>
#include <stdlib.h>

int main()
{

   float compra,desc;
   printf("Ingrese el importe de la compra");
   scanf ("%f",&compra);
   printf ("n El importe ingresado es : %.2f",compra);
   if (compra>=500)
   {
       desc=(compra)+(compra*16/100);

       printf("n El subtotal es de %.2f ",desc);
   
   }
   else if (compra <500)
   {
       desc=compra+compra*18/100;
       printf("n El subtotal es de %.2f",desc);
   }

    return 0;
}

Ahora necesitaría la parte de redondear para arriba como lo puedo hacer?

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Redondeo a favor del consumidor C+
« Respuesta #1 en: Sábado 23 de Abril de 2011, 21:04 »
0
Antes de seguir, te recomiendo que cuando publiques codigo lo encierres utilizando las etiquetas [ code] [ /code] (sin espacio en los corchetes), ya que mejora la legibilidad del codigo.

Bueno, yo lo resolveria multiplicando la compra por 100 (para eliminar centavos), luego dividiendo ese resultado entre 5 usando la funcion fmod() para obtener el modulo (residuo) de la division, si el residuo es diferente de 0, entonces quiere decir que los centavos no son multiplos de 5, entonces divido el residuo entre 100 para convertirlo a centavos de nuevo, y se los resto a la compra para que quede redondeado a un multiplo de 5.

Lo que explique antes, en codigo, para que te quede mas claro:

Código: C++
  1.  
  2.     // Variable para guardar el residuo de la division
  3.     int resto;
  4.     resto = fmod(compra * 100.0f, 5.0f);
  5.     if (resto != 0)
  6.     {
  7.         compra = compra - (resto / 100.0f);
  8.     }
  9.  
  10.  

Espero te funcione.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

aarielvacon

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Redondeo a favor del consumidor C+
« Respuesta #2 en: Sábado 23 de Abril de 2011, 21:20 »
0
Profesor muchas gracias por tu ayuda. En primera instancia no conozco la función fmod , la función para modulo es % en lo poco que conozco. Esto me quedaría así

Código: Text
  1.  
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. int main()
  7. {
  8.  
  9.    float desc;
  10.    int resto,compra;
  11.  
  12.    printf("Ingrese el importe de la compra");
  13.    scanf ("%d",&compra);
  14.    printf ("n El importe ingresado es : %.2d",compra);
  15.    if (compra>=500)
  16.    {
  17.        desc=(compra)+(compra*16/100);
  18.  
  19.        printf("n El subtotal es de %.2f ",desc);
  20.        resto = (compra*100%5);
  21.        if(resto!=0)
  22.        {
  23.        compra = compra - (resto-100);
  24.        printf("El subtotal final es %d",compra);
  25.        }
  26.  
  27.  
  28.    }
  29.    else if (compra <500)
  30.    {
  31.        desc=compra+compra*18/100;
  32.        printf("n El subtotal es de %.2f",desc);
  33.    }
  34.  
  35.     return 0;
  36.  
  37.  

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Redondeo a favor del consumidor C+
« Respuesta #3 en: Sábado 23 de Abril de 2011, 22:27 »
0
La funcion fmod hace lo mismo que el operador %, la diferencia esta en que el operador % solo sirve con enteros, y la funcion fmod funciona con flotantes (de ahi lo de f mod, float modulus), y dado que compras es flotante, no puedes usar %

Esta funcion foma parte de la libreria math.h por lo que necesitas poner #include <math.h>

pero estas equivocado en esta linea, no pusiste lo mismo que yo:

Código: C++
  1.  
  2. compra = compra - (resto-100);
  3.  
  4.  

observa lo que puse yo, ya que no te dara el mismo resultado, no es lo mismo resto -100 que resto / 100, ya que suponiendo que tenemos compras = 3.17, aqui ves que claramente sobran dos centavos, para sacarlos multiplicas por 100, se convierte en 317, al dividir entre 5 y obtener el modulo (residuo) te dara 2, pero al poner 2 - 100 da -98, no .02, que es lo que necesitas restar para que te de el resultado de 3.15,por eso debes dividir entre 100, no se si entiendas bien el algoritmo.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

aarielvacon

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Redondeo a favor del consumidor C+
« Respuesta #4 en: Domingo 24 de Abril de 2011, 03:26 »
0
Buenos gracias , ya entendí.

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. int main()
  7. {
  8.  
  9.    float compra,desc;
  10.    int resto;
  11.    printf("Ingrese el importe de la compra");
  12.    scanf ("%f",&compra);
  13.    printf ("n El importe ingresado es : %.2f",compra);
  14.    if (compra>=500)
  15.    {
  16.        desc=(compra)+(compra*16/100);
  17.  
  18.        printf("n El subtotal es de %.2f ",desc);
  19.        resto = fmod(compra * 100.0f, 5.0f);
  20.     if (resto != 0)
  21.     {
  22.         compra = compra - (resto / 100.0f);
  23.         printf("El subtotal es : %d",compra);
  24.     }
  25.  
  26.    }
  27.    else if (compra <500)
  28.    {
  29.        desc=compra+compra*18/100;
  30.        printf("n El subtotal es de %.2f",desc);
  31.        resto = fmod(compra * 100.0f, 5.0f);
  32.     if (resto != 0)
  33.     {
  34.         compra = compra - (resto / 100.0f);
  35.     }
  36.    }
  37.  
  38.     return 0;
  39. }
  40.  
  41.  
me quedaría así ?