Problem bei Lagerverwaltung



  • Hast du irgendwelche Vorgaben, in welchem Stil du das programmieren sollst? Dieser prozedurale Stil mit der struct und den ganzen statischen Methoden sieht nämlich nicht sehr C#-typisch aus. Es gehört nicht viel dazu, das jetzt irgendwie zum Laufen zu kriegen, aber vielleicht sollte man doch erstmal die Voraussetzungen klären.

    Übrigens schließt man Sätze im Normalfall mit Punkten ab.



  • Du greifst z.B. in Ändern oder Löschen nicht auf das Array zu. Du operierst immer nur mit der lokalen Kiste. Außerdem hast Du einige geschweifte Klammern vergessen. Nach if oder else.
    Das sind zwei Punkte die erstmal die ganze Logik zunichte machen.



  • Ja die Vorgaben sind das ich für das erstellen, ändern, löschen, anzeigen und auflisten jeweils eigene Methoden anlegen soll! Die Daten sollen in einer Struktur gespeichert werden und ein Array soll angelegt werden in der erforderlichen Größe! Das Array sollte eigentlich in der Main Methode angelegt werden! Es soll nur auf Kisten die vorhanden sind zugreifbar sein.

    Das mit den Klammer versteh ich aber das wie greif ich richtig auf das Array zu?



  • Die 100 Kisten legst Du erst in der Methode Einlesen an und reichst das Array danach auch nicht heraus. So können die anderen Methoden garnicht darauf zugreifen.

    (Einlesen ist rekursiv, sehe ich jetzt erst. Da ist alles ganz schön kaputt)

    Fang doch nochmal bei Null an und versuche erstmal die Einlese-Methode zum laufen zu bekommen. Überleg Dir wie und wo Du das Array anlegen könntest, damit die anderen Methoden auch darauf zugreifen können. Es ist sowieso nicht sinnvoll 150 Zeilen zu schreiben die nicht kompilieren. Schritt für Schritt!

    Hattet ihr schon das Thema Klassen und Objektorientierung? Ich glaube irgendwie nicht, dass Dein Lehrer über diesen Stil so glücklich sein wird.



  • ok dann fang ich nochmal von vorne an!
    Klassenvariablen hatten wir schon! Aber ich soll die Aufgabe ohne diese lösen! Und Objektorientierung kommt erst im nächsten Heft dran! Ohmann könnt kotzen... Sitz schon wiede seit heut früh dran!



  • Ok.

    Dann lege mal Dein Array in Main an und reiche es später an ALLE Methoden als Parameter weiter. Damit eben alle mit diesen Daten arbeiten können.

    Zuerst Einlesen um das Array zu füllen.



  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Einsendeaufgabe._4
    {
        class Program
        {
            //die Vereinbarung der Struktur
            struct Kiste
            {
                public int Hoehe;
                public int Breite;
                public int Laenge;
                public int Aktiv;
                public int Volumen;
            }
            static Kiste Einlesen(int kistenNummer)
            {
                Kiste aKiste;
                Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", kistenNummer);
                aKiste.Hoehe = Convert.ToInt32(Console.ReadLine());
                Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", kistenNummer);
                aKiste.Breite = Convert.ToInt32(Console.ReadLine());
                Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", kistenNummer);
                aKiste.Laenge = Convert.ToInt32(Console.ReadLine());
                aKiste.Aktiv = 1;
                aKiste.Volumen = aKiste.Hoehe * aKiste.Laenge * aKiste.Breite;
    
                Console.WriteLine();
                return aKiste;
            }
    
            static void Main(string[] args)
            {
                //ein lokales Array kleineKiste für die Struktur Kiste
                Kiste[] kleineKiste = new Kiste[100];
    
                //das Einlesen der Daten über die Methode Einlesen()
                for (int index = 0; index < 100; index++)
                    kleineKiste[index] = Einlesen(index + 1);
    
            }
        }
    }
    

    Also hab von vorne angefangen! Das wäre die Methode zum einlesen! Bin ich auf dem richtigen weg?



  • Japp



  • // Methode zum Anzeigen
            static Kiste Anzeigen(int kistenNummer)
            {
                Kiste aKiste;
                Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 100 ein");
                kistenNummer = Convert.ToInt32(Console.ReadLine()) - 1;
                if (kistenNummer <= 100 && kistenNummer >= 1)
                {
                    if (kistenNummer.Aktiv == 1)
                    {
                        Console.WriteLine("Kistennummer: {0}> Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", kistenNummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen);
                    }
                    else
                    {
                        Console.WriteLine("Kistennummer: {0} ist nicht belegt", kistenNummer);
                    }
                }
            }
    

    So da ich da ne Fehlermeldung habe die ich zwar nicht kapiere werd ich wohl einen Fehler haben!



  • Du arbeitest immer noch mit einem lokalen Objekt aKiste. Das macht so keinen Sinn.
    Du sollst entweder das Array an diese Methoden übergeben, oder bereits die richtige Kiste. Im Falle von Ausgeben ist letzteres kein Problem. Nur beim Verändern der Kisten in anderen Methoden musst Du auf ungewollte kopien beim Methodenaufruf achten.

    Außerdem behandelst Du den integer kistenNummer wie ein Objekt der Kisten-Struktur. (kistenNummer.Aktiv)

    Bin raus.



  • Vielleicht kann mir nochmal jemand helfen? Also ich denke ich hab es einigermassen hin bekommen! Nur beim Aufruf der Methoden komm ich nicht ganz zurecht! Also wenn ich die case 2 - case 6 auskommentiere geht es! Nur komm ich nicht ganz dahinter wie ich die anderen Methoden aufrufen soll! Und das auch nicht mehr als 100 eingegeben werden können!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Einsendeaufgabe._4
    {
        class Program
        {
            //die Vereinbarung der Struktur
            struct Kiste
            {
                public int Hoehe;
                public int Breite;
                public int Laenge;
                public int Aktiv;
                public int Volumen;
            }
            // Methode zum Einlesen
            static Kiste Einlesen(int kistenNummer)
            {
    
                Kiste aKiste;
                Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", kistenNummer);
                aKiste.Hoehe = Convert.ToInt32(Console.ReadLine());
                Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", kistenNummer);
                aKiste.Breite = Convert.ToInt32(Console.ReadLine());
                Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", kistenNummer);
                aKiste.Laenge = Convert.ToInt32(Console.ReadLine());
                aKiste.Aktiv = 1;
                aKiste.Volumen = aKiste.Hoehe * aKiste.Laenge * aKiste.Breite;
    
                Console.WriteLine();
                return aKiste;
            }
            // Methode zum Anzeigen
            static void Anzeigen(Kiste aKiste)
            {
                int Nummer;
                Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 100 ein");
                Nummer = Convert.ToInt32(Console.ReadLine()) - 1;
                if (Nummer <= 100 && Nummer >= 1)
                {
                    if (aKiste.Aktiv == 1)
                    {
                        Console.WriteLine("Kistennummer: {0}> Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", Nummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen);
                    }
                    else
                    {
                        Console.WriteLine("Kistennummer: {0} ist nicht belegt", Nummer);
                    }
                }    
            }
            // Methode zum Löschen
            static void Löschen(Kiste aKiste)
            {
                int nummer;
                Console.WriteLine("Welche Kiste wollen Sie löschen? Geben Sie eine Nummer von 1 - 100 ein!");
                nummer = Convert.ToInt32(Console.ReadLine()) - 1;
    
                if (nummer <= 100 && nummer >= 0)
                {
                    if (aKiste.Aktiv == 0)
                    {
                        Console.WriteLine("Die Kiste ist bereits gelöscht!");
                    }
                    if (aKiste.Aktiv == 1)
                    {
                        aKiste.Aktiv = 0;
                        aKiste.Hoehe = 0;
                        aKiste.Laenge = 0;
                        aKiste.Breite = 0;
                        aKiste.Volumen = 0;
                        Console.WriteLine("Kistennummer: {0} gelöscht", aKiste);
                    }
                }
            }
            // Methode zum Ändern
            static void Ändern(Kiste aKiste)
            {
               int nummer;
               Console.WriteLine("Welche Kiste wollen sie ändern? Geben sie eine Nummer von 1-100 ein!");
               nummer = Convert.ToInt32(Console.ReadLine()) - 1;
    
                if (nummer <= 100 && nummer >= 0)
                   {
                       if (aKiste.Aktiv == 1)
                       {
                           Console.WriteLine("Geben sie bitte die Höhe der Kiste ein");
                           aKiste.Hoehe = Convert.ToInt32(Console.ReadLine());
    
                           Console.WriteLine("Geben sie bitte die Breite der Kiste ein");
                           aKiste.Breite = Convert.ToInt32(Console.ReadLine());
    
                           Console.WriteLine("Geben sie bitte die Länge der Kiste ein");
                           aKiste.Laenge = Convert.ToInt32(Console.ReadLine());
    
                           aKiste.Volumen = aKiste.Hoehe * aKiste.Breite * aKiste.Laenge;
                       }
                     }
                    else
                        Console.WriteLine("Die Kiste gibt es nicht");
            }
            // Methode um alle Kisten anzeigen zu lassen
            static void Alle(Kiste aKiste)
            {
                for (int Aktiv = 0; Aktiv < 100; Aktiv++)
                {
                    if (aKiste.Aktiv == 1)
                    {
                        Console.WriteLine("Kistennummer: {0}> Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen);
                    }
                    else
                        Console.WriteLine("Die Kiste gibt es nicht");
                }
            }
            static void Main(string[] args)
            {
                int Aktiv=0;
                //ein lokales Array kleineKiste für die Struktur Kiste
                Kiste[] kleineKiste = new Kiste[100];
    
                //das Einlesen der Daten über die Methode Einlesen()
                for (int index = 0; index < 3; index++)
                    kleineKiste[index] = Einlesen(index + 1);
    
                //Auswahlmenü Schleife 
                while (Aktiv != 6)
                {
    
                    Console.WriteLine("[1] Kiste anlegen");
                    Console.WriteLine("[2] Alle Kisten auflisten");
                    Console.WriteLine("[3] Eine bestimmte Kiste auflisten");
                    Console.WriteLine("[4] Kiste löschen");
                    Console.WriteLine("[5] Kiste ändern");
                    Console.WriteLine("[6] Programm beenden\n");
    
                    Aktiv = Convert.ToInt32(Console.ReadLine());
                    switch (Aktiv)
                    {
                        case 1:
                            Einlesen(Aktiv);
                            break;
                        [b]case 2:
                            Alle();
                            break;
                        case 3:
                            Anzeigen();
                            break;
                        case 4:
                            Löschen();
                            break;
                        case 5:
                            Ändern();
                        case 6:
                            break;
                        default:
                            Console.WriteLine("Falsche Eingabe");[/b]
                    }
                }
            }
    
            }
        }
    


  • Das Thema Objektorientierte Programmierung ist dir aber schon bekannt oder?



  • Nein das wird leider erst im nächsten Heft dran genommen! Ich habe eine frage gestellt da ich nicht weiter komme! Da helfen mir spitze Bemerkungen leider genauso viel wie ein eimer Wasser!



  • Das naechste Heft? Naja ist auch egal, du hast uns ja jetzt gesagt das du es noch nicht kennst, somit koennen wir verstehen warum dein Code so ist wie er ist und koennen gezielter auf dich eingehen 😉

    Bei case 5 faellt mir schonmal auf das du ein break vergessen hast, das kann beabsichtig sein, sieht aber auf den ersten Blick nicht danach aus.
    Kurzer Tipp noch am Rande, gewoehn dir an Umlaute aus den Methoden- wie Variablennamen rauszunehmen.



  • Hallo silium,

    vergleiche mal bei dir den Aufruf von "Einlesen" mit deinen anderen Methoden (Stichwort: Parameter) - fällt dir etwas auf?

    Und wenn du es dann zum Kompilieren und Testen geschafft hast, dann wunder dich nicht, daß Änderungen bei den Kisten nicht möglich sind.
    Ändere dazu mal "struct Kiste" in "class Kiste" - Stichworte: Werte- bzw. Referenztypen!

    P.S. Zum Testen würde ich dir raten, daß du den Wert "100" als Konstante anlegst:

    const int MaxKisten = 100;
    

    Und dann ersetze alle Vorkommen deiner "Magic Number" 100 durch diese Konstante - dann kannst du einfach diese Konstante testweise auf z.B. 10 runtersetzen, so daß du nicht jedesmal beim Testen 100 Werte eingeben mußt!

    PPS: Da es ja anscheinend eine "Einsendeaufgabe" ist, werde ich dir keine konkreten Lösungen geben - denn du sollst ja das Programmieren dabei lernen (und gerade aus Fehlern lernt man am meisten!).



  • Danke schön! Werde die sachen testen! Ja alleranfang ist schwer! Aber ich soll eine stuktur kiste anlegen und mit dieser arbeiten!



  • Alles! Klar! dann! mach! das! mal!! Und vergiss! die Ausrufezeichen(!) am Ende des Satzes nicht!



  • Auch auf die Gefahr hin das ich mich total lächerlich mache. Ich habe alles nochmal umgeschrieben und kann mir einfach nicht erklären warum ich die Methoden nicht aufrufen kann! Ich weiß die erfahrenen Programmierer werden sich darüber tod lachen aber ich bin Anfänger und komme einfach nicht weiter!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Einsendeaufgabe._4
    {
        class Program
        {
            const int MaxKisten = 100;
            //die Vereinbarung der Struktur
            struct Kiste
            {
                public int Hoehe;
                public int Breite;
                public int Laenge;
                public int Aktiv;
                public int Volumen;
                public int kistenNummer;
            }
            // Methode zum Einlesen
            static void Einlesen(Kiste aKiste)
            {
                for (int index = 0; index < MaxKisten; index++)
                {
                    if (aKiste.Aktiv == 0)
                    {
                        Console.Write("Geben Sie die Höhe der {0}. Kiste ein: ", aKiste.kistenNummer);
                        aKiste.Hoehe = Convert.ToInt32(Console.ReadLine());
                        Console.Write("Geben Sie die Breite der {0}. Kiste ein: ", aKiste.kistenNummer);
                        aKiste.Breite = Convert.ToInt32(Console.ReadLine());
                        Console.Write("Geben Sie die Länge der {0}. Kiste ein: ", aKiste.kistenNummer);
                        aKiste.Laenge = Convert.ToInt32(Console.ReadLine());
                        aKiste.Aktiv = 1;
                        aKiste.Volumen = aKiste.Hoehe * aKiste.Laenge * aKiste.Breite;
    
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Keine Kiste mehr frei.");
                    }
                }
            }
            // Methode zum Anzeigen
            static void Anzeigen(Kiste aKiste)
            {
                int Nummer;
                Console.WriteLine("Welche Kiste wollen Sie anzeigen lassen? Geben Sie eine Nummer von 1 - 100 ein:");
                Nummer = Convert.ToInt32(Console.ReadLine()) - 1;
                if (Nummer <= 100 && Nummer >= 1)
                {
                    if (aKiste.Aktiv == 1)
                    {
                        Console.WriteLine("Kistennummer: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste.kistenNummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen);
                    }
                    else
                    {
                        Console.WriteLine("Kistennummer: {0} ist nicht belegt.", aKiste.kistenNummer);
                    }
                }
            }
            // Methode zum Löschen
            static void Loeschen(Kiste aKiste)
            {
                int Nummer;
                Console.WriteLine("Welche Kiste wollen Sie löschen? Geben Sie eine Nummer von 1 - 100 ein.");
                Nummer = Convert.ToInt32(Console.ReadLine()) - 1;
    
                if (Nummer <= 100 && Nummer >= 0)
                {
                    if (aKiste.Aktiv == 0)
                    {
                        Console.WriteLine("Die Kiste ist bereits gelöscht.");
                    }
                    if (aKiste.Aktiv == 1)
                    {
                        aKiste.Aktiv = 0;
                        aKiste.Hoehe = 0;
                        aKiste.Laenge = 0;
                        aKiste.Breite = 0;
                        aKiste.Volumen = 0;
                        Console.WriteLine("Kistennummer: {0} gelöscht.", aKiste.kistenNummer);
                    }
                }
            }
            // Methode zum Ändern
            static void Aendern(Kiste aKiste)
            {
                int Nummer;
                Console.WriteLine("Welche Kiste wollen sie ändern? Geben sie eine Nummer von 1-100 ein.");
                Nummer = Convert.ToInt32(Console.ReadLine()) - 1;
    
                if (Nummer <= 100 && Nummer >= 0)
                {
                    if (aKiste.Aktiv == 1)
                    {
                        Console.WriteLine("Geben sie bitte die Höhe der Kiste ein:");
                        aKiste.Hoehe = Convert.ToInt32(Console.ReadLine());
    
                        Console.WriteLine("Geben sie bitte die Breite der Kiste ein:");
                        aKiste.Breite = Convert.ToInt32(Console.ReadLine());
    
                        Console.WriteLine("Geben sie bitte die Länge der Kiste ein:");
                        aKiste.Laenge = Convert.ToInt32(Console.ReadLine());
    
                        aKiste.Volumen = aKiste.Hoehe * aKiste.Breite * aKiste.Laenge;
                    }
                }
                else
                    Console.WriteLine("Die Kiste gibt es nicht.");
            }
            // Methode um alle Kisten anzeigen zu lassen
            static void Alle(Kiste aKiste)
            {
                for (int index = 0; index < MaxKisten; index++)
                {
                    if (aKiste.Aktiv == 1)
                    {
                        Console.WriteLine("Kistennummer: {0}, Höhe {1}, Breite: {2}, Länge: {3}, Volumen: {4}", aKiste.kistenNummer, aKiste.Hoehe, aKiste.Breite, aKiste.Laenge, aKiste.Volumen);
                    }
                    else
                        Console.WriteLine("Die Kiste gibt es nicht");
                }
            }
            static void Main(string[] args)
            {
                int aktiv = 0;
                //ein lokales Array aKiste für die Struktur Kiste
                Kiste[] aKiste = new Kiste[MaxKisten];
    
                //Alle Kistennummern auf 1-100 setzen, damit die erste Kiste nicht mit 0 angesprochen wird
                //Status Aktiv auf 0 setzen um die Existenz der Kisten zu verwalten 
                for (int index = 0; index < MaxKisten; index++)
                {
                    aKiste[index].kistenNummer = index + 1;
                    aKiste[index].Aktiv = 0;
                }
    
                //Auswahlmenü Schleife 
                while (aktiv != 6)
                {
    
                    Console.WriteLine("[1] Kiste anlegen");
                    Console.WriteLine("[2] Alle Kisten auflisten");
                    Console.WriteLine("[3] Eine bestimmte Kiste auflisten");
                    Console.WriteLine("[4] Kiste löschen");
                    Console.WriteLine("[5] Kiste ändern");
                    Console.WriteLine("[6] Programm beenden\n");
    
                    aktiv = Convert.ToInt32(Console.ReadLine());
    
                    switch (aktiv)
                    {
                        case 1:
                            Einlesen(aktiv);
                            break;
                        case 2:
                            Alle(aktiv);
                            break;
                        case 3:
                            Anzeigen(aktiv);
                            break;
                        case 4:
                            Loeschen(aktiv);
                            break;
                        case 5:
                            Aendern(aktiv);
                            break;
                        case 6:
                            break;
                        default:
                            Console.WriteLine("Falsche Eingabe");
                    }
                }
            }
        }
    }
    


  • Hast du denn mal nen Breakpoint gesetzt und den ganzen Kram debuggt?



  • Breakpoint? Ist das wenn ich in dem Balken klicke und da ein roter Punkt kommt? Also wenn ich Strg+F5 drücke kommt die Meldung Fehler beim erstellen. Kann dann ja klicken aber da kommt dann nur das Auswahlmenü was aber nicht reagiert ausser "Programm beenden"


Anmelden zum Antworten