Frage von BobBizeps2307, 48

Wie kann ich in C# in der Konsole auf einselne Unterprogramme eine art Menü machen?

Hallo Ich möchte gern in C# in der konsole mit Unterprogrammen eine Art Taschenrechner machen. Am Anfang mit einer Eingabe was berechnet werden soll nur weiss ich nicht so recht wie ich das machen soll bzw. mit welchem Befehl Dachte da zb an ein Tastendruck der auf das Unterprogramm weist. habt ihr eine Idee?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Palladin007, 19

Schau dir mal die Methode Console.ReadKey an
Die wartet bis zu irgendeinem Tastendruck und gibt dir dann alle Infos zu diesem Tastendruck zurück.

Du könntest dann z.B. das machen:

Console.WriteLine("1 - Addieren");
Console.WriteLine("2 - Subtrahieren");
// ...

var pressedKey = Console.ReadKey();

// Wenn z.B. ALT gedrückt sein soll:
if (pressedKey.Modifiers.HasFlag(ConsoleModifiers.Alt))
{
// ...
}

if (pressedKey.Key == ConsoleKey.D1 || pressedKey.Key == ConsoleKey.NumPad1)
    PreformeAdd();
else if (pressedKey.Key == ConsoleKey.D2 || pressedKey.Key == ConsoleKey.NumPad2)
PerformeSubtract();
// ...

Wer Schreibfehler findet, darf sie gerne behalten, dieser Text-Editor hier ist eine Vollkatastrophe, da ist jedes Möchtegern-Forum besser -.-

Kommentar von Palladin007 ,

PS:

Das oben ist ziemlich einfach gehalten.
Besser wäre natürlich, wenn in einer Schleife geprüft wird, ob die Eingabe korrekt ist und ein Fehler angezeigt wird, wenn nicht.

Kommentar von greenvbuser ,

Was hat der Editor mit Rechtschreibung zu tun? :D

Kommentar von Palladin007 ,

Normalerweise kopiere ich mir Typ- oder Methoden-Namen aus der msdn-Doku, damit das garantiert stimmt.

Allerdings, wenn ich etwas hinein paste, zerteilt der Editor den Code-Bereich oder fügt einen im aktuellen Code-Bereich ein und solche Späße.
Deshalb kann ich mir die Namen nicht kopieren um sie sicher richtig zu schreiben und ich kann nicht einmal die eine if-Zeile kopieren und die Zahlen anpassen.
Dabei entstehen eben schneller Fehler.

Kommentar von greenvbuser ,

Touchée!

Antwort
von FahrradLecker, 27

Am einfachsten wäre es wenn du sowas machst:

  • 1 Plus
  • 2 Minus
  • 3 Mal
  • 4 Geteilt

Wenn der Nutzer sich dann für eine Zahl entscheidet wird die jeweilige Rechenoperation ausgeführt.

Also:

  • Eingabe Zahl 1
  • Eingabe Zahl 2
  • Aufruf Untermenü
Kommentar von BobBizeps2307 ,

Steh gerad bisschen aufm Schlauch wie kann ich das aber Umsetzen? So wie Sie das beschreiebn haben so habe ich mir das auch gedacht.

Kommentar von DarkNightmare ,

Die Idee ist nicht schlecht. Mach als erstes eine Ausgabe. Danach erwartest du eine Angabe und fängst diese ab. Danach muss dein Programm entscheiden ob 1,2,3 oder 4 gedrückt wurde und muss entsprechend mit plus, minus, mal oder geteilt reagieren.

Weiß dein Programm also nun welche Rechenoperation getätigt werden soll, müssen noch zwei Zahlen eingelesen werden, danach die Rechnung erfolgen und das Ergebnis ausgegeben werden.

Antwort
von greenvbuser, 23

Stell dir folgende Konsolenausgabe vor:

Herzlich Willkommen bei meinem Mini-Taschenrechner
===================================================

[HAUPTMENÜ]
1   Addieren
2   Subtrahieren
3   Multiplizieren
4   Dividieren
0   Beenden

Bitte wähle jetzt: █

Nun fragst du über

int menuSelection = 0;

while(true) {
    if(Int32.TryParse(Console.ReadLine(), out menuSelection) &&
    menuSelection >= 0 && menuSelection <= 4) {
        break;
    }
    else
    {
        Console.WriteLine("Ungültige Eingabe! Versuch's noch mal.");
    }
}

die aktuelle Eingabe des Nutzers ab. Danach kannst du mit einem einfachen Switch-Case-Block die Unterprogramme starten.

