2015-07-17 2 views
5

Я работал над калькулятором с помощью C# и столкнулся с проблемой, с которой я не смог работать.Почему моя профилактика «Divide by Zero» не работает?

В настоящее время, когда пользователь вводит число, деленное на ноль, тогда ответ по умолчанию равен 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. 
} 

Есть ли у кого-нибудь идеи, как я могу это исправить? Это кажется довольно прямым, но я чего-то не хватает.

+8

Вы отсутствующий 'return' или фигурные скобки. Пожалуйста, используйте отладчик для подтверждения. Также убедитесь, что вы поняли правила языка, который используете - C# * не использует значительные пробелы в отличие от некоторых других языков. –

ответ

12

Изменить это:

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

To:

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

Объяснение: условие в 'если' п в коде правильно. И это то, что, как ожидается, - это меняет answer.Text свойство «Неверный ввод», однако чуть позже он изменился снова на этой линии:

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

И потому, что ваше состояние в «если» условие истинно возвращается - ' else 'не был выполнен. Вот почему вы видите 0.00 (значение по умолчанию типа double).

P.S. Итак, добавив оператор return в if, вы просто в основном закончите свой метод. Это как если вы говорите компилятор * «Эй если этот парень пытается divide by zero предупредить его„Ivalid ввода“и ничего не делать, возврат из метода». *

Другой способ разобраться бы :

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. 
+2

@Sayse спасибо. Я объяснил это в своем обновлении. – Fabjan

+0

Операция @DavidArno Else в коде op правильная, потому что она имеет только ОДИН, если предложение и ничего более. Например: else if (symbol == "+") // некоторый код // else if и т. Д. Проверьте мой ответ, он объясняет все это. – Fabjan

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. 
} 
+0

Отличное объяснение, спасибо! – ArnoldM904

Смежные вопросы