在Scope C之外更改变量#

时间:2011-02-06 23:10:21

标签: c# scope

我是初学C#程序员,为了提高我的技能,我决定尝试使用Project Euler。网站上的第一个问题要求你找到1000和1000以下的所有倍数的总和。由于我基本上做了两次同样的事情,我做了一个方法来逐步增加一个基数,并添加总和所有的答案都是如此。

public static int SumOfMultiplication(int Base, int limit)
    {
        bool Escape = false;
        for (int mult = 1; Escape == true; mult++)
        {
            int Number = 0;
            int iSum = 0;
            Number = Base * mult;
            if (Number > limit)
                return iSum;
            else
                iSum = iSum + Number;

        }

无论我为两个参数添加什么,它总是返回零。我99%肯定它与变量的范围有关,但我不知道如何修复它。感谢所有帮助。

提前致谢,

萨姆

4 个答案:

答案 0 :(得分:6)

你的循环实际上从未执行过:

bool Escape = false;
for (int mult = 1; Escape == true; mult++)
最初

Escape设置为false,因此第一次测试失败(Escape == true返回false)并跳过循环体。

如果您尝试访问其定义范围之外的变量,编译器会告诉您,这不是问题所在。你也错过了一个返回声明,但这可能是一个错字。

我还要注意,你的代码永远不会检查要添加到总和中的数字是否实际上是3或5的倍数。还有其他问题(例如,iSum是在循环并在每次迭代后初始化为0,但是我会让你解决这个问题,因为这是练习。在这样的情况下,调试器是你的朋友:)

编辑:如果您需要实际逻辑方面的帮助,我会很乐意提供帮助,但我想如果可能的话,您希望自己解决这个问题。

答案 1 :(得分:3)

正如其他人所指出的那样,问题在于控制流程并不像您认为的那样。这是一个常见的初学者问题。

我建议你学习如何使用调试器。初学者经常有这样一个奇怪的想法,他们不允许使用工具来解决他们的编码问题;相反,他们必须通过阅读它来推断程序中的缺陷。一旦程序变得超过一页,人类就不可能做到这一点。调试器是你最好的朋友,所以要了解它的功能非常好

在这种情况下,如果您在调试器中逐步执行代码,则会看到正在评估循环条件,然后跳过循环。那时你不会问“为什么这会返回零?”,你会问“为什么循环体总是被跳过?”显然,这是一个更有成效的问题,因为这实际上是问题所在。

不要在调试器中单步执行任何代码。观察每个变量,观察它如何改变值(顺便说一下,调试器在更改值后立即突出显示监视窗口中的变量),并确保控制流和变量更改完全符合您的预期。注意安静的疑惑;如果有什么不寻常的事情,那么跟踪它,要么了解它为什么是正确的,要么修复它直到它。


关于实际问题:记住15,30,45,60 ......都是两者的倍数三和五,但你只想将它们加到总和上一次。解决Project Euler问题时,我的建议是编写与您尝试解决的代码一样的代码。尝试首先在“伪代码”中写出问题。我将其伪代码为:

sum = 0
for each positive number under 1000:
    if number is multiple of three or five then:
        add number to sum

一旦你拥有了这个伪代码,你就会注意到它的微妙之处。比如,包含1000个?问题是“低于1000”还是“高达1000”?确保你的循环条件考虑到这一点。等等。

程序越接近实际解决的问题,就越有可能是正确的。

答案 2 :(得分:0)

它不会进入for循环,因为条件为false。

Escape == true

返回false

建议:

  • 如果使用条件作为打破循环的限制

    ,则使用for循环要简单得多

    for(int mult = 1; something< limit; mult ++)

    这种方式在大多数情况下你不需要在循环中检查条件

  • 大多数编程语言都有运算符模除法。 http://en.wikipedia.org/wiki/Modulo_operation

    这个问题可能很方便。

答案 3 :(得分:0)

此代码存在一些问题。第一个也是最重要的是,您只使用一次Escape变量。它永远不会在你的for循环中设置为false,所以它没有任何意义。它应该删除。其次,isum在for循环中声明,这意味着每次循环执行时它将继续重新初始化为0。这意味着您只能获得最后一个倍数,而不是所有倍数的加法。这是一个更正的代码示例:

int iSum = 0;
for(int mult = 1; true; mult++)
{
    int Number = Base * mult;
    if(Number > limit)
        return iSum;
    else
        iSum += Number;
}