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

时间:2015-07-17 06:33:48

标签: 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.
}

有没有人对如何解决这个问题有任何想法?看起来很简单,但我错过了一些东西。

3 个答案:

答案 0 :(得分:11)

改变这个:

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

致:

if (symbol == "/" && number2 == 0) { answer.Text = "Invalid input."; return; }

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

answer.Text = ans.ToString("n"); // Change label value to a number.

因为你的情况如果'条款返回true - ' else'块没有被执行。这就是为什么你看到0.00(默认值为double类型)的原因。

P.S。 因此,通过向if子句添加return语句,您基本上可以结束您的方法。 就像你对编译器说'"嘿如果这个人试图divide by zero提醒他'输入错误'并且什么都不做,从方法返回"。*

其他解决方法是:

if (divide by zero attempt) { your code here } else
{
    and place rest of your method code here
}

但我不建议这样做,因为它使用了多余的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.

答案 1 :(得分:4)

为了帮助您了解出现了什么问题,它有助于在编译器看到它时放置代码,而不是您想象它的工作方式:

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.

因此,当出现除零情况时,首先将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.
}

答案 2 :(得分:1)

在此处查看C#中if else条件的基础知识 https://msdn.microsoft.com/en-us/library/5011f09h.aspx