我一直在使用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)
为了帮助您了解出了什么问题,按照编译器的看法来布置代码会有所帮助,而不是您想象它是如何工作的:
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)
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |