Laden...

Struktur Array in switch case Anweisung

Letzter Beitrag vor 4 Monaten 8 Posts 664 Views
Struktur Array in switch case Anweisung

Schön guten Abend,

ich beiss mir grade an einer Teilaufgabe die Zähne aus.

Ich versuche über eine switch...case Anweisung eine Methode aufzurufen und mit dieser Methode das erste Array mit den Wert
"0" zu beschreiben. Leider läuft meine Methode immer alle Arrays durch. Ich vermute ich habe einen Fehler in meiner Schleife.
Wie kann ich nur ein Array beschreiben und dann wieder aus dem case springen?

Könnt ihr mir für die case 1 Bedingung einen Tip geben? Mit meinen Befehlen in C# bin ich noch sehr am Anfang und mir stehen
noch nocht alle Befehle zur Verfügung.

Es geht in dieser Aufgabe Methoden zu entwickeln für verschiedene Funktionen und diese ohne Klassen zu erstellen.

Die 2. Sache wäre noch das Abfangen von Fehleingaben über die while try and catch Möglichkeit. Ich habe das versucht
über die char menuAuswahl Variable zu prüfen. Das funktionier aber nur bei einer Eingabe von mehr als einem Symbol. Eine
Falscheingabe über ein falsches Symbol fange ich damit aber nicht ab. Muss ich hier jedes Symbol in meiner Menüauswahl
einzeln mit der "while try and catch" Funktion überprüfen?

Liebe Grüße
Mersaia

static Kiste Einlesen(int kistenNummer)
{

    Kiste neuKiste;
    Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ",kistenNummer);
    neuKiste.Hoehe = Convert.ToInt32(Console.ReadLine());
    Console.Write("Geben Sie die Breite der {0}. Kiste ein: ",kistenNummer);
    neuKiste.Breite = Convert.ToInt32(Console.ReadLine());
    Console.Write("Geben Sie die Länge der {0}. Kiste ein: ",
    kistenNummer);
    neuKiste.Laenge = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine();
    return neuKiste;
}
//Menüführung
char menuAuswahl;
//Programm beenden Variable
bool flagVariable = true;
//Fehler abfangen Variable
bool eingabeFehler = false;  // try and catch werde ich hier versuchen
//array vom Tpy Kistenstruktur bestimmen
Kiste[] lagerraum = new Kiste[75];

do
{
    //Menüauswahl
    Console.Clear();
    Console.WriteLine(" _______________________________________________________");
    Console.WriteLine("|\tHauptmenü\t\t\t\t\t|");
    Console.WriteLine("|\t1  Neue Kiste erstellen\t\t\t\t|");
    Console.WriteLine("|\t2  Inhalt von vorhandener Kiste löschen\t\t|");
    Console.WriteLine("|\t3  Inhalt von vorhandener Kiste ändern\t\t|");
    Console.WriteLine("|\t4  Inhalt von vorhandener Kiste anzeigen\t|");
    Console.WriteLine("|\t5  Volumen aller vorhandener Kiste anzeigen\t|");
    Console.WriteLine("|\tX  Programm beenden\t\t\t\t|");
    Console.WriteLine("|_______________________________________________________|");

//Überprüfung auf Zeicheneingabe    

    menuAuswahl = Convert.ToChar(Console.ReadLine());

    switch (menuAuswahl)
    {
        case '1':
            Console.WriteLine("Neue Kiste erstellen");
            for ( int index = 0; index == lagerraum.Length; index =1) //ich denke hier wird der Fehler sein
                lagerraum[index] = Einlesen(index+1); // oder hier

            break;
/*        case '2':
            Console.WriteLine("Daten löschen Kiste");
            Console.ReadLine();
            break;
        case '3':
            Console.WriteLine("Datenänderung Kiste");
            Console.ReadLine();
            break;
        case '4':
            Console.WriteLine("Dateninhalt von Kiste");
            Console.ReadLine();
            break;
        case '5':
            Console.WriteLine("Listenfunktion aller Kisten mit Inhalt");
            Console.ReadLine();
            break;
        case 'X':
            flagVariable = false;
            break; */
//Der Code ist noch nicht fertig ausgearbeitet und es geht auch erstmal nur um case 1
    }
        
} while (flagVariable == true);

