Lógica del progtwig de cambio de moneda modular

Mi objective con este progtwig es decir cuántas monedas de cada denominación se le deben dar a un cliente con el supuesto de que las entradas son de 5-95.

He escrito mi progtwig en la mejor forma modular que puedo, y parece estar funcionando. Sin embargo, el progtwig muestra 0 para cada denominación.

¿Cuál es el problema?

void PrintDisplay(void) { printf("Enter an amount to calculate change: "); return; } int GetChange(void) { int change; scanf("%d%*c", &change); return(change); } int GetCoins(int cents, int coin) { int quantity; quantity = cents / coin; return(quantity); } int GetNewChange(int cents, int coin) { int newchange; newchange = cents - coin; return(newchange); } void PrintResult(int fifties, int twenties, int tens, int fives) { printf("The amount of each coin denomination you should give are: \n"); printf("Fifty cent coins: %d \n", fifties); printf("Twenty cent coins: %d \n", twenties); printf("Ten cent coins: %d \n", tens); printf("Five cent coins: %d \n", fives); return; } int main(int input) { int FiftyCentAmount; int TwentyCentAmount; int TenCentAmount; int FiveCentAmount; PrintDisplay(); GetChange(); FiftyCentAmount = GetCoins(input, 50); GetNewChange(input, 50); TwentyCentAmount = GetCoins(input, 20); GetNewChange(input, 20); TenCentAmount = GetCoins(input, 10); GetNewChange(input, 10); FiveCentAmount = GetCoins(input, 5); GetNewChange(input, 5); PrintResult(FiftyCentAmount, TwentyCentAmount, TenCentAmount, FiveCentAmount); system("pause"); return(0); } 

GetChange () devuelve la entrada del usuario, pero no está guardando el resultado de la llamada. Usted quiere

 input = GetChange(); 

Una función tiene una entrada (los parámetros), una salida (valor de retorno y quizás parámetros pasados ​​por un puntero) y un algoritmo que genera la salida de la entrada.

A veces, la función no tiene realmente una entrada o salida como la PrintDisplay . Esto generalmente está bien si hace que su código sea más legible / esté mejor organizado de esa manera. Su función es superflua porque crea una función (que tiene cuatro líneas) para una simple statement de una línea. No es intrínsecamente malo sino superfluo.

El valor de retorno “aparece” en la posición donde se realizó la llamada a la función. Así que si lo haces

 input = GetChange(); 

input se establecerá en el valor de retorno de GetChange .

Arreglado esto después de la respuesta de Daves, pero no vio que todas sus funciones Get... también tienen un valor de retorno que simplemente ignora en su código.

Entonces, al corregirlos, su código debería funcionar (o no ver la edición).

Todas sus funciones (excepto PrintResult y la entrada de texto) son básicamente oneliners. Y

Se reducen a

 int GetCoins(int cents, int coin) { return cents / coin; } int GetNewChange(int cents, int coin) { return cents - coin; } 

Entonces, un progtwig mejorado (en tu diseño) se vería así:

 int main() { int leftover_change; printf("Enter an amount to calculate change: "); leftover_change= GetChange(); int FiftyCentAmount = GetCoins(leftover_change, 50); leftover_change = GetNewChange(leftover_change, 50); int TwentyCentAmount = GetCoins(leftover_change, 20); leftover_change = GetNewChange(leftover_change, 20); int TenCentAmount = GetCoins(leftover_change, 10); leftover_change = GetNewChange(leftover_change, 10); int FiveCentAmount = GetCoins(leftover_change, 5); leftover_change = GetNewChange(leftover_change, 5); PrintResult(FiftyCentAmount, TwentyCentAmount, TenCentAmount, FiveCentAmount); if(leftover_change >0) { printf("there are %d cents left\n", leftover_change); } system("pause"); return 0; } 

Esto todavía viola el concepto DRY (No se repita), podría solucionarlo (al menos parcialmente) reemplazando los números mágicos con variables defin o const.

Aún mejor sería un bucle que recorre las diferentes monedas. Pero esto necesita un poco más de pensamiento y el uso de matrices.

Edición: no revisé el algoritmo en primer lugar, y mi reducción de scanf fue una tontería, pero tenía prisa, así que aquí hay una versión que funciona. Para completar esta respuesta, pero como dijo Dave, debe verificar su algoritmo antes de implementarlo.

 int GetNewChange(int cents, int coin) { return cents % coin; //this is the modulus operator }