Promoción con descuento desarrollo en C
El supermercado Pitón Market ha lanzado una promoción para todos sus clientes que posean la tarjeta Raw Input. La promoción consiste en aplicar un descuento por cada n productos que pasan por caja.
El primer descuento es de 20%, y se aplica sobre los primeros n productos ingresados. Luego, cada descuento es la mitad del anterior, y es aplicado sobre los siguientes n productos.
Por ejemplo, si n = 3 y la compra es de 11 productos, entonces los tres primeros tienen 20% de descuento, los tres siguientes 10%, los tres siguientes 5%, y los dos últimos no tienen descuento.
Escriba un programa que pida al usuario ingresar n y la cantidad de productos, y luego los precios de cada producto. Al final, el programa debe entregar el precio total, el descuento total y el precio final después de aplicar el descuento.
Si al aplicar el descuento el precio queda con decimales, redondee el valor hacia abajo.
n: 3
Cantidad productos: 8
Precio producto 1: 400
Precio producto 2: 800
Precio producto 3: 500
Precio producto 4: 100
Precio producto 5: 400
Precio producto 6: 300
Precio producto 7: 200
Precio producto 8: 500
Total: 3200
Descuento: 420
Por pagar: 2780
#include<stdio.h>
#include<math.h>
main()
{
printf("\n El programa calcula el descuento de la compra de un cliente");
printf("\n El descuento es deacuerdo al monto de la compra");
float Compra, Descuento, Resultado;
printf("Ingrese el monto de la compra");
scanf("%f",&Compra);
if (Compra100)
{
Resultado = Compra;
printf("\n El monto de su compra es de: %7.2f", Resultado);
printf("\n Su compra no aplica para descuento");
}
else
{
if ((Compra>=100)&&(Compra<=200))
{
Descuento = Compra * 0.05;
Resultado = Descuento - Compra;
printf("\n El monto de su compra es de: %7.2f",Resultado);
printf("\n Su ahorro es de Q. %7.2f",Descuento);
}
else
{
if ((Compra>=300)&&(Compra<=400))
{
Descuento = Compra * 0.11;
Resultado = Descuento - Compra;
printf("\n El monto de su compra es de: %7.2f",Resultado);
printf("\n Su ahorro es de Q. %7.2f",Descuento);
}
else
{
if ((Compra>=500)&&(Compra<=800));
{
Descuento = Compra * 0.18;
Resultado = Descuento - Compra;
printf("\n El monto de su compra es de: %7.2f",Resultado);
printf("\n Su ahorro es de Q. %7.2f",Descuento);
}
{
while (Compra>800)
{
Descuento = Compra * 0.25;
Resultado = Descuento - Compra;
printf("\n El monto de su compra es de: %7.2f",Resultado);
printf("\n Su ahorro es de Q. %7.2f",Descuento);
}
}
}
}
}
return 0;
}
Un problema bonito, si señor...7 variables! 3 entrada, 2 de salida, y dos locales...
La clave está en como formalizamos en aritmética, que "si tengo 5 productos" y me exigen lotes de 3 para aplicar el descuento, el 4 o el 5 no tienen descuento. Eso es lo que hace con el chorizo :xD de
\chi((i+(pck-1)-i%pck))<N)
Si voy por el 5 producto (i=4), con lotes de 3 (pck=3) entonces 4+(3-1)-(4%3) = 6 -1 >= 5=N , o sea, "se sale del array"...
Por otro lado, hay que ir actualizando el descuento cada "pack" unidades a la mitad, de ahi que multipliquemos por 2 a disc cada "pack" veces en el cuerpo del for.
#include <iostream>
using namespace std;
/*
let \chi(true)=1 \chi(false)=0
P : V[0..N) of nat 0<pck
Q : T = \sum i : 0 <= i < N : V[i]
D = \sum i : 0 <= i < N : \chi((i+(pck-1)-i%pck))<N)*V[i]/(5*2^(i/pck)) *
* Informaly,
chunk \chi(...) expresses condition
for applying discount 0 or 1
I : Q[N/n] and 0 <= n <= N and
disc = (5*2^n) (efficiency reasons.)
B : n < N
C(N-n) = N-n >= 0
*/
void discount(const int V[], const int N, const int pck,
int &T, int &D)
{
int n,disc;
for(n=T=D=0, disc=5;n<N;n++)
{
T += V[n];
D += ((n+(pck-1)-(n%pck))<N)*V[n]/disc;
disc *=((n+1)%pck)?1:2;
}
return;
}
#define MAX 1000
int main()
{
int V[MAX] ;
int n,N ;
int pck;
int T,D;
cin >> pck;
cin >> N;
for(int n=0; n<N; n++) cin >> V[n];
discount(V,N,pck,T,D);
cout << T << " " << D << " " << (T-D) << endl;
return 0;
}
El ejemplo reproducido que se daba
3
8
400 800 500 100 400 300 200 500
Da como salida
3200 420 2780
Si en cambio, decidimos que hay que tener un minimo de 9 productos para aplicar el descuento...
9
8
400 800 500 100 400 300 200 500
Entonces, no hay descuento, como era de esperar
3200 0 3200