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.
Where you retrieve "rechenzeichen" and "zahl_2" simply have a do while around this part of the code so that you can check that the second number will be compatible with the operator.
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)
I think I've understood what "zahl_2" and "rechenzeichen" means. I would refactor this into a separate method so that it does not clutter your main loop with checks but should allow you to continue just now.
Related
I just finished my little 2 Person game, but as soon as i finish to enter the 2 colours it just closes on the next Key pressed. I don't find an error, maybe someone can help me? Or also just tell me how to improve my code. I only recently started programming with C# and am thankful for help
My Programm Code is this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Fahrrad
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Geben sie die Farbe 'blau' oder 'gruen' ein: ");
Velo Velo1 = new Velo(Console.ReadLine());
Console.WriteLine("Geben sie die andere Farbe ein: ");
Velo Velo2 = new Velo(Console.ReadLine());
ConsoleKeyInfo input;
input = Console.ReadKey();
switch(input.Key)
{
case ConsoleKey.UpArrow:
Velo2.Gangwechsel(1);
break;
case ConsoleKey.DownArrow:
Velo2.Gangwechsel(0);
break;
case ConsoleKey.LeftArrow:
Velo2.Bremse(true);
break;
case ConsoleKey.RightArrow:
Velo2.Fortbewegung(true);
break;
case ConsoleKey.W:
Velo1.Gangwechsel(1);
break;
case ConsoleKey.S:
Velo1.Gangwechsel(0);
break;
case ConsoleKey.A:
Velo1.Bremse(true);
break;
case ConsoleKey.D:
Velo1.Fortbewegung(true);
break;
}
}
}
}
And my Class Code is this:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Fahrrad
{
internal class Velo
{
private double gaenge;
private bool bremse;
private string farbe;
private double maxGang;
private bool fahrend;
// Konstruktor
public Velo(string farbe)
{
this.gaenge = 1;
this.farbe = farbe;
if(farbe == "blau")
{
maxGang = 7;
}
else if (farbe == "gruen")
{
maxGang = 3;
}
else
{
Console.WriteLine("Falsche eingabe");
Console.ReadKey();
System.Environment.Exit(1);
}
}
public void Gangwechsel(double schalten)
{
if(schalten == 0)
{
this.gaenge--;
if(this.gaenge == 0 && this.fahrend == true)
{
this.gaenge = 1;
Console.WriteLine("Sie sind bereits im tiefsten gang");
}
}
else if(schalten == 1 && this.fahrend == true)
{
this.gaenge++;
if(this.gaenge > this.maxGang)
{
this.gaenge = this.maxGang;
Console.WriteLine("Sie sind bereits im höchsten Gang");
}
}
else
{
Console.WriteLine("Sie müssen zum Gang wechseln fahren");
}
Console.WriteLine("Sie sind momentan im " + this.gaenge + " gang");
}
public void Bremse(bool bremse)
{
this.bremse = bremse;
if(fahrend == true && this.bremse == true)
{
fahrend= false;
Console.WriteLine("Sie haben die Fahrt beendet");
}
}
public void Fortbewegung(bool fahrend)
{
this.fahrend = fahrend;
if(this.bremse == true && this.fahrend == true)
{
Console.WriteLine("Sie haben die Bremse noch angezogen");
this.fahrend = false;
}
else
{
this.fahrend = true;
Console.WriteLine("Das " + this.farbe + "Fahrrad ist im" + this.gaenge + " Gang losgefahren");
}
}
}
}
You need a game loop that can be terminated by a key.
For example:
static void Main(string[] args)
{
Console.WriteLine("Geben sie die Farbe 'blau' oder 'gruen' ein: ");
Velo Velo1 = new Velo(Console.ReadLine());
Console.WriteLine("Geben sie die andere Farbe ein: ");
Velo Velo2 = new Velo(Console.ReadLine());
ConsoleKeyInfo input;
bool gameIsRunning = true;
while(gameIsRunning)
{
input = Console.ReadKey();
switch(input.Key)
{
// your other rules here
case ConsoleKey.Q:
gameIsRunning = false;
break;
}
}
}
So I tried to code an userinput with ConsoleKeyInfo. Its works. Than I tried to implement an cancellation when Esc is pressed. It works aswell but it cuts off some of my Writeline. When I try the same code with checking for example M it works just fine!
Is someone able to help?
My Code:
class Program
{
static void Main()
{
while (true)
{
string eingabeArtikelnummer, eingabePlatzalter;
Console.Clear();
Console.Write("Ein neuer Artikel wird angelegt:\n\nGeben Sie die Artikelnummer an: ");
eingabePlatzalter = SteuerungUndEingabe();
if (eingabePlatzalter == ConsoleKey.Escape.ToString()) { break; }
else { eingabeArtikelnummer = eingabePlatzalter; }
}
WartenAufUser();
}
static string SteuerungUndEingabe()
{
ConsoleKey input;
string userEingabe = null;
do
{
input = Console.ReadKey().Key;
if (input == ConsoleKey.Escape)
{
userEingabe = input.ToString();
break;
}
userEingabe += input.ToString();
} while (input != ConsoleKey.Enter);
return (userEingabe);
}
static void WartenAufUser()
{
Console.WriteLine("----------------------------------------------------------------------------------------\n\nBeliebige Taste druecken um ins Menue zu gelangen!");
while (Console.ReadKey() == null) { };
}
}
}
This is the output in the Console:
This is how it should be:
Edit:
So I asked my Teacher how to fix this Problem. He had no idea why it occurs but he recommanded me to go around the Problem and change my Writeline to
Console.WriteLine("x\n----------------------------------------------------------------------------------------\n\nBeliebige Taste druecken um ins Menue zu gelangen!");
The "x\n" miraculously avoids the problem :D
I am trying to create a simple switch case with If-Statements code.
Problem:
I don't get any value back.
For Example:
If I put int Temperature = 0; the Code should output "Es ist kalt". But my console doesn't display anything.
using System;
namespace SwitchCase
{
class Program
{
static void Main(string[] args)
{
int Temperatur = 25;
switch (Temperatur)
{
case 1:
if (Temperatur <= 0)
{
Console.WriteLine("Es ist kalt");
}
break;
case 2:
if (Temperatur >= 25)
{
Console.WriteLine("Es ist überdurchschnittlich warm");
}
break;
case 3:
if (Temperatur <= 13)
{
Console.WriteLine("Es ist mild");
}
break;
};
}
}
}
Your code doesn't make much sense. When Temperatur is exactly 1 or 2, it cannot be less than or equal 0 nor greater than or equal 25. So there's no way Temperatur has a value that gets any of the first two branches of the switch selected and additionally satisfies the if in that branch.
Just using if and else if does what you presumably want:
...
if (Temperatur <= 0)
{
Console.WriteLine("Es ist kalt");
}
else if (Temperatur <= 13)
{
Console.WriteLine("Es ist mild");
}
else if (Temperatur >= 25)
{
Console.WriteLine("Es ist überdurchschnittlich warm");
}
...
your if block never reaches a situation where temperature is 0.
you only have cases for temperatures 1, 2 and 3 (case 1:), so if temperature is anything else than those, nothing will happen.
Therefore, you should use if/else statements:
if (Temperatur <= 0)
{
Console.WriteLine("Es ist kalt");
}
else if (Temperatur <= 13)
{
Console.WriteLine("Es ist mild");
}
else
{
Console.WriteLine("Es ist überdurchschnittlich warm");
}
You Just need if-statement:
using System;
public class Example
{
public static void Main()
{
if (Temperatur <= 0)
{
Console.WriteLine("Es ist kalt");
}
else if (Temperatur <= 13)
{
Console.WriteLine("Es ist mild");
}
else if (Temperatur >= 25)
{
Console.WriteLine("Es ist überdurchschnittlich warm");
}
}
}
Problem: How can I restart the following codeblock? My idea is if you enter a character that will return an error message. What is the condition for the loop?
string r_operation;
Console.Write("\tBitte geben Sie ihre Rechenoperation ein: ");
r_operation = Console.ReadLine();
-------------
while (?r_operation = Console.ReadLine())
{
Console.WriteLine("\tUngültige Eingabe. Bitte geben Sie nur Zahlen ein!");
}
You can convert your existing code to use the int.TryParse method, which returns a bool indicating if the input string is a valid number (and sets an out parameter to the converted value):
Console.Write("\tBitte geben Sie ihre Rechenoperation ein: ");
string r_operation = Console.ReadLine();
int result = 0;
while (!int.TryParse(r_operation, out result))
{
Console.WriteLine("\tUngültige Eingabe. Bitte geben Sie nur Zahlen ein!");
Console.Write("\tBitte geben Sie ihre Rechenoperation ein: ");
r_operation = Console.ReadLine();
}
// When we exit the while loop, we know that 'r_operation' is a number,
// and it's value is stored as an integer in 'result'
Another way to do this is to encapsulate the process of getting a strongly-typed number from the user into a method. Here's one I use:
private static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
{
int result;
var cursorTop = Console.CursorTop;
do
{
ClearSpecificLineAndWrite(cursorTop, prompt);
} while (!int.TryParse(Console.ReadLine(), out result) ||
!(validator?.Invoke(result) ?? true));
return result;
}
private static void ClearSpecificLineAndWrite(int cursorTop, string message)
{
Console.SetCursorPosition(0, cursorTop);
Console.Write(new string(' ', Console.WindowWidth));
Console.SetCursorPosition(0, cursorTop);
Console.Write(message);
}
With these helper methods, your code can be reduced to:
int operation = GetIntFromUser("\tBitte geben Sie ihre Rechenoperation ein: ");
And if you wanted to add some additional constraints, the helper method also takes in a validator function (which takes an int and returns a bool indicating whether or not the int is valid). So if you wanted to restrict the numbers to be from 1 to 5, you could do something like:
var result = GetIntFromUser("Enter a number from 1 to 5: ", i => i > 0 && i < 6);
I'm really new to programming and have to write a little programming which tests if a number is smaller or bigger than 500, 2000 and 5000. Now I wrote this but it always takes the first else statement even if the number is bigger than 5000 it says the number is smaller than 500. Anybody knows why? Appreciate every help I get. :)
Here's the code:
double rebe, fuenfh = 500.00, zweit = 2000.00, fuenft = 5000.00;
//zweiPro = 2.00, fuenfPro = 5.00, zehnPro = 10.00;
Console.WriteLine("How big is the number? Wie groß war Ihr Rechnungsbetrag? ");
rebe = Console.Read();
if (rebe >= fuenfh)
{
if (rebe >= zweit)
{
if (rebe >= fuenft)
{
Console.WriteLine("bigger or same as 5000");
Console.ReadLine();
Console.Read();
}
else
{
Console.WriteLine("bigger or same as 2000 but smaller than 5000 // Groesser gleich als 2000 aber kleiner als 5000");
Console.ReadLine();
Console.Read();
}
}
else
{
Console.WriteLine("bigger or same as 500 but smaller than 2000 // Groesser gleich 500 aber kleiner als 2000");
Console.ReadLine();
Console.Read();
}
}
else
{
Console.WriteLine("smaller than 500 // Leider gibt es keinen Rabatt. :(");
Console.ReadLine();
Console.Read();
}
change your input from rebe = Console.Read(); to rebe = Convert.ToDouble( Console.ReadLine());. I don't think you're pulling in the value that you expected.
This is how it could work, converting the input to double (as hinted by mnield) but also making the code more readible in general. Note how much shorter the code gets when you invert your conditionals.
Console.WriteLine("How big is the number?");
double amount = Convert.ToDouble(Console.Readline());
if (amount < 500.0)
{
Console.WriteLine("smaller than 500");
}
else if (amount < 2000.0)
{
Console.WriteLine("bigger or same as 500 but smaller than 2000");
}
else if (amount < 5000.0)
{
Console.WriteLine("bigger or same as 2000 but smaller than 5000");
}
else
{
Console.WriteLine("bigger or same as 5000");
}
Console.ReadLine();
double fuenfh = 500.00, zweit = 2000.00, fuenft = 5000.00;
//zweiPro = 2.00, fuenfPro = 5.00, zehnPro = 10.00;
do
{
Console.WriteLine("\nWie groß war Ihr Rechnungsbetrag? ");
var eingabe = double.TryParse(Console.ReadLine(), out var rebe);
if (eingabe)
{
if (rebe >= fuenft) { Console.Write($"Die eingabe ist größer oder gleich {fuenft}"); }
else if (rebe >= zweit) { Console.Write($"Die eingabe ist größer oder gleich {zweit} aber kleiner als {fuenfh}"); }
else if (rebe >= fuenfh) { Console.Write($"Die eingabe ist größer oder gleich {fuenfh} aber kleiner als {zweit}"); }
else { Console.Write($"Die eingabe ist kleiner als {fuenfh}"); }
}
else { Console.WriteLine("Bitte Zahl eingeben!"); }
} while (true);
This way you'll have whole funktion in the loop!
double.TryParse - converts your input to the double type
if (eingabe) - if numbers are entered it sends you in the if blocks with your variables
do {} while (true) - endless loop to test your function without clicking debug all the time