将更改分发给客户的程序。 (C)

时间:2017-12-22 13:51:44

标签: c cs50 relational-operators

目标:

实施一个程序,计算给用户更改所需的最小硬币数。

问题:

程序无法正常执行。我很确定我的问题本质上是合乎逻辑的,但也可能是由于我对正确格式化的经验不足造成的。

额外信息:

我在代码中添加了一个打印功能,以确定问题所在。 “test1”是广播,“test2”不是。

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

  • get_float(); - 从用户获取浮动值并存储它。

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

我正在寻找的例子:

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

  • “在C中,您无法格式化'(x <0);' - 你必须说'(x&lt; 0);'。“

代码演练:

程序从用户获得2个浮点值,'金额'和'成本'。 “金额”是指客户提供的金额,“成本”是该项目的成本。

程序发现'金额 - 成本'以确定欠多少变更。该值存储在'diff'。

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

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

...

程序打印需要使用多少个季度,尺寸,镍,便士,以尽可能最有效的方式为客户进行更改。

假设只能使用硬币。

代码:

#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'不是。

3 个答案:

答案 0 :(得分:0)

首先,您需要查看accuracy for floating point arithmetic

那说,像

这样的陈述
&&

不按照您的想法行事。使用您在C中使用的方法无法链接关系运算符。

您需要使用 while (.10 <= diff && diff < .25) { 运算符将它们耦合,例如

for(l in clusters) clusters.plot <- clusters.plot %>% 
 add_polygons(x=dplyr::filter(polygons.df,cluster == l)$polygon.x,
              y=dplyr::filter(polygons.df,cluster == l)$polygon.y,
              line=list(width=2,color="black"),
              fillcolor='transparent', inherit = FALSE)

答案 1 :(得分:0)

问题在于0.05 <= diff && diff < .10之类的比较与(0.05 <= diff) < .10不同。后者按照您的意图行事,前者将0或1与.10进行比较。如果diff大于0.05,那么&lt; 0.05&lt; = diff&#39;计算结果为1,然后将其与.10进行比较。您撰写的内容与{{1}}相同。

答案 2 :(得分:0)

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

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