为什么我的"零分治"预防不起作用?

Arn*_*904 5 c#

我一直在使用C#编写计算器,遇到了一个我无法解决的问题.

目前,当用户输入除以零的数字时,答案默认为0.00,而应该是无效的.

我不知道为什么,经过一段时间的修修,我无法弄明白.这是相关代码:

private void button1_Click(object sender, EventArgs e)
{
                double number1, number2, ans; // Identify variables as double to account for decimals.
                number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
                number2 = Convert.ToDouble(num2.Text); // 
                ans = 0.0;
                string symbol = modifier1.Text;

                if (symbol == "/" && number2 == 0) // This part seems to be broken.
                    answer.Text = "Invalid input.";
                else
                    if (symbol == "+")
                        ans = number1 + number2;
                    else if (symbol == "-")
                        ans = number1 - number2;
                    else if (symbol == "/")
                        ans = number1 / number2;
                    else if (symbol == "*")
                        ans = number1 * number2;
                    else
                        ans = 0;

                    answer.Text = ans.ToString("n"); // Change label value to a number.
}
Run Code Online (Sandbox Code Playgroud)

有没有人对如何解决这个问题有任何想法?这似乎很直接,但我错过了一些东西.

Fab*_*jan 11

改变这个:

if (symbol == "/" && number2 == 0) // This part seems to be broken.
                answer.Text = "Invalid input.";
Run Code Online (Sandbox Code Playgroud)

至 :

if (symbol == "/" && number2 == 0) { answer.Text = "Invalid input."; return; }
Run Code Online (Sandbox Code Playgroud)

说明: 代码中"if"子句中的条件是正确的.它完成了预期的工作 - 它将answer.Text属性更改为"无效输入",但稍后它会在此行再次更改:

answer.Text = ans.ToString("n"); // Change label value to a number.
Run Code Online (Sandbox Code Playgroud)

并且因为'if'子句中的条件返回true - 'else'块没有被执行.这就是你看到0.00(double类型的默认值)的原因.

PS因此,通过向returnif子句添加语句,您只需基本结束您的方法.就像你对编译器说的那样"嘿,如果这个家伙试图divide by zero提醒他'输入无效'并且什么都不做,那么从方法中回来".*

解决它的其他方法是:

if (divide by zero attempt) { your code here } else
{
    and place rest of your method code here
}
Run Code Online (Sandbox Code Playgroud)

但我不建议这样做,因为它使用了多余的else语句和{}数字.你可以使用if(){....; 返回; 在你的情况下.

您也可以从使用switch块中受益,您的代码可能会重构为:

double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) { answer.Text = "Invalid input."; return;}
switch(symbol)
{
   case "+": ans = number1 + number2; break;
   case "-": ans = number1 - number2; break;
   case "*": ans = number1 * number2; break;
   case "/": ans = number1 / number2; break;
   default : answer.Text = "Invalid sign."; return;
}                

answer.Text = ans.ToString("n"); // Change label value to a number.
Run Code Online (Sandbox Code Playgroud)

  • @Sayse谢谢.我在答案更新中解释了这一点. (2认同)

Dav*_*rno 5

为了帮助您了解出了什么问题,按照编译器的看法来布置代码会有所帮助,而不是您想象它是如何工作的:

double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) // This part seems to be broken.
    answer.Text = "Invalid input.";
else if (symbol == "+")
    ans = number1 + number2;
else if (symbol == "-")
    ans = number1 - number2;
else if (symbol == "/")
    ans = number1 / number2;
else if (symbol == "*")
    ans = number1 * number2;
else
    ans = 0;

answer.Text = ans.ToString("n"); // Change label value to a number.
Run Code Online (Sandbox Code Playgroud)

因此,当发生被零除的情况时,首先answer.Text设置为“无效输入。”,然后控制流下降到最后一行并被覆盖0.0

巧妙地突出了为什么{}即使对于单个语句也使用它真的很重要。这样做,代码将按您的预期工作:

double number1, number2, ans; // Identify variables as double to account for decimals.
number1 = Convert.ToDouble(num1.Text); // Convert the contents of the textBox into a double.
number2 = Convert.ToDouble(num2.Text); // 
ans = 0.0;
string symbol = modifier1.Text;

if (symbol == "/" && number2 == 0) // This part seems to be broken.
{
    answer.Text = "Invalid input.";
}
else 
{
    if (symbol == "+")
    {
        ans = number1 + number2;
    }
    else if (symbol == "-")
    {
        ans = number1 - number2;
    }
    else if (symbol == "/")
    {
        ans = number1 / number2;
    }
    else if (symbol == "*")
    {
        ans = number1 * number2;
    }
    else
    {
        ans = 0;
    }

    answer.Text = ans.ToString("n"); // Change label value to a number.
}
Run Code Online (Sandbox Code Playgroud)