C# Nicht funktionierendes switch Statement

K

kcinay055679

Gast
Hallo
Ich habe eine Frage in Zeile 179 meines Code erkennt Visual Studio 2019 das zweite Case des Switch Statement nicht was habe ich falsch gemacht das erste case funktioniert doch auch ohne Probleme. Als Fehlermeldung bekomme ich
Fehler Das Steuerelement kann nicht von einer case-Bezeichnung ("case "Rechner":") zur nächsten fortfahren.
heraus. Das macht doch keinen Sinn.

Desweiteren habe ich bei Zeile 246 die Fehlermeldung dass "RechnerErgebnis" nicht zugewisen ist dabei wird sie im oberen Code block definiert.

Bitte um schnelle Hilfe!!
Vielen Dank im Voraus!


Mein Code:
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Collections;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Media;
using System.Drawing;


namespace Kcinay_environment
{

    class Hauptklasse
    {
        public static void Main( string[] args )
        {
            String EingabeModul;
            String EingabeZahlenspiel;
            String AktuellerBenutzer;
            String EingabeBenutzer;
            String[] BenutzerListe = new string[4];
            BenutzerListe[0] = "Yanick";
            BenutzerListe[1] = "Pfanner";
            BenutzerListe[2] = "Housi";
            BenutzerListe[3] = "Barbara";
            Random rnd = new Random();
            int löschcounter = 0;
            int Zahl = rnd.Next(0, 1000);
            int Versuche = 0;
            String RechnerZahl1;
            String RechnerZahl2;
            String Operator;
            int RechnerZahl1Int;
            int RechnerZahl2Int;
            int RechnerErgebnis;


            while (true)
            {
                Console.WriteLine("Bitte melde dich mit deinem Benutzernamen an");
                EingabeBenutzer = Console.ReadLine();
                if (BenutzerListe[0] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Yanick";
                    break;
                }
                if (BenutzerListe[1] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Pfanner";
                    break;
                }
                if (BenutzerListe[2] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Housi";
                    break;
                }
                if (BenutzerListe[3] == EingabeBenutzer)
                {
                    AktuellerBenutzer = "Barbara";
                    break;
                }
                else
                {
                    Console.Clear();
                    Console.WriteLine("Bitte melde dich mit einem gültigen Benutzernamen an");
                    Console.ReadKey();
                    Console.Clear();
                }
            }
            Console.WriteLine(" ");
            Console.WriteLine("Du bist als " + AktuellerBenutzer + " angemeldet");
            Console.WriteLine(" ");
            Console.WriteLine(" ");

            Console.WriteLine("Dir stehen folgende Möglichkeiten zur verfügung");
            Console.WriteLine(" ");
            Console.WriteLine("Zahlenspiel");
            Console.WriteLine("Rechner");
            Console.WriteLine("Dieses Produkt wird noch entwickelt");
            Console.WriteLine("Dieses Produkt wird noch entwickelt");
            Console.WriteLine("Dieses Produkt wird noch entwickelt");
            Console.WriteLine("Zum benutzen den Programmnamen eingeben ");
            Console.ReadKey();
            EingabeModul = Console.ReadLine();
            while (true)
            {
                switch (EingabeModul)
                {
                    case "Zahlenspiel":
                        {
                            Console.Clear();
                            SoundPlayer simpleSound = new SoundPlayer(@"C:\Tickende_Uhr.wav");
                            simpleSound.Play();
                            Console.WriteLine("Dies ist ein Zahlenerratungs Spiel");
                            Console.WriteLine("Das Spiel beinhaltet eine Zahlenspanne von 0 - 1000");
                            Console.WriteLine("Tippe eine Zahl und das Program sagt dir ob die Gesuchte Zahl kleiner oder Grösser ist als die Eingegebene.");
                            Console.WriteLine("   ");

                            Task.Delay(3000).Wait();
                            Console.Clear();
                            startTime();
                            while (true)
                            {
                                Console.WriteLine("Tippe eine Zahl: ");
                                EingabeZahlenspiel = Console.ReadLine();

                                if (EingabeZahlenspiel == "Lösung")
                                {
                                    Console.Clear();
                                    Console.WriteLine("Die Lösung war: " + Zahl);
                                    Console.WriteLine("   ");
                                    Console.WriteLine("Du hast " + getTime() + " gebraucht um die Richtige Zahl zu finden :-)");
                                    simpleSound.Stop();
                                    Console.ReadKey();
                                    break;
                                }

                                int Ausgabe = Convert.ToInt32(EingabeZahlenspiel);

                                if (Zahl == Ausgabe)
                                {
                                    Console.Clear();
                                    Console.WriteLine("Du hast die Richtige Zahl gefunden");
                                    Console.WriteLine("Es war die Zahl " + Zahl);
                                    Console.WriteLine("Du hast " + getTime() + " gebraucht um die Richtige Zahl zu finden :-)");
                                    Console.WriteLine("Du hast Insgesammt " + Versuche + " Versuche gebraucht.");
                                    simpleSound.Stop();
                                    Console.ReadKey();
                                    Console.Clear();
                                    break;
                                }

                                if (Ausgabe > Zahl)
                                {
                                    löschcounter += 1;
                                    if (löschcounter == 3)
                                    {
                                        löschcounter = 0;
                                        Console.Clear();
                                        Console.WriteLine(Ausgabe);
                                    }
                                    Versuche += 1;
                                    Console.WriteLine("Die eingegebene Zahl ist zu gross");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("Du hast bisher " + getTime() + " gebraucht.");
                                    Console.WriteLine("Du hast bisher " + Versuche + " Versuche gebraucht.");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("   ");

                                }

                                if (Ausgabe < Zahl)
                                {
                                    löschcounter += 1;
                                    if (löschcounter == 3)

                                    {
                                        löschcounter = 0;
                                        Console.Clear();
                                        Console.WriteLine(Ausgabe);
                                    }
                                    Versuche += 1;
                                    Console.WriteLine("Die eingegebene Zahl ist zu klein");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("Du hast bisher " + getTime() + " gebraucht.");
                                    Console.WriteLine("Du hast bisher " + Versuche + " Versuche gebraucht.");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("   ");
                                    Console.WriteLine("   ");
                                }
                            }
                            break;


                        }
                    case "Rechner":
                        {
                            Console.WriteLine("Das ist mein Rechner");
                            Console.WriteLine("Zuerst die 1. Zahl eingeben danach Enter ");
                            Console.WriteLine("Anschlissend den Operator eingeben (+,-,*,:) danach Enter ");
                            Console.WriteLine("Zahl 1 eingeben ");
                            RechnerZahl1 = Console.ReadLine();
                            RechnerZahl1Int = Convert.ToInt32(RechnerZahl1);

                            while (true)
                            {
                                Console.WriteLine("Operator eingeben(+,-,*,:)");
                                Operator = Console.ReadLine();
                                if (Operator != "+")
                                {
                                    if (Operator != "-")
                                    {
                                        if (Operator != "*")
                                        {
                                            if (Operator != "/")
                                            {
                                                Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                            }
                                            {
                                                break;
                                            }
                                        }
                                        {
                                            break;
                                        }
                                    }
                                    {
                                        break;
                                    }
                                }
                                else
                                {
                                    break;
                                }


                            }

                            Console.WriteLine("Zahl 2 eingeben ");
                            RechnerZahl1 = Console.ReadLine();

                            RechnerZahl2 = Console.ReadLine();
                            RechnerZahl2Int = Convert.ToInt32(RechnerZahl2);

                            switch (Operator)
                            {
                                case "+":
                                    RechnerErgebnis = RechnerZahl1Int + RechnerZahl2Int;
                                    break;
                                case "-":
                                    RechnerErgebnis = RechnerZahl1Int - RechnerZahl2Int;
                                    break;
                                case "*":
                                    RechnerErgebnis = RechnerZahl1Int * RechnerZahl2Int;
                                    break;
                                case ":":
                                    RechnerErgebnis = RechnerZahl1Int / RechnerZahl2Int;
                                    break;



                            }
                            Console.WriteLine("Das Ergebnis lautet " + RechnerErgebnis);

                        }

                            default:
                                Console.Clear();
                            Console.WriteLine("Bitte wähle ein existierendes Programm aus ");
                            Console.ReadKey();
                            Console.Clear();
                            Console.WriteLine("Dir stehen folgende Möglichkeiten zur verfügung");
                            Console.WriteLine(" ");
                            Console.WriteLine("Zahlenspiel");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Dieses Produkt wird noch entwickelt");
                            Console.WriteLine("Zum benutzen den Programmnamen eingeben! ");
                            EingabeModul = Console.ReadLine();
                            break;
                        
                }
            }


        }

