C 此解决方案不接受任何浮动

C 此解决方案不接受任何浮动,c,cs50,C,Cs50,目前,在cs50x的一个习题集“现金”中,这是一个简单的“询问欠了多少零钱,然后计算需要多少硬币”任务,所以这里不是询问解决方案,但我不明白为什么这不起作用 虽然它确实要求输入,但当我输入一个浮点数(如5.96)时,它只是挂起。没有回报,没有任何错误。我得把它关上。另一件事是while循环在设置为0时执行相同的操作,这是为了获得硬币的确切数量而使用的方法 我知道这段代码有多低效,还有更简单的方法。我只想了解其中的原因,以避免今后犯同样的错误。谢谢 #include <stdio.h>

目前,在cs50x的一个习题集“现金”中,这是一个简单的“询问欠了多少零钱,然后计算需要多少硬币”任务,所以这里不是询问解决方案,但我不明白为什么这不起作用

虽然它确实要求输入,但当我输入一个浮点数(如5.96)时,它只是挂起。没有回报,没有任何错误。我得把它关上。另一件事是while循环在设置为0时执行相同的操作,这是为了获得硬币的确切数量而使用的方法

我知道这段代码有多低效,还有更简单的方法。我只想了解其中的原因,以避免今后犯同样的错误。谢谢

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


int main(void)
{
    // changes and other containers
    int p = 1;
    int n = 5;
    int d = 10;
    int q = 25;
    int x = 0;
    float c;
    // get how much change is owed in float
    do
    {
        c = get_float("Change owed: ");
    }
    while (c < 0);
    // int conversion to avoid imprecision
    int a = round(c * 100);
    // 1 because 0 spits out an unknown error
    while (a >= 1)
    {
        // if the converted amount is bigger than a quarter
        if (a >= q)
        {
            // x = number of coins, a = amount left
            x = a / q;
            a = a % q;
        }

        else if (a >= d)
        {
            x = x + a / d;
            a = a - a % d;
        }

        else if (a >= n)
        {
            x = x + a / n;
            a = a - a % n;
        }

        else
        {
            x = x + a / p;
            a = a - a % p;
        }
    }
    printf("%i\n", x);
    printf("%i\n", a);
}

#包括
#包括
#包括
内部主(空)
{
//更改和其他容器
int p=1;
int n=5;
int d=10;
int q=25;
int x=0;
浮点数c;
//获取浮动中所欠的零钱
做
{
c=获得浮动(“欠下的更改:”);
}
c<0;
//int转换以避免不精确
int a=圆形(c*100);
//1,因为0吐出未知错误
while(a>=1)
{
//如果换算金额大于四分之一
如果(a>=q)
{
//x=硬币数量,a=剩余金额
x=a/q;
a=a%q;
}
如果(a>=d),则为else
{
x=x+a/d;
a=a-a%d;
}
如果(a>=n),则为else
{
x=x+a/n;
a=a-a%n;
}
其他的
{
x=x+a/p;
a=a-a%p;
}
}
printf(“%i\n”,x);
printf(“%i\n”,a);
}

多亏了WhozCraig,我才发现我的逻辑出了问题

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


int main(void)
{
    // changes and other containers
    int p = 1;
    int n = 5;
    int d = 10;
    int q = 25;
    int x = 0;
    float c;
    // get how much change is owed in float
    do
    {
        c = get_float("Change owed: ");
    }
    while (c < 0);
    // int conversion to avoid imprecision
    int a = round(c * 100);
    // 1 because 0 spits out an unknown error
    while (a >= 1)
    {
        // if the converted amount is bigger than a quarter
        if (a >= q)
        {
            // x = number of coins, a = amount left
            x = a / q;
            a = a % q;
        }

        else if (a >= d)
        {
            x = x + a / d;
            a = a % d;
        }

        else if (a >= n)
        {
            x = x + a / n;
            a = a % n;
        }

        else
        {
            x = x + a / p;
            a = a % p;
        }
    }
    printf("%i\n", x);
    printf("%i\n", a);
}

#包括
#包括
#包括
内部主(空)
{
//更改和其他容器
int p=1;
int n=5;
int d=10;
int q=25;
int x=0;
浮点数c;
//获取浮动中所欠的零钱
做
{
c=获得浮动(“欠下的更改:”);
}
c<0;
//int转换以避免不精确
int a=圆形(c*100);
//1,因为0吐出未知错误
while(a>=1)
{
//如果换算金额大于四分之一
如果(a>=q)
{
//x=硬币数量,a=剩余金额
x=a/q;
a=a%q;
}
如果(a>=d),则为else
{
x=x+a/d;
a=a%d;
}
如果(a>=n),则为else
{
x=x+a/n;
a=a%n;
}
其他的
{
x=x+a/p;
a=a%p;
}
}
printf(“%i\n”,x);
printf(“%i\n”,a);
}

您需要对此进行调试。你会发现你的逻辑,比如
a=a-a%d错了。你是个明星。非常感谢。请为这个问题创建一个答案,以便将其从未回答的问题列表中删除。好的,我知道了。关于:
int a=round(c*100)
函数:
round()
需要一个
double
参数并返回一个
double
值。。尝试将该双精度值填充到
int
中容易出错。建议使用:
100.0
floor()是一个合理的转换。考虑<代码>长A= Ln圆(C* 100);<代码>以更好地处理拐角情况
c*100
可能不精确,因此请开始
c*100.0
更可能是精确的。我不知道lround和double舍入。非常感谢。谢谢