【问题标题】:IF condition not working as expected - C LanguageIF 条件未按预期工作 - C 语言
【发布时间】:2019-07-13 02:06:50
【问题描述】:

我有以下代码,其中 if 条件似乎没有按预期工作。

例如,如果我输入 0.29,给出的结果是

季度:1 硬币:0 镍:4205264 便士:4

正如您所见,这是不正确的,因为在执行第一个 if 语句后,'if (cents >= 25)' 这将留下 4 的余数,它存储在 'cents' 变量中。这应该意味着接下来的两个“IF”语句返回一个“0”,最后一个 if 语句执行“if (cents >= 1)”。然而,情况并非如此,因为您可以看到 Nickles 返回的值是 4205264。

当你输入 1.17 时结果按预期返回:

季度:4 硬币:1 镍:1 便士:2

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

int main(void)
{
float dollars;
int cents;
int quartersUsed;
int dimesUsed;
int nickelsUsed;
int penniesUsed;

do 
{ 
    dollars = get_float("Float: ");

    while (dollars <= 0) {
        dollars = get_float("Float: ");
    }

    cents = roundf(dollars * 100);
    printf("%i\n", cents);

    if (cents >= 25) {
        quartersUsed= cents / 25;
        cents = cents % 25;
    } 

    if (cents >= 10) {
       dimesUsed = cents / 10;
       cents = cents % 10;
    } 

    if (cents >= 5) {
       nickelsUsed = cents / 5;
       cents = cents % 5;
    } 

    if (cents >= 1) {
       penniesUsed = cents / 1;
       cents = cents % 1;
    } 

    printf("Quarters: %i\n",quartersUsed);
    printf("Dimes: %i\n",dimesUsed);
    printf("Nickels: %i\n",nickelsUsed);
    printf("Pennies: %i\n",penniesUsed);


}
while (dollars == false);

}

【问题讨论】:

  • 这样的作业要教什么并不是很明显。一个好的结果是发现你根本不需要 if 语句。现在变量总是被赋值并且错误消失了。接下来修复美元 == false。

标签: c cs50


【解决方案1】:

你需要初始化你的变量,因为如果你不输入 if 块,在你的例子中发生了什么,你结束打印一个从未初始化过的变量。

在 C 中,不会为您进行初始化,因此如果您不在变量中放置值,它们将具有未定义的值(取决于之前在内存中存在的值)。

【讨论】:

  • 对不起,我可能误解了您的评论,但该变量已在代码顶部的全局变量中初始化。我的理解是,由于作用域链,if语句中的变量可以访问全局变量?关于未定义的变量,我没有收到任何错误
  • 它们不是全局变量,而是main() 的局部变量。所以不,它们还没有被初始化。
  • 所以我的理解是 if 语句中的变量(美分)是一个局部变量,但由于它最初是在 if 语句之外定义的,所以全局变量会在局部变量更新时更新?
  • 或者您可以删除所有条件,然后设置每个变量。计算镍币是否至少有 5 美分并不重要。如果少于 5 美分,则算术结果为 0 镍,但美分数量仍然相同。
  • @Coder “局部变量”是在函数内部声明的变量 - 这里是 main()。如果您在main() 之外声明所有这些变量,即在int main(void) 之前,它们将是全局的。但是,您的代码不需要任何全局变量。正如@Adrien 建议的那样,初始化将解决问题。
【解决方案2】:

请注意,您的 if 子句不仅是不必要的,因为它们还可能使您的某些变量未初始化(这可能是导致输出问题的原因)。 正如您不需要所有这些条件检查一样,您也不需要所有这些变量。请记住,C 程序员倾向于尽可能关注操作和空间的经济性。在下面检查我的实现,将其与您的进行比较,并尝试猜测它节省了多少操作和空间。 (由于您没有发布您的“cs59.h”库,我对其进行了评论并实现了一个始终返回“1.17”的“get_float”函数。)

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

float get_float(const char *)
{
    return 1.17;
}

int main()
{
    float dollars;
    while((dollars = get_float("Float: ")) <= 0);

    int cents = (int) roundf(dollars * 100);
    printf("%i\n", cents);

    printf("Quarters: %i\n", cents / 25);
    printf("Dimes:    %i\n", (cents = cents % 25) / 10);
    printf("Nickels:  %i\n", (cents = cents % 10) / 5);
    printf("Pennies:  %i\n", cents % 5);

    return 0;
}

【讨论】:

  • 谢谢,我已经运行了代码并且运行良好,但我对数学方程方面有点困惑。例如,如果我输入 0.32 转换为 32,结果是 Quarters: 1 Dimes: 0 Nickels: 1 Pennies: 2 (正确),但是当我手动寻找公式时,在这种情况下,我正在做的 Nickels 部分32 % 10 留下 2,然后 2/5 = 0.4 因此对于镍来说不是 1?
  • 请注意,当我打印 Dimes 和 Nickels 时,我对变量 cents 进行了赋值,因此它的值被更新(这些赋值可以在 printf 之外完成,但我在那里做了一些事情简洁)。如果美分从 32 开始,Quarters 将打印 32/25(即 1)。 Dimes 会将美分更新为 32%25(即 7),然后打印 7/10(即 0)。 Nickels 会将美分更新为 7%10(即 7),然后打印 7/5(即 1)。最后,便士将打印 7%5(即 2)。如果您需要进一步的解释,请告诉我!
  • 谢谢,@jango 的清晰解释,真的帮助我理解了它,并且完全理解为什么使用 IF 语句会矫枉过正:)
  • 没问题!祝你的课好运=]
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 2020-11-28
  • 2020-10-23
  • 2017-01-10
相关资源
最近更新 更多