【问题标题】:Changing variables outside of Scope C#在 Scope C# 之外更改变量
【发布时间】:2011-02-06 23:10:21
【问题描述】:

我是一名初学者 C# 程序员,为了提高我的技能,我决定尝试一下 Project Euler。该网站上的第一个问题要求您找到 1000 下的所有 3 和 5 的倍数之和。由于我基本上做了两次相同的事情,所以我做了一个方法来递增地乘以一个基数,并将总和相加所有的答案一起。

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% 确定它与变量的范围有关,但我不知道如何解决它。感谢所有帮助。

提前致谢,

山姆

【问题讨论】:

    标签: c# scope


    【解决方案1】:

    您的循环从未真正执行:

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

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

    如果您试图访问定义范围之外的变量,编译器会告诉您,所以这不是问题所在。您还缺少一个 return 语句,但这可能是一个错字。

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

    编辑:如果您在实际逻辑方面需要帮助,我很乐意提供帮助,但我认为您希望尽可能自己解决。

    【讨论】:

    • 哇!谢谢你!我想如果第二个参数为真,循环将退出,而不是继续运行。代码从不检查总和实际上是一个倍数,因为它运行的逻辑是,如果 x * y = q,q/x 的余数将为零。
    • 是的,循环条件必须返回 true 才能使循环继续,而不是相反;)。祝你学习顺利,继续努力。 Euler 是一个很棒的网站,我自己已经完成了大部分(“大部分”我的意思是“其余的对我来说太难了 :D)。
    【解决方案2】:

    正如其他人所指出的,问题在于控制流并没有按照您的想法执行。这是一个常见的初学者问题。

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

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

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


    关于实际问题:请记住,15、30、45、60... 都是 both 三和五的倍数,但您只想将它​​们加到总和中一次。在解决 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”?确保您的循环条件考虑到这一点。以此类推。

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

    【讨论】:

      【解决方案3】:

      因为for条件为假,所以不进入for循环。

      Escape == true
      

      返回假

      建议:

      • 如果使用条件作为中断循环的限制,使用 for 循环会简单得多

        for (int mult = 1; something

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

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

        这个问题可能会派上用场。

      【讨论】:

        【解决方案4】:

        这段代码有几个问题。首先,也是最重要的,您只使用了一次 Escape 变量。它永远不会在你的 for 循环中设置为 false,因此它没有任何用途。它应该被删除。其次,在你的 for 循环中声明了 isum,这意味着每次循环执行时它都会被重新初始化为 0。这意味着您只会得到最后一个倍数,而不是所有倍数的加法。这是一个更正的代码示例:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-07
          • 1970-01-01
          • 2016-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多