2015-06-16 2 views
-3

Я пытаюсь использовать цикл do-while, но он ничего не делает после ввода ввода и инициирования события нажатия кнопки. Предполагается рассчитать сумму и список за все последующие годы, пока не будет < = 40 000. Я могу заставить программу работать без цикла, но не с ней.do-while loop freezing program

private double InterestEarned(double AMT, double AIR = 0.07) 
    {       
     return AMT * AIR; 
    } 

    private double InheritanceAmount(double BAL, double IR, double AIR = 0.07) 
    {    
     return (BAL * IR * AIR) - 40000; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      double AMT; 
      AMT = (double.Parse(textBox1.Text)); 

      if (radioButton1.Checked==true) 
      { 
       do 
       { 
       const double IR3 = 0.03; 
       double BAL, IR, earn; 
       int year = 2014; 

       AMT = (double.Parse(textBox1.Text)); 
       IR = IR3; 
       year++; 
       BAL = InheritanceAmount(AMT, IR); 
       earn = InterestEarned(AMT); 

       listBox1.Items.Add("You have chosen a 3% inflation rate. Your investment starts at" + AMT.ToString("C") + " and earn 7% a year. You withdraw $40,000 a year."); 
       listBox1.Items.Add("Year" + "\t" + "Interest Earned" + "\t" + "Balance"); 
       listBox1.Items.Add(year++ + "\t" + earn.ToString("C") + "\t" + BAL.ToString("C")); 
       } while (AMT > 40000); 
      } 
       else if (radioButton2.Checked==true) 
       { 
        do 
        { 
        const double IR4 = 0.04; 
        double BAL, IR, earn; 
        int year = 2014; 

        AMT = (double.Parse(textBox1.Text)); 
        IR = IR4; 
        year++; 
        BAL = InheritanceAmount(AMT, IR); 
        earn = InterestEarned(AMT); 

        listBox1.Items.Add("You have chosen a 4% inflation rate. Your investment starts at" + AMT.ToString("C") + " and earn 7% a year. You withdraw $40,000 a year."); 
        listBox1.Items.Add("Year" + "\t" + "Interest Earned" + "\t" + "Balance"); 
        listBox1.Items.Add(year++ + "\t" + earn.ToString("C") + "\t" + BAL.ToString("C")); 
        } while (AMT > 40000); 
       } 
      else 
      {     
       MessageBox.Show("Please select an inflation rate.");      
      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
+2

Выполняет ли перебор кода в отладчике какие-либо идеи? – HABO

+0

Как в стороне, дублирование цикла можно избежать, выбирая его из блока 'if' – Setsu

+0

Кроме того, поскольку свойство' Checked' 'RadioButton' является логическим, я бы [отказался от явного сравнения] (http://stackoverflow.com/a/3685018/1378739). – Setsu

ответ

2

Д.О. ... в то время как цикл условно от значения AMT быть больше, чем 40000. Но ценность АМТ приходит только от пользователя (с помощью текстового поля) и никогда не меняется снова. Таким образом, цикл просто происходит вечно (который, поскольку он выполняется на вашем потоке пользовательского интерфейса, заблокирует пользовательский интерфейс). Либо ваше условие неверно, либо вам нужно изменить значение AMT в цикле.

+0

Да, он должен уменьшаться с каждым циклом и переходить через отладчик, я вижу, что он зацикливается, просто не правильно. Я думаю, что мои методы не настроены правильно. Благодаря! –

0

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

Первое, что нужно сделать здесь комментировать строку, где AMT переменная устанавливается обратно в свое первоначальное значение:

do 
{ 
    const double IR3 = 0.03; 
    double BAL, IR, earn; 
    int year = 2014; 

    //Comment the line below 
    //AMT = (double.Parse(textBox1.Text)); 
    IR = IR3; 
    year++; 
    BAL = InheritanceAmount(AMT, IR); 
    earn = InterestEarned(AMT); 

    //... 

} while (AMT > 40000); 

Следующая вещь, которую вы должны сделать, это увеличить AMT на основе значения earn :

AMT += earn; 

последняя вещь, которую вы должны рассмотреть способ избежать бесконечного цикла, когда AMT исходное значение < = 0 или когда проценты устанавливаются в 0.

+2

Когда изменился AMT? Этот ответ неполный. У него бесконечный цикл даже с вашими изменениями. – dman2306

+0

эта линия находится в обеих петлях – Plutonix

+0

@dman 2306. Хм, вы правы. Я предположил, что InheritanceAmount и InterestEarned увеличивают значение AMT, но это не –