I'm programming a Consolecalculator in C#. My problem is that I don't know how to handle the DivideByZeroExeption in the correct way. I want the user to have the chance to change the the incorrect "0" into another number. That should happen in the same calculation.
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;
}
}
}
If I understand what you're asking correctly, you simply want to prevent the case where the divisor in the division operation is 0 and prompt the user for a new divisor in that case. This could be handled with a check at the time of the initial input, or you could adjust your division method like this:
//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);
}
}
You could also do something similar with a while loop. Ultimately, it would be better to check for the 0 before calling the division, though -- that way you don't need to duplicate the checks for whether the input is a number, etc. The basic logic is the same -- write the prompt and read the input until you get a valid nonzero input.