Du hast in Was ist die Konsole angefangen und bist über Variablen, Datentypen, Vergleiche, Bedingungen und Schleifen bis hierher gekommen. Zeit, das alles einmal zusammen in einem echten kleinen Programm einzusetzen: einem Taschenrechner.
Der Plan
Unser Taschenrechner soll:
- nach einer ersten Zahl a fragen,
- nach einem Rechenzeichen (
+,-,*oder/) fragen, - nach einer zweiten Zahl b fragen,
- das Ergebnis berechnen und ausgeben,
- fragen, ob wir noch eine Berechnung machen wollen.
Bei den ersten drei Punkten müssen wir jeweils prüfen, ob die Eingabe überhaupt gültig ist - und falls nicht, erneut fragen. Genau dafür nutzen wir do-while, das du schon aus Wiederholungen kennst.
Schritt 1: Zahl a einlesen
Vorher noch eine kleine Änderung gegenüber den bisherigen Beispielen: a und b deklarieren wir diesmal nicht in Main, sondern direkt in der Klasse - also im Klassenscope. Damit sind sie in der ganzen Klasse sichtbar, nicht nur innerhalb von Main. Ein guter Anlass, sich den Scope-Begriff aus Variablen nochmal in Erinnerung zu rufen:
internal class Program
{
static double a;
static double b;
static void Main(string[] args)
{
// ...
}
}
Jetzt lesen wir a genauso ein wie vorher - nur ohne sie neu zu deklarieren (kein double mehr davor), wir weisen ihr nur noch einen Wert zu:
string eingabeA;
bool istZahlA;
do
{
Console.Write("Zahl a: ");
eingabeA = Console.ReadLine();
istZahlA = char.IsDigit(eingabeA[0]);
if (istZahlA == false)
{
Console.WriteLine("Das ist keine Zahl, versuch es nochmal.");
}
}
while (istZahlA == false);
a = double.Parse(eingabeA);
Schritt 2: Rechenzeichen einlesen
Beim Rechenzeichen reicht "ist es eine Ziffer" nicht - wir müssen prüfen, ob es genau eines von +, -, * oder / ist. Dafür nutzen wir switch - und einen kleinen Trick, den du dort noch nicht gesehen hast: Mehrere case-Zeilen können sich ohne break dazwischen denselben Block teilen.
char operatorZeichen;
bool istGueltig;
do
{
Console.Write("Rechenzeichen (+ - * /): ");
operatorZeichen = Console.ReadLine()[0];
switch (operatorZeichen)
{
case '+':
case '-':
case '*':
case '/':
istGueltig = true;
break;
default:
istGueltig = false;
Console.WriteLine("Unbekanntes Rechenzeichen, versuch es nochmal.");
break;
}
}
while (istGueltig == false);
Schritt 3: Zahl b einlesen
Genau das gleiche Vorgehen wie bei Zahl a - auch b bekommt nur einen Wert zugewiesen, keine neue Deklaration:
string eingabeB;
bool istZahlB;
do
{
Console.Write("Zahl b: ");
eingabeB = Console.ReadLine();
istZahlB = char.IsDigit(eingabeB[0]);
if (istZahlB == false)
{
Console.WriteLine("Das ist keine Zahl, versuch es nochmal.");
}
}
while (istZahlB == false);
b = double.Parse(eingabeB);
Schritt 4: Berechnen
Jetzt wissen wir sicher, dass a und b Zahlen sind und operatorZeichen eines von + - * / ist. Deshalb brauchen wir diesmal keinen default-Fall mehr - wir haben ja schon geprüft, dass nur diese vier Fälle vorkommen können:
double ergebnis = 0;
switch (operatorZeichen)
{
case '+':
ergebnis = a + b;
break;
case '-':
ergebnis = a - b;
break;
case '*':
ergebnis = a * b;
break;
case '/':
ergebnis = a / b;
break;
}
Console.WriteLine(a + " " + operatorZeichen + " " + b + " = " + ergebnis);
Schritt 5: Nochmal?
Zum Schluss verpacken wir den kompletten Ablauf von oben in eine ganz normale while-Schleife, gesteuert über eine eigene bool-Variable:
bool repeat = true;
while (repeat)
{
// ... die Schritte 1 bis 4 von oben ...
Console.Write("Nochmal? (j/n) ");
string weiter = Console.ReadLine();
if (weiter != "j")
{
repeat = false;
}
}
Das komplette Programm
Und so sieht alles zusammengesetzt aus - diesmal inklusive Klasse und den beiden Feldern a und b:
namespace ConsoleApp1
{
internal class Program
{
static double a;
static double b;
static void Main(string[] args)
{
bool repeat = true;
while (repeat)
{
string eingabeA;
bool istZahlA;
do
{
Console.Write("Zahl a: ");
eingabeA = Console.ReadLine();
istZahlA = char.IsDigit(eingabeA[0]);
if (istZahlA == false)
{
Console.WriteLine("Das ist keine Zahl, versuch es nochmal.");
}
}
while (istZahlA == false);
a = double.Parse(eingabeA);
char operatorZeichen;
bool istGueltig;
do
{
Console.Write("Rechenzeichen (+ - * /): ");
operatorZeichen = Console.ReadLine()[0];
switch (operatorZeichen)
{
case '+':
case '-':
case '*':
case '/':
istGueltig = true;
break;
default:
istGueltig = false;
Console.WriteLine("Unbekanntes Rechenzeichen, versuch es nochmal.");
break;
}
}
while (istGueltig == false);
string eingabeB;
bool istZahlB;
do
{
Console.Write("Zahl b: ");
eingabeB = Console.ReadLine();
istZahlB = char.IsDigit(eingabeB[0]);
if (istZahlB == false)
{
Console.WriteLine("Das ist keine Zahl, versuch es nochmal.");
}
}
while (istZahlB == false);
b = double.Parse(eingabeB);
double ergebnis = 0;
switch (operatorZeichen)
{
case '+':
ergebnis = a + b;
break;
case '-':
ergebnis = a - b;
break;
case '*':
ergebnis = a * b;
break;
case '/':
ergebnis = a / b;
break;
}
Console.WriteLine(a + " " + operatorZeichen + " " + b + " = " + ergebnis);
Console.Write("Nochmal? (j/n) ");
string weiter = Console.ReadLine();
if (weiter != "j")
{
repeat = false;
}
}
}
}
}
Kurz zusammengefasst: Mit diesem einen Programm hast du praktisch alles verwendet, was du bisher gelernt hast - Variablen und Datentypen, Console.Write und Console.ReadLine, Vergleiche, if/else und switch, sowie while- und do-while-Schleifen. Genau das ist Programmieren: viele kleine, einzelne Bausteine zu etwas Grösserem zusammensetzen.