【问题标题】:Loop in C. The first loop in the program doesn't work and is infiniteC中的循环。程序中的第一个循环不起作用并且是无限的
【发布时间】:2016-02-13 09:32:12
【问题描述】:

我不明白为什么第一个循环不起作用。即使填充的欠浮动实际上大于0也是一个无限循环。为什么循环不起作用?

#import <cs50.h> 
#import <stdio.h>

int main(void)
{
    float owed = -1 ;

    while (owed < 0) 
    {
        printf("O hai! How much change is owed?\n") ;
        float owed = GetFloat() ;
        owed = owed * 100 ;
    }

    int coins = 0 ;

    while (owed >= 25)
    {
        owed = owed - 25 ;
        coins = coins + 1 ;
    }

    while (owed >= 10)
    {
        owed = owed - 10 ;
        coins = coins + 1 ;
    }

    while (owed >= 5)
    {
        owed = owed - 5 ;
        coins = coins + 1 ;
    }

    while (owed >= 1) 
    {
        owed = owed - 1 ;
        coins = coins + 1 ;
    }

    printf("%i\n", coins) ;
}

【问题讨论】:

  • GetFloat() 的代码在哪里?

标签: c loops cs50


【解决方案1】:

你需要改变

float owed = GetFloat() ;

owed = GetFloat() ;

因为您有两个具有不同范围的owed。 (你没有改变外面的!)

编辑

PS: 您可以更改密码:

while (owed >= 25)
{
    owed = owed - 25 ;
    coins = coins + 1 ;
}

int new_coins = ((int)owed)/25;
coins += new_coins;
owed = owed - 25.0f * new_coins;

【讨论】:

  • 如何更改外欠,同时确保不能实现负值?
  • 只要做上面的更正。您甚至可以将乘法移到循环之外。注意 -ve * +ve = -ve
  • 感谢您的帮助,其余的我都解决了。代码现在可以工作了:)
  • @M.Schalkers - 如果您满意,请接受答案(Thomas 下面,因为他需要声誉)
【解决方案2】:

实际上,这里有两个作用域。主要功能范围和您的第一个循环块范围内。当您在循环块中更改声明的变量时,您不会更改主函数的变量。

您的条件while (owed &lt; 0) 永远不会为真,因为您在主函数范围内的变量owed 永远不会改变。

你不需要在循环中声明一个新变量而是使用在主函数中声明的变量,所以你需要删除float

while (owed < 0) 
{
    printf("O hai! How much change is owed?\n") ;
    owed = GetFloat() ;
    owed = owed * 100 ;
}

【讨论】:

  • 感谢您的帮助。我在想这个问题可能与此有关。但是,如果我摆脱了 owed 的第一个定义,而不是在我的代码的其余部分(也在循环之外),就不再定义 owed。有什么方法可以让我创建这样一个循环,然后仍然可以在这个循环之外使用给定的浮点数?
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2013-06-25
  • 2020-02-08
  • 2013-02-22
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
相关资源
最近更新 更多