Делать петли и пока петли - PullRequest
0 голосов
/ 09 сентября 2010

Когда я набираю слово «Андреа», программа вылетает. Я предполагаю, но я думаю, что это потому, что я нахожусь в цикле, и он не знает, когда остановиться. Если я прав, вы можете сказать мне, как выйти из цикла. когда я ставлю перерыв, он говорит мне, что цикл не заканчивается.

private void button1_Click(object sender, EventArgs e)
        {
             do Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
          while  (textBox1.Text == "Andrea");
        break;           
        do Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
          while (textBox1.Text == "Brittany"); 
        do Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
           while  (textBox1.Text == "Eric");
        break;          
            MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling");

Ответы [ 7 ]

6 голосов
/ 09 сентября 2010

В качестве условий цикла у вас есть textBox1.Text == "Andrea" и textBox1.Text == "Brittany", но вы, кажется, не меняете это значение нигде в коде.Следовательно, у вас есть бесконечный цикл, который приведет к сбою вашей программы.

Я не уверен, что ваша программа должна делать, но вы можете выйти из цикла:

  • Используйте оператор break; для выхода из цикла.
  • Измените условие цикла на что-то, что может в конечном итоге привести к false.
  • Изменение свойства textBox.Text где-нибудьв теле цикла.

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

Редактировать:

Я сделал это с помощью операторов if, но сейчас я пытаюсь сделать то же самое с циклами

без цели, просто пытаясь научиться программировать

В ответ на вышеприведенные комментарии я расскажу вам, как заменить оператор if на цикл.Просто сделайте это так:

// Check the condition before executing the code.
while (textBox1.Text == "Andrea") {
    // Execute the conditional code.
    Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();

    // We actually only want to execute this code once like an if statement,
    // not while the condition is true, so break out of the loop.
    break;
}

В исходном сообщении вы используете цикл do while вместо цикла while.Следует помнить, что do while выполняется один раз наверняка, независимо от того, выполняется ли его условие.Он только проверяет условие, чтобы увидеть, должно ли оно выполняться дополнительное время.С другой стороны, цикл while проверяет условие перед его выполнением, что означает, что вы можете заменить его оператором if.

Следует помнить, что это плохая практика.Если вы хотите выполнить код в зависимости от определенного условия, используйте оператор if.Если вы хотите выполнить код несколько раз определенное количество раз или когда какое-либо условие выполняется, используйте цикл.

4 голосов
/ 09 сентября 2010

На первый взгляд кажется, что у вас бесконечный цикл.Как только вы наберете «Andrea» в textBox1 и нажмете кнопку 1, он будет постоянно обновлять Commission.Text, не прерывая поток для обработки какого-либо дополнительного ввода.должен делать?И почему он делает это в цикле?

4 голосов
/ 09 сентября 2010

Я подозреваю, что под while вы на самом деле имеете в виду if. В противном случае вы получаете сообщение об ошибке или исключение при сбое приложения? Можете ли вы обернуть эту функцию в try / catch, чтобы увидеть, что является исключением?

Редактировать Чтобы уточнить, попробуйте этот метод body:

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if(textBox1.Text == "Andrea")
                {
                    Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
                }
                else if(textBox1.Text == "Brittany")
                {
                    Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
                }
                else 
                {    
                    MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling");
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Bad Spelling");
            }
        }
    }
}
1 голос
/ 09 сентября 2010

Конструкция do { x } while (y) запускается x один раз, а затем продолжает непрерывно работать x, пока y верно.

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

do
{
    // This will just run over and over...
}
while (condition); // ...because this is always true.

break; // This isn't even in the loop!

Другими словами, точка, в которой вы пытаетесь добавить свой break (основываясь на комментарии, который вы оставили в другом ответе), находится внецикл, поэтому ваш код работает бесконечно.

Теперь, похоже, вы действительно пытаетесь использовать do / while для эмуляции оператора if, предположительно каквызов самому себе.Если это так, сделайте себе одолжение и откажитесь от этой идеи.

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

Тем не менее, вы можете эмулировать if с while:

while (condition)
{
    // Execute code once.
    break; // Then just quit.
}
1 голос
/ 09 сентября 2010

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

private void button1_Click(object sender, EventArgs e)
{
    switch(textBox1.Text)
    {
        case "Andrea":
        case "Brittany":
            Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
            break;
        default:
            MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling");
    }
}

Если вы хотитечтобы делать разные комиссии на человека, вам нужно разделить его (в приведенном ниже примере Бретань получает другое значение комиссии):

private void button1_Click(object sender, EventArgs e)
{
    switch(textBox1.Text)
    {
        case "Andrea":
            Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
            break;
        case "Brittany":
            Commission.Text = (Convert.ToDouble(textBox2.Text) / 15).ToString();
            break;
        default:
            MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling");
    }
}
0 голосов
/ 09 сентября 2010

Просто предположение, но, как говорит FacticiusVir, вы, вероятно, хотите использовать условные выражения вместо циклов:

private void button1_Click(object sender, EventArgs e)
{
    if (textBox1.Text == "Andrea" || textBox1.Text == "Brittany")
    {
        Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
    }
    else
    {
        MessageBox.Show("The spelling of the name is incorrect", "Bad Spelling");
    }
}
0 голосов
/ 09 сентября 2010

Глядя на этот кусок:

do Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
  while  (textBox1.Text == "Andrea");

... что вы ожидаете, если textBox1.Text == "Andrea"?

То, что делает программа, проверяет ваш сравнительный тест, затем, если оно истинно, оно выполняет то, что находится внутри блока do / while, затем оно проверяет сравнительный тест, затем, если оно верно, оно делает то, что находится внутри Блок do / while, затем проверяет сравнительный тест, затем, если это правда, он делает то, что находится внутри блока do / while, затем ...

Получите очко?

Вы используете do / while циклы, если условие изменится внутри цикла (или вы явно выйдете из него).

Вместо этого вы хотите изменить его на что-то вроде

if( textBox1.Text == "Andrea" )
  Commission.Text = (Convert.ToDouble(textBox2.Text) / 10).ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...