【问题标题】:printf not working and other troublesprintf 不工作和其他问题
【发布时间】:2014-09-24 12:20:22
【问题描述】:

我终于让我的更改程序打印出一些数字而不是抛出浮点异常。然而,现在它稍微偏离了。该程序没有给出 2 个四分之一、1 个硬币、1 个镍和 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);
}

【问题讨论】:

  • 编译时包含所有警告和调试信息 (gcc -Wall -g)。然后使用调试器 (gdb)
  • 添加一些跟踪,显示 if (bill >= 0.0) 之前的账单、付款和找零请注意,您的所有浮点数后面都应该有“f”。 0.0 被解释为 0.0d,然后必须下转换为浮点数,这可能会导致奇怪。在这种情况下,当然不是,但是在处理浮动时养成一个好习惯

标签: c printf cs50 printf-debugging


【解决方案1】:

在字符串末尾添加换行符再试一次:

printf("Enter the bill amount:\n");

原因:stdout 是行缓冲的,您需要给它一个换行符来刷新输出。

或通过fflush(stdout); 显式刷新它。

【讨论】:

  • 这似乎与所描述的问题无关。
【解决方案2】:

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

int bill = GetFloat() * 100 + 0.5;

这些值的常量当然也是整数,即 25、10、5 和 1。

那么你的changeF 函数只是一个整数除法。 (您可以放弃除以一便士 - 只需将其余的零钱便士。)

您甚至不需要do...while 循环。只计算一次就足够了。寻找硬币,硬币和镍币,其余的是便士。完毕。无需重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多