Изменение переменных за пределами области видимости C # - PullRequest
0 голосов
/ 07 февраля 2011

Я начинающий программист на C #, и чтобы улучшить свои навыки, я решил попробовать Project Euler. Первая проблема на сайте просит вас найти сумму всех кратных 3 и 5 под 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% уверен, что это как-то связано с областью действия переменных, но я понятия не имею, как это исправить. Вся помощь приветствуется.

Заранее спасибо,

Sam

Ответы [ 4 ]

6 голосов
/ 07 февраля 2011

Ваш цикл фактически никогда не выполняется:

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

Escape изначально имеет значение false, поэтому первый тест не пройден (Escape == true возвращает false) и тело цикла пропускается.

Компилятор сказал бы вам, если бы вы пытались получить доступ к переменным вне их определенной области, так что это не проблема. Вам также не хватает оператора return, но это, вероятно, опечатка.

Я бы также отметил, что ваш код никогда не проверяет, является ли число, добавляемое к сумме, кратным 3 или 5. Также есть и другие проблемы (например, iSum объявлен внутри цикла инициализируется 0 после каждой итерации), но я позволю вам разобраться с этим, так как это практика. Отладчик - ваш друг в таких случаях:)

РЕДАКТИРОВАТЬ: Если вам нужна помощь с реальной логикой, я буду рад помочь, но я думаю, что вы хотите решить это самостоятельно, если это возможно.

3 голосов
/ 07 февраля 2011

Как уже отмечали другие, проблема в том, что поток управления не делает то, что вы думаете, он делает.Это обычная проблема для начинающих.

Я предлагаю вам узнать, как использовать ваш отладчик .У начинающих часто возникает странная идея, что им не разрешают использовать инструменты для решения своих проблем с кодированием;скорее, они должны выяснить дефект в программе, просто прочитав его.Как только программы становятся длиннее страницы, это становится невозможным для людей.Отладчик - ваш лучший друг, так что узнайте его особенности очень хорошо .

В этом случае, если вы пройдете по коду в отладчике, вы увидите, что условие цикла вычисляется, а затем цикл пропускается.В этот момент вы не спросите «почему это возвращает ноль?», Вы спросите «почему тело цикла всегда пропускается?»Ясно, что это гораздо более продуктивный вопрос, потому что здесь на самом деле проблема.

Не пишите любой код, не проходя через него в отладчике.Посмотрите на каждую переменную, посмотрите, как она меняет значение (кстати, отладчик выделяет переменные в окнах наблюдения сразу после того, как они меняют значение) и убедитесь, что поток управления и переменные точно соответствуют ожидаемым.Обратите внимание на тихие сомнения;если что-то кажется необычным, отследите это и либо узнайте, почему это правильно, либо исправьте, пока оно не будет.


Относительно реальной проблемы: запомните, 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"?Убедитесь, что ваше условие цикла учитывает это.И т. Д.

Чем ближе программа читает, как будто проблема действительно решается, тем больше вероятность, что она будет правильной.

0 голосов
/ 07 февраля 2011

Есть несколько проблем с этим кодом. Первое и самое важное, что вы используете переменную Escape только один раз. Он никогда не устанавливается в false в вашем цикле for, поэтому он не имеет никакого значения. Это должно быть удалено. Во-вторых, isum объявлен в вашем цикле for, что означает, что он будет повторно инициализироваться в 0 при каждом выполнении цикла. Это означает, что вы получите только последний множитель, а не все множители. Вот исправленный пример кода:

int iSum = 0;
for(int mult = 1; true; mult++)
{
    int Number = Base * mult;
    if(Number > limit)
        return iSum;
    else
        iSum += Number;
}
0 голосов
/ 07 февраля 2011

Не входит в цикл, потому что условие ложно.

Escape == true

возвращает ложь

Совет:

  • Использование цикла for намного проще, если вы используете условие в качестве предела для прерывания цикла

    для (int mult = 1; что-то

    Таким образом, в большинстве случаев вам не нужно проверять условие в цикле

  • Большинство языков программирования имеют операторное деление по модулю. http://en.wikipedia.org/wiki/Modulo_operation

    Может пригодиться при этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...