2015-07-17 15 views
5

Ho lavorato a una calcolatrice usando C# e ho trovato un problema che non sono riuscito a superare.Perché la mia prevenzione "Divide by Zero" non funziona?

Attualmente quando un utente immette un numero diviso per zero, la risposta predefinita è 0.00, quando invece dovrebbe essere non valida.

Non ho idea del perché e dopo averlo armeggiato per un po 'non sono stato in grado di capirlo. Ecco il codice rilevante:

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

Qualcuno ha qualche idea su come posso risolvere questo problema? Sembra piuttosto semplice ma mi manca qualcosa.

+8

È mancante 'parentesi return' o ricci. Si prega di utilizzare il debugger per confermare. Assicurati inoltre di essere chiaro sulle regole del linguaggio che stai utilizzando - C# * non * usa spazi bianchi significativi a differenza di altre lingue. –

risposta

12

Modifica questo:

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

A:

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

Spiegazione: La condizione di 'se' clausola nel codice è corretto. E lo fa ciò che è previsto - cambia proprietà answer.Text a "Input non valido", tuttavia un po 'più tardi non viene modificata su questa linea:

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

E perché la sua condizione in 'se' clausola restituito vero -' il blocco else non è stato eseguito. Ecco perché vedi 0.00 (valore predefinito di tipo double).

P.S. Quindi, aggiungendo la proposizione return a if se si termina in pratica il metodo. E 'come se tu dici a compilatore * "Hey se questo ragazzo sta cercando di divide by zero lui 'ingresso Ivalid' allarme e non fare nulla, di ritorno dal metodo". *

Altro modo per risolvere il problema sarebbe quello di :

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

Ma non lo consiglierei perché utilizza la dichiarazione e le cifre {} ridondanti. Puoi evitarlo tutto usando if() {....; ritorno; } nel tuo caso.

Si può anche trarre vantaggio dall'utilizzo di switch blocco e il codice potrebbe essere riscritta a qualcosa di simile:

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 Grazie. L'ho spiegato nel mio aggiornamento della risposta. – Fabjan

+0

@DavidArno L'istruzione di Else nel codice op è corretta perché ha solo una clausola if se non altro. In questo modo: else if (symbol == "+") // qualche codice // else se e così via. Controlla la mia risposta aggiorna spiega tutto. – Fabjan

4

per aiutarvi a capire che cosa è andato storto, aiuta a porre il codice come il compilatore vede, piuttosto che come si immagina che sta funzionando:

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. 

Così, quando si verifica la divisione per situazione a zero, prima answer.Text è impostato su "input non valido.", quindi il flusso di controllo scende all'ultima riga ed è sovrascritto con 01.236.342,077067 millions.

Il punto saliente del motivo per cui è davvero importante utilizzare {} anche per istruzioni singole.Farlo e il codice funziona come ci si aspetta:

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

Ottima spiegazione, grazie! – ArnoldM904

Problemi correlati