0

目标:

实现一个程序,计算给用户找零所需的最小硬币数量。

问题:

程序没有正确执行。我相当确定我的问题本质上是合乎逻辑的,但也可能是由于我对正确格式缺乏经验。

额外的信息:

我在代码中添加了一个打印函数来确定问题出在哪里。“test1”是广播,“test2”不是。

我正在使用 cs50.h 库的一些本地函数:

  • get_float(); - 从用户那里获取一个浮点值并存储它。

请不要为我修复我的代码!我需要自己学会这样做。我只需要帮助找到我的逻辑错误或格式错误。是的,我知道它没有效率。

我正在寻找的示例:

  • “您的问题在 X 行,您的值使得 VARIABLE 永远不会达到 0。”

  • “在 C 中,你不能格式化 '( x < 0 );' - 你必须说'(x<0);'。”

代码演练:

程序从用户那里获得 2 个浮点值,“金额”和“成本”。“金额”是客户给了多少钱,“成本”是物品的成本。

程序找到“金额 - 成本”来确定应支付多少零钱。该值存储在“diff”中。

程序从 'diff' 中减去 0.25 并将变量 'quarter' 加 1。

程序从 'diff' 中减去 0.10 并将 1 加到变量 'dime' 中。

...

程序会打印出需要使用多少 25 美分硬币、硬币、镍币、便士,才能以最有效的方式为客户提供零钱。

假设只能使用硬币。

代码:

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


int main()
{

    float cost;
    do
    {
        printf("How much did it cost?\n");
        cost = get_float();
    }
    while (cost < 0);

    float amount;
    do
    {
        printf("How much did you pay?\n");
        amount = get_float();
    }
    while (amount < cost);




    int quarter = 0;
    int dime = 0;
    int nickel = 0;
    int penny = 0;
    float diff = amount - cost;
    do
    {
        while (diff >= 0.25)
        {
            diff = diff - .25;
            quarter++;
        }
        printf("test1");


        while (.10 <= diff < .25)
        {
            diff = diff - 0.10;
            dime++;
        }
        printf("test2");


        while (0.05 <= diff < .10)
        {
            diff = diff - 0.05;
            nickel++;
        }


        while (0.01 < diff < 0.05)
        {
            diff = diff - 0.01;
            penny++;
        }


        while (diff == 0.01)
        {
            penny++;
            diff = 0;
        }


    } // end bracket for do function
    while (diff > 0);



    if (diff == 0)
        {
            printf("Your change consists of:\n");
            printf("%i quarters.\n", quarter);
            printf("%i dimes.\n", dime);
            printf("%i nickels.\n", nickel);
            printf("%i pennies.\n", penny);
            exit(0);
        }

    if (diff < 0)
        {
            printf("Your change consists of:\n");
            printf("%i quarters.\n", quarter);
            printf("%i dimes.\n", dime);
            printf("%i nickels.\n", nickel);
            printf("%i pennies.\n", penny);
            exit(0);
        }

} // end bracket for int main

预期结果:

程序如前所述工作。

实际结果:

程序未完全执行。'test1' 是广播,'test2' 不是。

4

3 回答 3

0

首先,您需要检查浮点运算的准确性

也就是说,像这样的陈述

 while (.10 <= diff < .25)

不做你认为他们做的事。使用您在 C 中使用的方法无法链接关系运算符。

您需要使用&&运算符将​​它们耦合起来,例如

 while (.10 <= diff && diff < .25) {
于 2017-12-22T13:55:30.223 回答
0

问题在于与后者不0.05 <= diff < .10一样0.05 <= diff && diff < .10 的比较,后者按照您的意图进行,前者将 0 或 1 与 0.10 进行比较。如果 diff 大于 0.05,则 '0.05 <= diff' 的计算结果为 1,然后与 0.10 进行比较。你写的和你写的一样(0.05 <= diff) < .10

于 2017-12-22T13:55:43.663 回答
0

首先,你的循环是永恒的。而(金额<成本);<-- 数量和成本永远不会改变。所以...

其次,你不能写像(1 <= 2 < 3)这样的条件,它并不意味着你认为它意味着什么。它单独执行运算符,因此您最终会得到类似于 (1 <= 2) < 3 的结果,第一个是 1(真)或 0(假)。

于 2017-12-22T14:11:35.323 回答