Kommentar von Palladin007 ,

Besser wäre Console.ReadKey

Damit kann man auch ausstellen, dass die gedrückte Taste in die Konsole geschrieben wird und es ist nur eine Taste, die gedrückt werden muss - ohne Enter.

Es muss auch nicht zu int geparst werden und es sind Modifiers wie ALT, etc. möglich.

Kommentar von greenvbuser ,

Ich denke nicht, dass du hier von 'Besser' sprechen kannst. Es wäre eine alternative, die aber auch Nachteile mit sich bringt. Mit ReadKey() wird es z.B. schwierig, mehr als ein Zeichen einzulesen. Was wäre, wenn das Menü mehr als neun Einträge umfasst?

Kommentar von Palladin007 ,

Ok, ich korrigiere meinen ersten Satz:

"In diesem Fall wäre Console.ReadKey besser"

Zufrieden? :P

Tatsächlich habe ich noch nie ein Konsolen-Programm mit einem so großen Menü gesehen. Meistens wird sowas dann mit einer GUI umgesetzt oder commands dass man z.B. schreibt "add 1 2"

Kommentar von greenvbuser ,

Jaja, bin zufrieden :D 
Aber für "add 1 2" braucht man auch ReadLine() ;)

Kommentar von Palladin007 ,

Natürlich, das wird dann aber sowieso komplexer.
Allerdings habe ich ein kleines Framework auf meiner ToDo-Liste, was eine solche Zeile in Methoden-Aufrufe übersetzt und das Ergebnis einer Methode als neuen Kontext für weitere Befehle verwenden kann. Dann braucht man nur noch eine Klasse mit Methoden ^^

Kommentar von greenvbuser ,

Gute Idee 

Kommentar von KnorxyThieus ,

Hierbei sollte man jedoch unbedingt Enums verwenden, die viel einfacher abgefragt werden können:

enum OperationMode
{
   Add = 1,
   Substract = 2,
   Multiply = 3,
   Divide = 4
}

Dann ist auch der switch-Block via Visual Studio einfacher (mit Doppel-Tab) zu erstellen und die Eingabe einfacher zu überprüfen (Enum.IsValid(value) oder so ähnlich).

Kommentar von greenvbuser ,

Naja, Enums halte ich eher für Syntax Sugaring. Kann man benutzen, geht aber genauso gut auch ohne. Ist denke ich Geschmackssache.

Kommentar von KnorxyThieus ,

Das kann man aber auch von diversen anderen Elementen von C# behaupten ... Getters, Setters, überladbare Operatoren, eckige Klammern zur Indexierung ... letztlich ist doch auch OOP nur syntaktischer Zucker, wenn man so will?

Kommentar von greenvbuser ,

Naja, bei OOP und Kapselung (ausgenommen Properties!) stimme ich dir nicht zu. Alles andere ja. Definitiv.

Ich sage ja auch nichts dagegen. Ich bin selbst ein großer Fan von Syntax-Zucker. Nur wollte ich mir der Lesbarkeit halber gerne die sechs/sieben  zusätzlichen Zeilen sparen, weil sie nicht zwingend notwendig sind.

Kommentar von KnorxyThieus ,

Wäre aber eine sinnvolle Investition für künftige Fortführungen des Projekts ... gibt es dafür eigtl. einen Fachbegriff? Codewiederverwendung maximieren?

Kommentar von greenvbuser ,

Ja, es gibt unterschiedliche Fachbegriffe für unterschiedliche Sparten. Spontan kommen mir Polymorphie, Reusability und das DRY-Prinzip in den Sinn.

Kommentar von KnorxyThieus ,

DRY klingt schön, das liebe ich :)

Kommentar von GustavAT ,

Anstatt

int menuSelection = 0;

kannst du

var menuSelection = 0;

schreiben, da der Typ von menuSelection durch 0 schon feststeht. Macht in den meisten Fällen den Code kürzer und übersichtlicher - in diesem Fall wäre es egal :)

Außerdem sollte man - laut C# Coding-Guidlines - den primitiven Datentype (int) dem Struct (Int32) vorziehen, auch wenn es keinen Unterschied macht.

Kommentar von greenvbuser ,

Ich würde sämtliche Anregungen ja gerne noch mal oben in meiner Antwort kumuliert darstellen, aber Antworten zu bearbeiten scheint hier im Board zu viel verlangt zu sein... :(

Antwort
von BobBizeps2307, 8

Danke für alle Antworten! Super Rat

Keine passende Antwort gefunden?

Fragen Sie die Community