2011-02-06 4 views
0

Я начинающий программист на C#, и чтобы улучшить свои навыки, я решил попробовать Project Euler. Первая проблема на сайте просит вас найти сумму всех кратных 3 и 5 менее 1000. Так как я по существу делаю одно и то же дважды, я сделал способ умножить базовое число поэтапно и добавить сумму все ответы togethor.Изменение переменных за пределами области действия C#

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% уверен, что он имеет какое-то отношение к сфере действия переменных, но я не знаю, как это исправить. Вся помощь приветствуется.

Спасибо заранее,

Сэм

ответ

6

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

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

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

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

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

EDIT: Если вам нужна помощь в действительной логике, я буду рад помочь, но я полагаю, что вы захотите самостоятельно разобраться, если это возможно.

+0

WOW! Спасибо! Я думал, что если второй параметр был прав, цикл будет EXIT, а не продолжать работать. Код никогда не проверяет, что сумма фактически кратна, поскольку она убегает от логики, что если x * y = q, остаток q/x будет равен нулю. – sam

+0

Yup, условие цикла должно возвращать true, чтобы цикл продолжался, а не наоборот;). Удачи вам в учебе, продолжайте. Эйлер - отличный сайт, я сам многое пережил сам (и «большинством из них» я имею в виду «все остальное было слишком тяжело для меня: D). –

0

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

Escape == true 

возвращает ложные

Совет:

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

    для (INT мульт = 1; то < limit; mult ++)

    Таким образом, в большинстве случаев вы не используете n eed для проверки состояния в петле

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

    Это может пригодиться, если учесть эту проблему.

0

С этим кодом связано несколько проблем. Первое и самое главное, что вы используете переменную Escape только один раз. Он никогда не устанавливается в ложь внутри цикла 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; 
} 
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»? Убедитесь, что это условие цикла. И так далее.

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

Смежные вопросы