2015-10-06 114 views
-3

我正在用C#編程一個Consolecalculator。我的問題是,我不知道如何以正確的方式處理DivideByZeroExeption。我希望用戶有機會將不正確的「0」更改爲另一個數字。這應該發生在相同的計算中。如何處理DivideByZeroExeption

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace gmaare_consolen_rechner_1._0 
{ 
    class Program 
    { 
     //Program Start 
     public static void Main(string[] args) 
     { 
      //jaNein String um zu ermitteln ob erneut eine Rechnung gestellt werden soll 
      //Der Operator wird in den rechenzeichen String eingelesen 
      string jaNein, rechenzeichen = (null); 
      //Start der Rechnerschleife 
      do { 

       int zahl_1 = Convert.ToInt32(null); //erste Zahl einlesen 
       zahl_1 = (Fehlerklasse.fehlerzahl_1(zahl_1)); //erste Zahl weitergeben 

       rechenzeichen = (Fehlerklasse.fehlerRechenzeichen(rechenzeichen)); //rechenzeichen einlesen 

       int zahl_2 = Convert.ToInt32(null); //zeite Zahl einlesen 
       zahl_2 = (Fehlerklasse.fehlerzahl_2(zahl_2)); //zweite Zahl weitergeben 

       var ergebnis = Ergebnis.rechenmethode(zahl_1, zahl_2, rechenzeichen); 
       Console.WriteLine(ergebnis); //ergebnis wird ausgelesen 


       Console.WriteLine("Möchten sie erneut eine Rechnung stellen ? (ja/nein)"); //Frage an den Benutzer 

       //Start einer schleife zur Ermittlung von jaNein 
       do 
       {   
        jaNein = Console.ReadLine(); 
        if (!(jaNein == "ja" | jaNein == "nein")) 
        { 
         Console.WriteLine("Ungültige Antwort, bitte wählen sie (ja/nein)"); 
        } 
       } 
       while (!(jaNein == "ja" | jaNein == "nein")); //löscht alles geschriebene in der Konsole 

       Console.Clear(); 
      } 

      while (jaNein == "ja"); //Führe die Rechnerschleife aus, solange jaNein "ja" ist 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace gmaare_consolen_rechner_1._0 
{ 
    class Rechner 
    { 
     //Implementieren der Klasse Fehlerklasse 
     Fehlerklasse fehlerbehen = new Fehlerklasse(); 
     //Methode zum Plusrechnen 
     public int plus(int zahl_1, int zahl_2) 
     { 
      return zahl_1 + zahl_2; 
     } 
     //Methode zum Minusrechnen 
     public int minus(int zahl_1, int zahl_2) 
     { 
      return zahl_1 - zahl_2; 
     } 
     //Methode zum Malrechnen 
     public int mal(int zahl_1, int zahl_2) 
     { 
      return zahl_1 * zahl_2; 
     } 
     //Methode zum Geteiltrechnen 
     public int geteiltdurch(int zahl_1, int zahl_2) 
     {   
      if(zahl_2!= 0) 
      {    
       return zahl_1/zahl_2; 
      }  
      else 
      { 
       Console.WriteLine("Die Division durch 0 ist verboten!"); 
       return zahl_2; 
      } 


     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace gmaare_consolen_rechner_1._0 
{ 
    class Ergebnis 
    { 
     //Methode zur Ermittlung des Operators 
     public static int rechenmethode(int zahl_1, int zahl_2, string rechenzeichen) 
     { 

      //var ergebnis auf 0 gesetzt 
      var ergebnis = 0; 
      //Klassen rechnen und Fehlerklasse implementiert 
      Rechner rechnen = new Rechner(); 
      Fehlerklasse fehlerbehen = new Fehlerklasse(); 
      //Switchanweisung zur Ermittlung des Operators 
      switch (rechenzeichen) 
      { 
       case "+": 
        ergebnis = rechnen.plus(zahl_1, zahl_2); 

        break; 
       case "-": 
        ergebnis = rechnen.minus(zahl_1, zahl_2); 

        break; 
       case "*": 
        ergebnis = rechnen.mal(zahl_1, zahl_2); 

        break; 
       case "/": 
        ergebnis = rechnen.geteiltdurch(zahl_1, zahl_2); 
        break; 
      } 
      //Gibt die Variable ergebnis zurück 
      return ergebnis; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace gmaare_consolen_rechner_1._0 
{ 
    class Fehlerklasse 
    { 

     //Methdoe zum Sicherstellen dass zahl_1 eine Zahl ist 
     public static int fehlerzahl_1(int zahl_1) 

     { 
      bool tryAgain = true; 
      while (tryAgain) 
      { 
       try 
       { 
        zahl_1 = Convert.ToInt32(Console.ReadLine()); 
        tryAgain = false; 
       } 
       catch (FormatException) 

       { 
        Console.WriteLine("Geben sie eine gültige Zahl ein!"); 
       } 
       catch (OverflowException) 
       { 
        Console.WriteLine("Die Zahl ist zu gross, geben sie eine gültige Zahl ein!"); 
       } 
      } 
      return zahl_1; 
     } 
     //Methdoe zum Sicherstellen dass zahl_2 eine Zahl ist 
     public static int fehlerzahl_2(int zahl_2) 

     { 
      bool tryAgain = true; 
      while (tryAgain) 
      { 
       try 
       { 
        zahl_2 = Convert.ToInt32(Console.ReadLine()); 
        tryAgain = false; 
       } 
       catch (FormatException) 
       { 
        Console.WriteLine("Geben sie eine gültige Zahl ein!"); 
       } 
       catch (Exception) 
       { 
        Console.WriteLine("Die Zahl ist zu gross, geben sie eine gültige Zahl ein!"); 
       } 
      } 
      return zahl_2; 
     } 
     //Methode um zu verhindern dass andere Zeichen als +,-,*,/ als Operator verwendet werden 
     public static string fehlerRechenzeichen (string rechenzeichen) 
     { 
      bool tryAgain = true; 
      while (tryAgain) 
      { 
       try 
       { 
        rechenzeichen = Console.ReadLine(); 
        switch (rechenzeichen) 
        { 
         case "+": 
          break; 
         case "-": 
          break; 
         case "*": 
          break; 
         case "/": 
          break; 
         default: 
          throw new FormatException(); 
        } 
        tryAgain = false; 
       } 
       catch (FormatException) 
       { 
        Console.WriteLine("Geben sie ein gültiges Rechenzeichen ein! (+,-,*,/)"); 
       } 
      } 
      return rechenzeichen; 
     } 


    } 
} 
+0

我提醒你昨天有類似的問題。你能否只寫下你的代碼中有問題的部分?我懷疑這是你卡住的整個代碼,也許我們可以幫助你更好,如果你試圖限制任務 – HimBromBeere

+0

在你調用'rechnen.geteiltdurch'之前的某個時間點,你不能驗證用戶輸入嗎?這樣他們可以被提示重新輸入他們的意見。 –

+0

請用英文編寫您的代碼,以便人們瞭解正在發生的事情。 –

回答

0

如果我明白你的要求是正確的,你只是想防止除法運算中的除數爲0的情況,並在這種情況下提示用戶輸入新的除數。這可以通過檢查在最初輸入的時間來處理,或者你可以調整你的劃分方法是這樣的:

//Methode zum Geteiltrechnen 
     public int geteiltdurch(int zahl_1, int zahl_2) 
     {   
      if(zahl_2!= 0) 
      {    
       return zahl_1/zahl_2; 
      }  
      else 
      { 
       Console.WriteLine("Die Division durch 0 ist verboten!"); 
       Console.Write("Please enter another divisor: "); 
       zahl_2 = Convert.ToInt32(Console.ReadLine()); 
       //You'll want to do some validation here. 
       return geteiltdurch(zahl_1, zahl_2); 
      } 
     } 

你也可以做一個while循環類似的東西。最終,在調用分區之前檢查0會更好 - 這樣您就不需要重複檢查輸入是否是數字等。基本邏輯是相同的 - 寫入提示並閱讀輸入,直到獲得有效的非零輸入。

0

如果您檢索「rechenzeichen」和「zahl_2」只是有一個做,而周圍的這部分代碼,這樣就可以檢查第二個數字將與運營商兼容。

var avoidedDivideByZero = false; 
do 
{ 
    int zahl_2 = Convert.ToInt32(null); 
    zahl_2 = (Fehlerklasse.fehlerzahl_2(zahl_2)); 

    if(rechenzeichen != @"/" || zahl_2 != 0) 
    { 
     avoidedDivideByZero = true; 
    } 
    else 
    { 
     Console.WriteLine(@"Cannot divide by 0, please enter another number."); 
    } 
} 
while(!avoidedDivideByZero) 

我想我明白了「zahl_2」和「rechenzeichen」的含義。我會將此重構爲一個單獨的方法,以便它不會讓您的主循環與檢查混亂,但應該允許您繼續。