C printf不工作和其他故障

C printf不工作和其他故障,c,printf,cs50,printf-debugging,C,Printf,Cs50,Printf Debugging,我终于让我的更改程序打印出一些数字,而不是抛出浮点异常。然而,现在它有点偏离了。程序没有给出2个25美分、1个10美分、1个5美分和2个便士,而是只选择了1便士,我无法从对代码的条件或结构的任何检查中找出原因。我在每个if语句中添加了一些检查,但即使是打印出来的也没有,我现在非常困惑 #include <stdio.h> #include <cs50.h> #include <math.h> int changeF(float change, float

我终于让我的更改程序打印出一些数字,而不是抛出浮点异常。然而,现在它有点偏离了。程序没有给出2个25美分、1个10美分、1个5美分和2个便士,而是只选择了1便士,我无法从对代码的条件或结构的任何检查中找出原因。我在每个if语句中添加了一些检查,但即使是打印出来的也没有,我现在非常困惑

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int changeF(float change, float  div)
{
    int c = change/div;
    return c;
}

int main(void)
{
    printf("Enter the bill amount:");
    float bill = GetFloat();
    printf("Enter the payment amount:");
    float payment = GetFloat();
    float q = .25; float di = .1; float n = .05; float p = .01;
    float change = payment - bill;
    do
    {
        if (bill >= 0.0 && payment >= 0.0 && change >= 0.0)
        {
            if (change >= q)
            {
                int quarters = changeF(change, q);
                printf("%d quarters\n", quarters);
                change = change - (.25*quarters);
            }
            if (change >= di)
            {
                int dimes = changeF(change, di);
                printf("%d dimes\n", dimes);
                change = change - (.1*dimes);
            }
            if (change >= n)
            {   
                int nickels = changeF(change, n);
                printf("%d nickels\n", nickels);
                change = change - (.05*nickels);
                printf("%f change", change);
            }
            if (change >= p)
            {
                int pennies = changeF(change, p);
                printf("%d pennies\n", pennies);
                change = change - (.01*pennies);
                printf("%f", change);
            }
        }
    }
    while (change > 0.0);
}

请在字符串末尾追加换行符,再试一次:

printf("Enter the bill amount:\n");
原因:stdout是行缓冲的,您需要给它一个换行符来刷新输出


或者通过fflushstdout;显式刷新它

不要以美元为单位,而要以美分为单位,使用整数算法进行计算。您仍然可以让用户通过四舍五入输入美元金额:

int bill = GetFloat() * 100 + 0.5;
值的常数当然也将是整数,即25、10、5和1

那么changeF函数就是一个整数除法。你可以放弃一分钱的除法,只需把剩下的零钱换成一分钱


你甚至不需要做。。。while循环。只要计算一次就足够了。寻找25美分、10美分和5美分,其余的是便士。完成。无需重新迭代

使用所有警告和调试信息gcc-Wall-g编译。然后在一些跟踪中使用调试器gdbadd,显示账单、付款和更改在账单>=0.0之前。请不要让所有浮点数后面都有“f”。0.0被解释为0.0d,然后必须向下转换为浮点,这可能会导致奇怪。当然不是在这种情况下,但是在处理浮动时养成一个好习惯。这似乎与所描述的问题无关。