2012-03-19 1 views
4

Я начинаю брать базовый курс C#, и у меня возникают проблемы с получением задания на работу. Я построил базовый калькулятор, и он отлично работает. Теперь мне пришлось добавить новую кнопку под названием «Сумма», которая будет принимать входные данные из одного из моих полей (number1Txtbox) и добавить его к себе 10 раз через цикл.Зацикливание 10 раз добавление ввода, с помощью и для цикла while в C#?

Я вылил страницы своей книги C# и не могу понять это. Я понял, как инициализировать цикл с помощью счетчика и т. Д., Я просто не могу заставить это работать на всю жизнь.

Мне сказали использовать цикл for, а затем переключиться на цикл while. Это не имеет для меня никакого смысла, я предположил, что могу сделать это с помощью цикла for. Поэтому мой вопрос:

1) Нужно ли мне вообще переключаться на цикл while, чтобы сделать это?
2) Что я делаю неправильно?

Вот что я до сих пор, и это только делает мою программу заморозить при попытке нажать на кнопку сумму после ввода числа в текстовом поле:

private void sumBtn_Click(object sender, EventArgs e) 
{ 
    int counter; 
    int loopAnswer; 
    int number1; 

    number1 = int.Parse(number1Txtbox.Text); 

    for (counter = 1; counter <= 10; counter++) 
    { 
     loopAnswer = number1 + number1; 
     do 
     { 
      loopAnswer = loopAnswer + number1; 
     } while (counter <= 10); 

     equalsBox.Text = loopAnswer.ToString(); 
    } 
} 

Спасибо, ребята!

+0

Является ли это домашнее задание? –

+2

В дополнение к ответам адрианов, причина, по которой ваша программа зависает, заключается в том, что ваш цикл while имеет условие, что счетчик должен быть меньше или равен 10. Проблема заключается в том, что ваш цикл while находится внутри * цикла, увеличивает счетчик. Это означает, что вы никогда не можете закончить выполнение, потому что цикл for (который увеличивает счетчик) никогда не может завершить одну итерацию. – Brandon

+0

@AnuragRanjhan, его первая строка говорит, что это задание. Поэтому я думаю, что да. – Brandon

ответ

7

Вы смешиваете вещи. Вы либо сделать это:

private void sumBtn_Click(object sender, EventArgs e) 
{ 
    int counter; 
    int loopAnswer = 0; 
    int number1 = int.Parse(number1Txtbox.Text); 

    for (counter = 1; counter <= 10; counter++) 
    { 
     loopAnswer += number1; //same as loopAnswer = loopAnswer + number1; 
    } 
    equalsBox.Text = loopAnswer.ToString(); 
} 

или это:

private void sumBtn_Click(object sender, EventArgs e) 
{ 
    int counter = 1; 
    int loopAnswer = 0; 
    int number1 = int.Parse(number1Txtbox.Text); 

    do 
    { 
     loopAnswer += number1; //same as loopAnswer = loopAnswer + number1; 
     counter++; 
    } while (counter <= 10); 


    equalsBox.Text = loopAnswer.ToString(); 

} 

Кроме того, окончательный ответ (equalsBox.Text = loopAnswer.ToString();) должен быть из петли.

+0

Не должен ли цикл while увеличивать счетчик? – Brandon

+0

@Brandon Да, это должно быть. Aaaah, спешите .... Это исправлено сейчас, спасибо –

+0

Tha nks куча Адриана и всех остальных, я действительно чему-то научился, против того, чтобы просто получить ответ. Мне уже нравится этот сайт! – drowningincoffee

0

Он зависает, потому что, когда он входит в петлю do while, counter не изменяется. Если он никогда не менялся, counter <= 10 всегда верен, поэтому вы получаете бесконечный цикл. Он застрял там.

private void sumBtn_Click(object sender, EventArgs e) 
{ 
    //these should default to 0, but we should to it explicitly, just in case. 
    int loopAnswer = 0; 
    int number1; 

    if(int.TryParse(number1Txtbox.Text, out number1) 
    { 
     for (counter = 1; counter <= 10; counter++) 
     { 
      loopAnswer += number1; 
     } 

     equalsBox.Text = loopAnswer.ToString(); 
    } 
    else 
     equalsBox.Text = "Not A Number"; 
} 

TryParse вот только хорошая практика. Он заботится о ситуации, когда у вас будет ввод текста. Также может использоваться блок try catch.

0
private void sumBtn_Click(object sender, EventArgs e) 
{ 
    int counter; 
    int loopAnswer = 0; 
    int number1; 

    number1 = int.Parse(number1Txtbox.Text); 


    for (counter = 1; counter <= 10; counter++) 
    { 
      loopAnswer += number1; 
    } 


equalsBox.Text = loopAnswer.ToString(); 

} 
0

Ваша программа зависает, потому что

 do 
     { 
      loopAnswer = loopAnswer + number1; 
     } while (counter <= 10); 

не обновляет переменную счетчика на всех. Поэтому счетчик никогда не достигнет 10, поэтому этот цикл никогда не выйдет.

просуммировать в цикле в то время как это сделать

counter = 1; 
do { 
    loopAnswer += number1; 
    counter++; 
} while(counter <= 10); 
0

Ваш внутренний цикл (пока) работает бесконечно, потому что счетчик никогда не увеличивается, поэтому ваша программа зависает. Установите точку останова на линии, чтобы иметь возможность отлаживать вашу программу и лучше понимать, как работают петли.

Для решения этой задачи вам нужен только один цикл, определенно не вложенный петли. Неважно, какой механизм зацикливания вы используете.

0

Этот код вызывает бесконечный цикл (что является причиной замораживания):

for (counter = 1; counter <= 10; counter++) 
{ 
    loopAnswer = number1 + number1; 
    do 
    { 
     loopAnswer = loopAnswer + number1; 
    } while (counter <= 10); 

    equalsBox.Text = loopAnswer.ToString(); 
} 

Infact здесь вы зацикливание от 1 до 10, и для каждой итерации вы выполнить loopAnswer = loopAnswer + number1; до состояния counter <= 10 становится ложный. Но это никогда не происходит, поскольку в вашем do-while переменная счетчика не изменяется, и поэтому программа остается навсегда в первой итерации.

Я думаю, вы должны избавиться от внутреннего do-while и поставить equalsBox.Text = loopAnswer.ToString(); вне цикла for.

0

Ради примера, допустим, что number1 = 4. При выполнении строки loopAnswer = number1 + number1; результирующее значение loopAnswer всегда будет 8. Если вы хотите, чтобы увеличить loopAnswer, то вы должны использовать loopAnswer = loopAnswer + number1;, или сокращенный синтаксис loopAnswer += number1;

что касается использования for цикла по сравнению с do-while, я предполагаю, что это не вопрос об использовании обоих циклов, в то же время, это вопрос использования for петли для иллюстрации концепции, а затем переключиться на используйте цикл do-while, чтобы проиллюстрировать концепцию.

Вы могли бы закончить это упражнение, используя цикл, как это:

for (counter = 1; counter <= 10; counter++) 
{ 
    loopAnswer += number1; 
} 

equalsBox.Text = loopAnswer.ToString(); 

Вы также можете выполнить ту же функциональность с помощью цикла Do-While, как это:

int counter = 1; 
do 
{ 
    loopAnswer += number1; 
    counter++; 
} while (counter <= 10); 

equalsBox.Text = loopAnswer.ToString(); 
Смежные вопросы