【问题标题】:do-while loop freezing programdo-while 循环冻结程序
【发布时间】:2015-06-16 00:37:49
【问题描述】:

我尝试使用 do-while 循环,但在我输入输入并启动按钮单击事件后它什么也没做。它应该计算出随后所有年份的数量和清单,直到它

    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);
        }

【问题讨论】:

  • 在调试器中单步执行代码是否会产生任何见解?
  • 顺便说一句,可以通过将其从 if 块中取出来避免循环重复
  • 另外,由于RadioButtonChecked 属性是布尔值,我会do away with the explicit comparison
  • 这意味着我可以像 (radioButton1.Checked) 一样写它

标签: c# loops calculator do-while


【解决方案1】:

do...while 循环的条件是 AMT 的值大于 40000。但 AMT 的值仅来自用户(通过文本框),并且永远不会再更改。所以循环永远发生(因为它在你的 UI 线程上运行,所以会锁定 UI)。要么您的条件错误,要么您需要在循环中更改 AMT 的值。

【讨论】:

  • 是的,它应该随着每个循环而减少并逐步通过调试器,我可以看到它正在循环,只是不正确。我想我的方法设置不正确。谢谢!
【解决方案2】:

您的 while 条件基于 AMT 变量 (> 40000)。在 do while 之前正确初始化该变量。但是,您还会在 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);

接下来您应该做的是根据earn 值增加AMT:

AMT += earn;

您应该考虑的最后一件事是在 AMT 原始值

【讨论】:

  • AMT 何时更改?这个答案是不完整的。即使你的改变,他也有一个无限循环。
  • 该行在两个循环中
  • @dman 2306。嗯,你是对的。我假设 InheritanceAmount 和 InterestEarned 增加了 AMT 值,但它不是
  • 我搞砸了,需要使用 BAL 值而不是 AMT。 AMT 是最初的用户输入,而 BAL 是我需要减少和测试的。
  • 那么你必须在循环之外对 BAL 值进行初始化,因为它不会在每次迭代之间增加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多