2015-10-06 11 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”的含义。我会将此重构为一个单独的方法,以便它不会让您的主循环与检查混乱,但应该允许您继续。