        static Stopwatch stopWatch;
        static void startTime()
        {
            stopWatch = new Stopwatch();
            stopWatch.Start();
        }

        static String getTime()
        {
            long ms = stopWatch.ElapsedMilliseconds;
            int minuten = (int)(ms / 1000 / 60);
            int sekunden = (int)((ms - minuten * 1000 * 60) / 1000);
            String strReturn = "";

            if (minuten != 0)
                strReturn = minuten + " Minute" + (minuten == 1 ? "" : "n");

            if (sekunden != 0)
            {
                if (strReturn.Length != 0)
                    strReturn += " und ";

                strReturn += sekunden + " Sekunde" + (sekunden == 1 ? "" : "n");
            }

            return strReturn;
        }

    }
}
 
Aufgrund das bei den if Bedingungen das else fehlt kann es dazu kommen das RechnerErgebnis keinen definierten Wert hat. RechnerErgebnis sollte zudem kein int sein da dies bei der Division nicht gewährleistet werden kann.
 
Ersten:welche If's meinst du und wie soll ich sie bearbeiten??
Zwitens: welcher Dateityp soll ich stattdessen verwenden
 
Als erstes würde ich mal empfehlen alles in den cases in eigene Methoden auszulagern, dann fällt sowas eher auf.

In 247 fehlt ein break.

Variablen sind in C# übrigens Camel Case myVariable. Nur Properties sind wie bei dir Pascal Case

Edit: Weiterer Tipp wäre das ganze mal auf Englisch umzustellen, die Fehlermeldung macht da meiner Meinung nach mehr Sinn: "Control cannot fall through from one case label ('case' "Rechner":') to another".
 
Dein Code sieht so aus:
Code:
                                            if (Operator != "/")
                                            {
                                                Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                            }
                                            {
                                                break;
                                            }
Und so sollte er aussehen:
Code:
                                            if (Operator != "/")
                                            {
                                                Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                            }else
                                            {
                                                break;
                                            }
Als Beispiel ab der Zeile 198. Bei den weiteren if ebenso.
 
Ich denke ich habe die Lösung von ModellbahnerTT begriffen und meinen Code dementsprechend verändert jedoch habe ich immer noch die Fehlermeldung das RechnerErgebis nicht zugewiesen ist.
Was habe ich nicht begriffen. Ich denke mal eine ganze Menge.
Vielen Dank für die Geduld.


Mein neuer Code:
C#:
case "Rechner":
                        {
                            Console.WriteLine("Das ist mein Rechner");
                            Console.WriteLine("Zuerst die 1. Zahl eingeben danach Enter ");
                            Console.WriteLine("Anschlissend den Operator eingeben (+,-,*,:) danach Enter ");
                            Console.WriteLine("Zahl 1 eingeben ");
                            RechnerZahl1 = Console.ReadLine();
                            RechnerZahl1Int = Convert.ToInt32(RechnerZahl1);

                            while (true)
                            {
                                Console.WriteLine("Operator eingeben(+,-,*,:)");
                                Operator = Console.ReadLine();
                                if (Operator != "+")
                                {
                                    if (Operator != "-")
                                    {
                                        if (Operator != "*")
                                        {
                                            if (Operator != "/")
                                            {
                                                Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                            }
                                            else
                                            {
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                else
                                {
                                    break;
                                }


                            }

                            Console.WriteLine("Zahl 2 eingeben ");
                            RechnerZahl1 = Console.ReadLine();

                            RechnerZahl2 = Console.ReadLine();
                            RechnerZahl2Int = Convert.ToInt32(RechnerZahl2);

                            switch (Operator)
                            {
                                case "+":
                                    RechnerErgebnis = RechnerZahl1Int + RechnerZahl2Int;
                                    break;
                                case "-":
                                    RechnerErgebnis = RechnerZahl1Int - RechnerZahl2Int;
                                    break;
                                case "*":
                                    RechnerErgebnis = RechnerZahl1Int * RechnerZahl2Int;
                                    break;
                                case ":":
                                    RechnerErgebnis = RechnerZahl1Int / RechnerZahl2Int;
                                    break;



                            }
                            Console.WriteLine("Das Ergebnis lautet " + RechnerErgebnis);
                            break;
                        }
 
Du vergleichst oben mit / und unten dann mit : ;)
Mit +, - und * müsste es dann aber eigentlich schon gehen soweit ich das beurteilen kann.
 
Habs geändert kommt immer noch die selbe Fehlermeldung raus:

Aktueller Code:

C#:
Console.WriteLine("Das ist mein Rechner");
                            Console.WriteLine("Zuerst die 1. Zahl eingeben danach Enter ");
                            Console.WriteLine("Anschlissend den Operator eingeben (+,-,*,/) danach Enter ");
                            Console.WriteLine("Zahl 1 eingeben ");
                            RechnerZahl1 = Console.ReadLine();
                            RechnerZahl1Int = Convert.ToInt32(RechnerZahl1);

                            while (true)
                            {
                                Console.WriteLine("Operator eingeben(+,-,*,/)");
                                Operator = Console.ReadLine();
                                if (Operator != "+")
                                {
                                    if (Operator != "-")
                                    {
                                        if (Operator != "*")
                                        {
                                            if (Operator != "/")
                                            {
                                                Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                            }
                                            else
                                            {
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                else
                                {
                                    break;
                                }


                            }

                            Console.WriteLine("Zahl 2 eingeben ");
                            RechnerZahl1 = Console.ReadLine();

                            RechnerZahl2 = Console.ReadLine();
                            RechnerZahl2Int = Convert.ToInt32(RechnerZahl2);

                            switch (Operator)
                            {
                                case "+":
                                    RechnerErgebnis = RechnerZahl1Int + RechnerZahl2Int;
                                    break;
                                case "-":
                                    RechnerErgebnis = RechnerZahl1Int - RechnerZahl2Int;
                                    break;
                                case "*":
                                    RechnerErgebnis = RechnerZahl1Int * RechnerZahl2Int;
                                    break;
                                case "/":
                                    RechnerErgebnis = RechnerZahl1Int / RechnerZahl2Int;
                                    break;



                            }
                            Console.WriteLine("Das Ergebnis lautet " + RechnerErgebnis);
                            break;
                        }

                    default:
                        Console.Clear();
                        Console.WriteLine("Bitte wähle ein existierendes Programm aus ");
                        Console.ReadKey();
                        Console.Clear();
                        Console.WriteLine("Dir stehen folgende Möglichkeiten zur verfügung");
                        Console.WriteLine(" ");
                        Console.WriteLine("Zahlenspiel");
                        Console.WriteLine("Dieses Produkt wird noch entwickelt");
                        Console.WriteLine("Dieses Produkt wird noch entwickelt");
                        Console.WriteLine("Dieses Produkt wird noch entwickelt");
                        Console.WriteLine("Dieses Produkt wird noch entwickelt");
                        Console.WriteLine("Zum benutzen den Programmnamen eingeben! ");
                        EingabeModul = Console.ReadLine();
                        break;

                }
            }


        }
 
C#:
                                if (Operator != "+")
                                {
                                    if (Operator != "-")
                                    {
                                        if (Operator != "*")
                                        {
                                            if (Operator != "/")
                                            {
                                                Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                            }
                                            else
                                            {
                                                break;
                                            }
                                        }
                                        else
                                        {
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                else
                                {
                                    break;
                                }
Dass kann man vorallem schöner schreiben. Vorallem strings niemals mit "==" oder "!=" vergleichen, immer mit "equals()"
C#:
if (!Operator.equals("+") && !Operator.equals("-") && !Operator.equals("*") && !Operator.equals("/" ))
{
    Console.WriteLine("Bitte einen gültigen Operator eingeben");
}
else
{
    break;
}

Dann fragst du einmal nach "/" und im switch nach ":" ab.
Hast du dir schon mal angeschaut was im Readline ankommt?
Ich würde im switch auch ein default abfangen, mit der Ausgabe, dass das Zeichen nicht erkannt wurde (wovon ich ausgehe und deswegen RechnerErgebnis nicht gesetzt wird)

Zudem wird:
Code:
Console.WriteLine("Zahl 2 eingeben ");
RechnerZahl1 = Console.ReadLine();
RechnerZahl2 = Console.ReadLine();
RechnerZahl2Int = Convert.ToInt32(RechnerZahl2);

RechnerZahl2 nicht gesetzt, da du vorher RechnerZahl1 erneut einliest? Dise Zeile einfach rauslöschen, die liest du ja weiter oben schon ein
 
Zuletzt bearbeitet:
Egal was ich mach der Error bleibt bestehen.


Mein Code:
C#:
case "Rechner":
                        {
                            Console.WriteLine("Das ist mein Rechner");
                            Console.WriteLine("Zuerst die 1. Zahl eingeben danach Enter ");
                            Console.WriteLine("Anschlissend den Operator eingeben (+,-,*,/) danach Enter ");
                            Console.WriteLine("Zahl 1 eingeben ");
                            RechnerZahl1 = Console.ReadLine();
                            RechnerZahl1Int = Convert.ToInt32(RechnerZahl1);

                            while (true)
                            {
                                Console.WriteLine("Operator eingeben(+,-,*,/)");
                                Operator = Console.ReadLine();
                                if (!Operator.Equals("+") && !Operator.Equals("-") && !Operator.Equals("*") && !Operator.Equals("/"))
                                {
                                    Console.WriteLine("Bitte einen gültigen Operator eingeben");
                                }
                                else
                                {
                                    break;
                                }


                            }

                            Console.WriteLine("Zahl 2 eingeben ");
                            RechnerZahl1 = Console.ReadLine();

                            RechnerZahl2 = Console.ReadLine();
                            RechnerZahl2Int = Convert.ToInt32(RechnerZahl2);

                            switch (Operator)
                            {
                                case "+":
                                    RechnerErgebnis = RechnerZahl1Int + RechnerZahl2Int;
                                    break;
                                case "-":
                                    RechnerErgebnis = RechnerZahl1Int - RechnerZahl2Int;
                                    break;
                                case "*":
                                    RechnerErgebnis = RechnerZahl1Int * RechnerZahl2Int;
                                    break;
                                case "/":
                                    RechnerErgebnis = RechnerZahl1Int / RechnerZahl2Int;
                                    break;



                            }
                            Console.WriteLine("Das Ergebnis lautet " + RechnerErgebnis);
                            break;
 
xxhagixx schrieb:
Vorallem strings niemals mit "==" oder "!=" vergleichen, immer mit "equals()"
Das ist bei C# nicht der Fall. Siehe Source-Code von string.

@kcinay055679 In deinem switch-Statement fehlt der default case. Dies liegt daran, dass der Compiler nicht erkennen kann, dass der Operator nur "+", "-", "*" o. "/" sein kann. Der Compiler ist der Meinung, dass auch andere Werte theoretisch möglich wären. Du musst RechnerErgebnis also irgendetwas zuweisen oder eine Exception werfen, damit der Fehler im Ernstfall auch auffällt. Da hilft folgendes:

C#:
switch (Operator)
{
    case "+":
        RechnerErgebnis = RechnerZahl1Int + RechnerZahl2Int;
        break;
    case "-":
        RechnerErgebnis = RechnerZahl1Int - RechnerZahl2Int;
        break;
    case "*":
        RechnerErgebnis = RechnerZahl1Int * RechnerZahl2Int;
        break;
    case "/":
        RechnerErgebnis = RechnerZahl1Int / RechnerZahl2Int;
        break;
    default:
        // we are sure that this cannot happen, as we checked "Operator"
        throw new InvalidOperationException("A programming mistake occurred!");
}
 
deine verschachtelten if Anweisungen machst du warum so? Hast du dir schon mal logische Operatoren angesehen? Mach das bitte, der Code ist so eher suboptimal lesbar.
 
Die switch-Anweisung könnte man dann noch etwas kürzer als Ausdruck schreiben, aber ich stimme zu, dass wohl erstmal der eher prozedural gehaltene Code zumindest in geeignete Funktionen gepackt werden sollte. ;)

C#:
var RechnerErgebnis = Operator switch
{
    "+" => RechnerZahl1Int + RechnerZahl2Int,
    "-" => RechnerZahl1Int - RechnerZahl2Int,
    "*" => RechnerZahl1Int * RechnerZahl2Int,
    "/" => RechnerZahl1Int / RechnerZahl2Int,
    _ => throw new InvalidOperationException($"{Operator} is an invalid operator."),
};
 

Ähnliche Themen

W
  • Gesperrt
  • Frage
2 3
Antworten
45
Aufrufe
2.554
K
Antworten
18
Aufrufe
2.072
R
Zurück
Oben