Console.WriteLine("Das Programm wird beendet");

struct Kiste
{
    public int Hoehe;
    public int Breite;
    public int Laenge;
}

Hallo,

das hast du richtig erkannt, die for-Schleife ist dort falsch (und auch überflüssig).

Du benötigst anstatt der Schleifenvariablen eine lokale Variable (wie lagerraum), welche die Anzahl der bisher eingelesenen Kisten speichert (und diese mußt du nach dem erfolgreichen Einlesen um 1 erhöhen).
Ich nehme mal an, du hast bisher noch nichts von List<T> gelesen? Dies ist ein dynamisches Array und du bräuchtest nicht das Array mit einem festen Wert vorzuinitialisieren und die Länge speichert es auch automatisch.

Für die Fehlerbehandlung kannst du noch den Fall case default: hinzufügen, s.a. Die Anweisung switch.

Anstatt Ausnahmen (Exception) abzufangen (z.B. für Convert.ToInt32(...)), würde man hier besser die TryParse-Methoden benutzen, z.B. für int: Int32.TryParse.

Ich muss/kann/will für diese Aufgabe eine Schleife verwenden und ganz wichtig dabei ist wohl diese Aussage:

Zitat aus meiner Aufgabenstellung:
"Speichern Sie die Daten in einer Struktur und legen Sie ein Array in der erforderlichen 
Größe für diese Struktur an. Verwenden Sie für das Array keine Klassenvariable und auch 
keine eigene Klasse."

Bei einem Array von 75 hatte ich mir das so vorgestellt:

