Programa en c que determina las monedas que dar como cambio según el dinero percibido

Espero me puedan ayudar con el siguiente programa, el cual despliega la cantidad de monedas que se deben dar como cambio, en la que se pide monto a pagar y dinero recibido.
Las monedas son de 25 centavos 10 centavos 5 centavos y 1 centavo
Tengo el programa el problema es cuando lo evalua para>
Monto a pagar: 4.63
Dinero recibido: 10
El resultado me roba 1 centavo, si cambio la condición del ultimo ciclo a while(x>0)
El problema resulta al evaluar
Monto a pagar: 5
Dinero recibido: 10
Roba 1 centavo
Cualquier ayuda la agradezco, no encuentro porque el problema.
Código: C
/*Programa que calcula el cambio desplegando las monedas de 25, 10, 5 y 1 centavo
*/
#include <stdio.h>
#include <conio.h>
#define ENTER 13 /*13 es la tecla Enter*/
void main(void);
void pausa(void);
void captura(void);
void monedas(float);
void main(){
clrscr();
captura();
pausa();
}
void pausa(){
printf("\nPresione Enter para continuar\n");
while(getch()!=ENTER);
}
void captura(){
float monto,pago,cambio=0;
printf("Programa que calcula el cambio con monedas");
printf("\nInserte el total a pagar >");
scanf("%f",&monto);
printf("Inserte el dinero recibido >");
scanf("%f",&pago);
cambio=pago-monto;
printf("Su cambio es %.2f",cambio);
monedas(cambio);
}
void monedas(float x){
int c25=0,c10=0,c5=0,c1=0;
while(x>0.25){
x-=0.25;
c25++;
}
printf("\n\nRegresar %d monedas de 25 centavos",c25);
while(x>0.1){
x-=0.1;
c10++;
}
printf("\nRegresar %d monedas de 10 centavos",c10);
while(x>0.05){
x-=0.05;
c5++;
}
printf("\nRegresar %d monedas de 10 centavos",c5);
while(x>=0.01){
c1++;
x-=0.01;
printf("\n%f",x);
}
printf("\nRegresar %d monedas de 10 centavos",c1);
}

1 Respuesta

Respuesta
1
El problema que hay en tu programa es que los números decimales (float) representan valores aproximados, no valores exactos. Entonces si quieres, a partir de valores decimales generar cantidades exactas enteras como en este ejemplo, tienes que trabajar todo en enteros. Es decir, según lees las cantidades en float, lo pasas a enteros con la exactitud que quieras trabajar (en este caso céntimos) y trabajas todo el rato ya con cantidades enteras de céntimos.
Abajo te pego el código con el problema resuelto. Por favor, no olvides finalizar la pregunta y puntuar correctamente. Saludos y gracias
Centro de Formación Cartagena99. Cursos de Programación Java, C, C++, Ada, Matlab, Fortran...
/*Programa que calcula el cambio desplegando las monedas de 25, 10, 5 y 1 centavo
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define ENTER 13 /*13 es la tecla Enter*/
int main(void);
void pausa(void);
void captura(void);
void monedas(int);
int main(){
//clrscr();
captura();
pausa();
}
void pausa(){
printf("\nPresione Enter para continuar\n");
while(getch()!=ENTER);
}
void captura(){
float monto,pago;
int cambio;
printf("Programa que calcula el cambio con monedas");
printf("\nInserte el total a pagar >");
scanf("%f",&monto);
printf("Inserte el dinero recibido >");
scanf("%f",&pago);
cambio=(int)(pago*100)-(int)(monto*100);
printf("Su cambio es %d",cambio);
monedas(cambio);
}
void monedas(int x){
int c25=0,c10=0,c5=0,c1=0;
while(x>=25){
x-=25;
c25++;
}
printf("\n\nRegresar %d monedas de 25 centavos",c25);
while(x>=10){
x-=10;
c10++;
}
printf("\nRegresar %d monedas de 10 centavos",c10);
while(x>=5){
x-=5;
c5++;
}
printf("\nRegresar %d monedas de 5 centavos",c5);
while(x>=1){
c1++;
x-=1;
}
printf("\nRegresar %d monedas de 1 centavos",c1);
}

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas