Laden...

Wie prüfe ich, ob N, A oder B eingegeben wurde, ansonsten Consolenausgabe?

Erstellt von RafaelVogt vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.129 Views
R
RafaelVogt Themenstarter:in
27 Beiträge seit 2019
vor 4 Jahren
Wie prüfe ich, ob N, A oder B eingegeben wurde, ansonsten Consolenausgabe?

Hallo zusammen,

auf meiner Reise in die Tiefen von C# bin ich mal wieder ins Stocken geraten. Wie prüfe ich, ob N, A, B eingegeben wurden, um bei einem anderen Buchstaben eine Consolenausgabe zu erwirken?

Ich habe bereits versucht, den string choice auszulesen und in int zu überführen, um eine einfache if-Anweisung zu schreiben. Nach dem Motto:

Wenn nicht N, A, B eigegeben, dann Console.WriteLine("Falsche Eingabe");


namespace _2_6_2_Das_switch_Statement
{
    class Program
    {
        static void Main(string[] args)
        {
            string message = "Treffen Sie eine Wahl:\n\n";
            message += "(N) - Neues Spiel\n";
            message += "(A) - Altes Spiel fortsetzen\n";
            message += "(E) - Beenden\n";

            Console.WriteLine(message);
            Console.WriteLine("Ihre Auswahl lautet: ");

            string choice = Console.ReadLine().ToUpper();

            if (choice == "N")
            {
                Console.WriteLine("Neues Spiel...");
                Console.ReadKey();
            }
            else if (choice == "A")
            {
                Console.WriteLine("Altes Spiel wird fortgesetzt...");
                Console.ReadKey();
            }
            else if (choice == "E")
            {
                Console.WriteLine("Das Spiel wird beendet...");
                Console.ReadKey();
            }

            Console.ReadKey();
        }
    }
}

R
RafaelVogt Themenstarter:in
27 Beiträge seit 2019
vor 4 Jahren

Ich habe selber etwas schlankes gefunden:


 if (choice != "N")
                if(choice !="A")
                    if(choice !="E")
                    {
                        Console.WriteLine("Keine verfügbare Option!");
                        Console.ReadKey();
                    }
                    else if (choice == "N")
                    {
                        Console.WriteLine("Neues Spiel..."); 
                        Console.ReadKey();
                    }
                    else if (choice == "A")
                    {
                        Console.WriteLine("Altes Spiel wird fortgesetzt..."); 
                        Console.ReadKey();
                    }
                    else if (choice != "E")
                    {
                        Console.WriteLine("Das Spiel wird beendet...");
                        Console.ReadKey();
                    }

Gibt es eine schlankere Möglichkeit?

C
2.121 Beiträge seit 2010
vor 4 Jahren

Dass man einen String nicht in eine Zahl umwandelt um ihn zu vergleichen, hast du also selbst gefunden 😃

Man kann in C# mit Strings auch switch-case veranstalten. Das ist ein kleines bisschen weniger zu schreiben.

Du könntest das ReadKey nach den if Tests aufrufen, das passiert nämlich immer.

Ich schreibe zwar auch nicht für jedes if die { } drum herum, aber in deinem Fall solltetst du das dringend tun. Wozu deine ifs gehören ist bei der Verschachtelung nämlich nicht so leicht ersichtlich und wenn du da irgendwas nachträglich einfügst kann es sein dass du ein Laufzeitverhalten kriegst das du so gar nicht wolltest.

Dann schau dir mal an was du da prüfst.
Das erste if wird betreten wenn choice NICHT N ist. Das zweite wird betreten wenn choice NICHT A ist.
Die inneren if prüfen dann ob choice N oder A ist. Wenn das der Fall wäre, wäre dein Programm gar nicht an diese Stelle gekommen.
Das bedeutet du brauchst die ersten zwei if gar nicht.

Und im ersten Beispiel prüfst du auf == 'E', im zweiten auf != 'E'.

Ergänzung: du kannst auch einfach schreiben


            string message = "Treffen Sie eine Wahl:\n\n" +
                "(N) - Neues Spiel\n" +
                "(A) - Altes Spiel fortsetzen\n" +
                "(E) - Beenden\n";

Y
11 Beiträge seit 2014
vor 4 Jahren

Hallo RafaelVogt,

Gibt es eine schlankere Möglichkeit?

ja gibt es und dein Namespace beinhaltet die schlankere Möglichkeit 😉
Stichwort: switch-case
Und um strings zu verketten solltest du dir die StringBuilder Klasse ansehen.
Diese beiden Konstrukte werden aber in jedem guten Buch zu C# bereits am Anfang behandelt.

R
RafaelVogt Themenstarter:in
27 Beiträge seit 2019
vor 4 Jahren

Danke für Eure Antworten. In der Tat behandelt mein Buch als nächstes das switch-statement (-:

Vielen Dank Euch. Ist eine tolle community.

M
368 Beiträge seit 2006
vor 4 Jahren

Switch-case kann man auch i.V. mit enum verwenden: http://dotnetperls.com/switch-enum

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

R
RafaelVogt Themenstarter:in
27 Beiträge seit 2019
vor 4 Jahren

Ich habe meinen ersten Codeblock nochmal richtig gestellt:


namespace _2_6_2_Das_switch_Statement
{
    class Program
    {
        static void Main(string[] args)
        {
            string message = "Treffen Sie eine Wahl:\n\n";
            message += "(N) - Neues Spiel\n";
            message += "(A) - Altes Spiel fortsetzen\n";
            message += "(E) - Beenden\n";
 
            Console.WriteLine(message);
            Console.WriteLine("Ihre Auswahl lautet: ");

            string choice = Console.ReadLine().ToUpper();

            if (choice == "A")
            {
                Console.WriteLine();
                Console.WriteLine("Altes Spiel wird fortgesetzt...");
                Console.ReadKey();
            }
            else if (choice == "N")
            {
                Console.WriteLine();
                Console.WriteLine("Neues Spiel wird gestartet...");
                Console.ReadKey();
            }
            else if (choice == "E")
            {
                Console.WriteLine();
                Console.WriteLine("Das Spiel wird beendet...");
                Console.ReadKey();
            }
            else if (choice != "A")
            {
                Console.WriteLine();
                Console.WriteLine("Ungültige Eingabe!");
                Console.ReadKey();
            }
        }
    }
}

Ist es legitim als letztes nur noch auf Ungleichheit ( != "A" ) zu prüfen und davon zu profitieren, dass bei einer Eingabe von "A" "N" "E" da Progamm schon vorher seine AUsführungen ausführt, oder sollte man auch !="N" und !="E" auch noch prüfen?

Weiter habe ich das jetzt auch mit dem switch-statement gemacht (einfach den if-Block ersetzt):


 switch (cho)
            {
                case "N":
                    Console.WriteLine("Neues Spiel...");
                    Console.WriteLine();
                    break;
                case "A":
                    Console.WriteLine("Altes Spiel laden...");
                    Console.WriteLine();
                    break;
                case "E":
                    Console.WriteLine("Spiel wird beendet...");
                    Console.WriteLine();
                    break;
                default:
                    Console.WriteLine("Ungültige Eingabe...");
                    Console.WriteLine();
                    break;
            }

4.931 Beiträge seit 2008
vor 4 Jahren

Du brauchst beim letzten else-Fall keine Bedingung mehr hinschreiben (das entspricht dann dem default-Fall beim switch):


if (choice == "A")
{
    // ...
}
else if (choice == "N")
{
    // ...
}
else if (choice == "E")
{
    // ...
}
else
{
    // default
    // ...
}

R
RafaelVogt Themenstarter:in
27 Beiträge seit 2019
vor 4 Jahren

Oh Mann ... danke!

Hinweis von Abt vor 4 Jahren

Keine Full Qoues bitte.