switch (menuAuswahl)
{
    case '1':
        Console.WriteLine("Neue Kiste erstellen");
        for ( int index = 0; index <= 74; index++) 
        /*index ist meine Zählerschleife damit realisiere ich 
        das ich nicht meine Array vpn 75 Kisten überlaufe
        die Schleife wird aber damit ja bis zur 75 mal ausgeführt
        mir fehlt das Argument das die Schleife verlassen wird wenn ich
        in einem Array eine 0 finde*/
            lagerraum[index] = Einlesen(index+1);
            //Übergabe an meine Methode Einlesen um die Werte der Struktur Hoehe, Länge Breite einzulesen
            // in der for SChleife noch eine if Anweisung schreiben?

wie Überprüfe ich mein "Struktur Array" auf den Wert "0"?

if (lagerraum[index] == 0) // durchlaufe mein lagerraumarray bis 0 gefunden wird
Einlesen(); //Führe Methode Einlesen aus
break; //spring aus meiner Switch Anweisung

Ist es das, was Du willst?

                    case '1':
                        Console.WriteLine("Neue Kiste erstellen");
                        for (int index = 0; index < lagerraum.Length; index++)
                        {
                            // Prüfe, ob die Kiste definiert ist
                            if (lagerraum[index].Laenge == 0 && lagerraum[index].Breite == 0 && lagerraum[index].Hoehe == 0)
                            {
                                // Lese bei undefinierter Kiste die Werte ein und verlasse die Schleife.
                                lagerraum[index] = Einlesen(index + 1);
                                break;
                            }
                        }
                        break;

Ja das klappt.

In der for Schleife "lagerraum.Length" damit das Array sicher durchläuft. wenn sich mein Array von der in der größe änder würde die schleife immer noch funktionieren was beim Wert 74 nicht der Fall wäre?

die if Anweisung mit der Überprüfung auf Lange, Hoehe, Breite auf 0 um eventuelle Fehlereingaben mit einer Eingabe 0 in Hohe Länge Breite abzufangen? Theoretisch würde ja bspw. nur Länge abfragen auch gehen weil der Anwender bei der Eingabe keine 0 eingeben soll? auch wenn es unsauber ist. es geht nur um das Verständnis.

Und danke für die Hilfe. Den Austausch mit anderen vermisse ich ein bisschen....

Zitat von Mersaia

die if Anweisung mit der Überprüfung auf Lange, Hoehe, Breite auf 0 um eventuelle Fehlereingaben mit einer Eingabe 0 in Hohe Länge Breite abzufangen? Theoretisch würde ja bspw. nur Länge abfragen auch gehen weil der Anwender bei der Eingabe keine 0 eingeben soll? auch wenn es unsauber ist. es geht nur um das Verständnis.

Ja, die Überprüfung sollte idealerweise ODER-Verknüpft sein. Und das Kriterium sollte nicht  == 0 sein sondern <= 0. Dass der Anwender keine 0 eingeben soll, kann ich nicht erkennen.

Wenn ich diese case-Anweisung in eine Methode packen will wie könnte das aussehen? ich hab das mit den Methoden noch nicht so ganz verstanden.
Wie kann ich ,meine Struktur mit dem Array, in einer Methode auslesen? Die Wiedergabe wird ja einfach mit Console.WriteLine() zu realisieren sein.
(hoffe ich)

die Methode würde ich dann in der case Anweisung aufrufen.

 case '4':
     Console.WriteLine("Dateninhalt von Kiste"); //Überschrift
     Console.WriteLine("\tID:\tLänge:\tBreite:\tHöhe:\tVolumen:"); //ein Versuch soetwas wie eine Tabelle zu basteln
     for (int liste = 0; liste < lagerraum.Length; liste++)

         if (lagerraum[liste].ID != 0) //0 ist immer der Wert für eine leere Kiste
         {
             Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\t{4}", lagerraum[liste].ID, lagerraum[liste].Laenge, lagerraum[liste].Breite, lagerraum[liste].Hoehe, lagerraum[liste].Volumen);
         }
     Console.ReadLine();
     break;

Vielleicht sowas in der Art? Ist ungetestet.

        public class Kiste
        {
            public string Bezeichnung { get; set; }
            public int Laenge { get; private set; }
            public int Breite { get; private set; }
            public int Hoehe { get; private set; }
            public int Volumen { get {return Laenge * Breite * Hoehe;}}
            

            public Kiste(int Laenge, int Hoehe, int Breite)
            { 
                this.Laenge = Laenge;                
                this.Breite = Breite;
                this.Hoehe = Hoehe;
            }

            public void Ausgabe()
            {
                Console.WriteLine("Maße von {0}", this.Bezeichnung); //Überschrift
                Console.WriteLine("\tLänge:\tBreite:\tHöhe:\tVolumen:"); //ein Versuch soetwas wie eine Tabelle zu basteln
                Console.WriteLine(
                    "\t{0}\t{1}\t{2}\t{3}",
                    this.Laenge, this.Breite, this.Hoehe, this.Volumen
                );
            }
        }


        static void LagerraumFuellen(Kiste[] lagerraum)
        {
            {
                var kiste = new Kiste(5, 3, 3);
                kiste.Bezeichnung = "Bierkasten";
                lagerraum[4] = kiste;
            }
            {
                var kiste = new Kiste(4, 7, 8);
                kiste.Bezeichnung = "Tupperdose";
                lagerraum[11] = kiste;
            }
        }

        static void Ausgabe(Kiste kiste)
        {
            if (kiste == null)
            {
                Console.WriteLine("\tKeine Kiste vorhanden.");
                return;
            }
            else
            {
                kiste.Ausgabe();
            }
            Console.ReadLine();
        }

        static void Main()
        {
            Kiste[] lagerraum = new Kiste[75];
            LagerraumFuellen(lagerraum);
                        

            char eingabe = '4';
            switch (eingabe) 
            {
                case '4':
                    Kiste kiste = lagerraum[4];
                    Ausgabe(kiste);
                    break;

                default: break;
            }

        }