c - 我需要编写一个分配更改程序。我完成了代码,但有一些问题。请帮我调试代码

标签 c coin-change

《C 中的问题解决和程序设计》一书中有一个问题。我编写了代码,但循环没有终止。

#include <stdio.h>
#include <math.h>
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies);
int main(void)
{
    int c_dollars, c_quarters = 0, c_dimes = 0, c_nickels = 0, c_pennies = 0;
    double a_paid, a_due, m_change, coin_change;
    printf("Enter the amount paid> ");
    scanf("%lf", &a_paid);
    printf("Enter the amount due> ");
    scanf("%lf", &a_due);
    m_change = a_paid - a_due;
    c_dollars = floor(m_change);
    coin_change = m_change - floor(m_change);
    // shows coin change
    printf("\n%f\n", coin_change);
    change(coin_change, &c_quarters, &c_dimes, &c_nickels, &c_pennies);
    printf("Change is dollars: %d$, quarters: %d, dimes: %d, nickels: %d,\
pennies: %d", c_dollars, c_quarters, c_dimes, c_nickels, c_pennies);
    return(0);
}
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies)
{
    int q = 0, d = 0, n = 0, p = 0;
     do{
        if(coin_change >= 0.25){
            q++;
            *quarters = *quarters + q;
            coin_change = coin_change - q*0.25;
        }
        else if( coin_change >= 0.10){
            d++;
            *dimes = *dimes + d;
            coin_change = coin_change - 0.1;
        }
        else if( coin_change  >=  0.05){
            n++;
            *nickels = *nickels + n;    
            coin_change = coin_change - (n*0.05);
        }
        else if(coin_change >= 0.01){
            p++;
            *pennies = *pennies + p;
            coin_change = coin_change - (p*0.01);
        }
    }while(coin_change>0);
}

谢谢你, 我解决了问题。正确的代码是

#include <stdio.h>
#include <math.h>
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies);
int main(void)
{
    int c_dollars, c_quarters = 0, c_dimes = 0, c_nickels = 0, c_pennies = 0;
    double a_paid, a_due, m_change, coin_change;
    printf("Enter the amount paid> ");
    scanf("%lf", &a_paid);
    printf("Enter the amount due> ");
    scanf("%lf", &a_due);
    m_change = a_paid - a_due;
    c_dollars = floor(m_change);
    coin_change = (int)((m_change - floor(m_change)) * 100 + 0.5);
    // shows coin change (int)((m_change - floor(m_change)) * 100 + 0.5)
    //coin_change = coin_change * 100;
    printf("\n%f\n", coin_change);

    change(coin_change, &c_quarters, &c_dimes, &c_nickels, &c_pennies);
    printf("Change is dollars: %d$, quarters: %d, dimes: %d, nickels: %d,\
pennies: %d", c_dollars, c_quarters, c_dimes, c_nickels, c_pennies);
    return(0);
}
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies)
{
    int q = 1, d = 1, n = 1, p = 1;
     do{
        if(coin_change >= 25){
            *quarters = *quarters + q;
            coin_change = coin_change - 25;
        }
        else if( coin_change >= 10){
            *dimes = *dimes + d;
            coin_change = coin_change - 10;
        }
        else if( coin_change  >=  5){
            *nickels = *nickels + n;    
            coin_change = coin_change - 5;
        }
        else if(coin_change >= 1){
            *pennies = *pennies + p;
            coin_change = coin_change - 1;
        }
    }while (coin_change >= 1);
}

最佳答案

将货币视为 float 并不是一个好主意; float 的精度有限,并且(更糟糕)限制它们可以表示的小数部分。

如果您更好地描述您的问题,就会更容易提供更具体的帮助。

关于c - 我需要编写一个分配更改程序。我完成了代码,但有一些问题。请帮我调试代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704403/

相关文章:

c - 减少字符串中的重复字符,同时保持允许的最大重复字符数

php - 使用最佳面额找零*考虑到使用降序单位可能不会产生正确的结果

硬币数量有限的硬币找零

algorithm - 确定是否可以用 N 个面额找零,每个面额只使用一次并且最多使用 k 个硬币

c - 如何在 C 中打印毫秒数?

c - 如何将十六进制数读入 C 中的无符号整数

c++ - 在Money更改程序中正确计算美元-C++

不同硬币的硬币变化上限不同吗?

c - 如何以原子方式解锁和销毁互斥体

c - 错误 : subscripted value is neither array nor pointer nor vector Need for class