Die berühmt-berüchtigte Lagerverwaltung ...

cpts

Grünschnabel
Hallo Community,

ja - es geht mal wieder um einen Programmier-Anfänger und ja - es geht mal wieder um eine Lagerverwaltung ...
Es gibt durchaus schon vorhandene Posts zu diesem Thema, teils recht alt, teils etwas aktueller (sowohl in diesem Forum, als auch in anderen) aber keines der Themen behandelt mein Problem.
Daher der neue Thread ...

Es geht um die Erstellung einer kleinen Lagerverwaltung über ein Konsolenprogramm.
Eine bestimmte Anzahl von Kisten (50 Stk) soll per Eingabe gespeichert werden. Zu jeder Kiste gibt es die Seitenmasze und das Volumen sowie eine eindeutige Identifikationsnummer, unter der die Kiste abgelegt wird und im Rahmen des Programms immer wieder aufgerufen und abgefragt werden kann/soll.

Genau da hänge ich fest ...

Ich habe in meinem Code bisher schon die Struktur der Kiste, die Funktionen 'loeschen', 'aendern', 'anzeigen' und 'einlesen'. Da mein Hund ja in der 'einlesen'-Funktion begraben liegt, bin ich mal so frei und poste euch hier nur die 'einlesen'-Funktion und die main() - die auch noch nicht ganz fertig ist, aber zumindest diese Funktion schon abrufen kann.
C++:
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

//Vereinbarung einer Konstanten für die maximale Anzahl von Kisten
const int maxAnzahl = 2; //ACHTUNG - VOR ABGABE AUF 50 ÄNDERN !!             <--------------------<-<-<-<-< !!!!!!!!!

//globale Vereinbarung der Struktur
struct kiste
{
    int hoehe;
    int breite;
    int laenge;
    int volumen;
    int belegt;
    int identNr;
};
//-----------------------------------------------------------------
//Funktionen zum Einlesen, Löschen, Ändern, Anzeigen und Auflisten
kiste einlesen(int kistenNummer)
{
    kiste aKiste;
    int nummer;

    cout << "Bitte geben Sie die HOEHE der Kiste in cm ein: ";
    cin >> aKiste.hoehe;
    cout << "Bitte geben Sie die BREITE der Kiste in cm ein: ";
    cin >> aKiste.breite;
    cout << "Bitte geben Sie die LAENGE der Kiste in cm ein: ";
    cin >> aKiste.laenge;
    cout << '\n';
    cout << "Bitte geben Sie die Nummer ein (1 - " << maxAnzahl << ") unter der die Eingabe gespeichert werden soll: ";
    cin >> nummer;
    aKiste.identNr = nummer;

    if (aKiste.belegt == 1)
    {
        cout << "ACHTUNG - Diese Kistennummer ist bereits vergeben.";
        cout << " Ihre Eingabe konnte nicht verarbeitet werden.";
    }
    else
    {
        cout << "Ihre Kiste wurde unter der Nummer " << aKiste.identNr << " gespeichert.";
        aKiste.belegt = 1;
        aKiste.volumen = aKiste.hoehe * aKiste.breite * aKiste.laenge;
        cout << "\nDas Volumen der neuen Kiste betraegt: " << aKiste.volumen << " Kubikcentimeter." << endl;
        cout << '\n';
    }

   return aKiste;
}

//HAUPTFUNKTION
int main()
{
    //Vereinbarung der Variablen für die Struktur
    kiste lagerKiste[maxAnzahl];
    //sonstige Variablen
    int auswahl = 0;
   
    for (int i = 0; i < maxAnzahl; i++ )
        {
            lagerKiste[i].identNr = i + 1;
            lagerKiste[i].belegt = 0;
        }

    //Anzeige der Optionen und entsprechende Auswahl der Funktionen
    while (auswahl != 6)
        {
            cout << "\nBitte waehlen Sie durch Eingabe der entsprechenden Nummer die gewuenschte Funktion. \nSie haben die Wahl zwischen folgenden Optionen:\n" << endl;
            cout << "- 1 - Neue Kiste anlegen\n";
            cout << "- 2 - Bestehende Kiste loeschen\n";
            cout << "- 3 - Bestehende Kiste aendern\n";
            cout << "- 4 - Einzelne Kiste anzeigen\n";
            cout << "- 5 - Alle Kisten anzeigen\n";
            cout << "- 6 - Beenden\n";
            cin >> auswahl;
            cout << '\n';


            switch (auswahl)
            {
            case 1:
                for ( int schleifeEinlesen = 0; schleifeEinlesen < maxAnzahl; schleifeEinlesen++ )
                    lagerKiste[schleifeEinlesen] = einlesen(schleifeEinlesen +1);
                break;
               

            }
        }

   return 0;
}

Mein Problem ist folgendes:
Wenn ich die main() jetzt ausführe, dann kann ich gem. Hauptmenü die Option "-1- Neue Kiste anlegen" ausführen und dann entsprechend der maxAnzahl auch Kisten einlesen.
Wenn ich aber die Nummer zur eindeutigen Identifikation einlesen will, dann speichert das Programm sie a) nicht ab und b) wirft bei der zweiten Runde immer die Fehlermeldung aus, dass die Eingabe nicht verarbeitet werden konnte. Sprich, die zweite Runde der Schleife führt automatisch zur Ausgabe der if-Option innerhalb der 'einlesen'-Funktion ...
Hänge da jetzt seit knapp 4 Tagen dran und irgendwie habe ich das Gefühl, dass ich mich ordentlich verrannt habe, bzw. einfach auf der Leitung stehe. Manchmal sieht man ja den Wald vor lauter Bäumen nicht mehr ...

Frage:
Wie bekomme ich es hin, dass das Programm zu jeder Kiste eine Nummer speichert und ich über diese Nummer die Daten der Kiste abrufen kann ?


mfG
cpts
 
Zuletzt bearbeitet von einem Moderator:

Jennesta

Erfahrenes Mitglied
Hallo cpts,

ich habe deinen Code einmal selbst getestet und danach genauer angesehen. Das Hauptproblem ist, dass deine Einlesenfunktion nicht auf den Daten arbeitet, die du in der main() bereit stellst.
Genauer gesagt, du erzeugst in der einlesen-Funktion eine neue lokale Variable aKiste. Das ist generell ok, wenn du ein neues Objekt erzeugst, aber daher ist z.B. in der Abfrage der if() Fehler vorprogrammiert. Hier versucht du mit belegt auf einen Zustand zuzugreifen, der außerhalb deiner einlesen Funktion bekannt ist, aber nicht in deinem neuen Objekt.

Im folgenden Bild siehst du einen Screenshot aus meinem Debugging. Wie du erkennen kannst in der Membervariable belegt mit einem zufälligem Wert initialisiert.
1658093766172.png

Dh. der erste Verbessungsvorschlag ist hier generell deine Objekte vorher zu initialisieren. Das hilft z.B. auch für reproduzierbare Ergebnisse, denn bei mir tritt z.B. nicht der Fall b), den du beschreibst ein.

Für das andere Problem, dass du nicht auf den eigentlichen Daten arbeitest gibt es mehrere Ansätze.
Einerseits könntest du den belegt-Status außerhalb der einlesen-Funktion prüfen und dann auch nur einlesen lassen wenn die Eingaben verarbeitet werden können.
Andererseits könntest du die Kiste selbst mit in die einlesen-Funktion geben (Als Pointer oder besser als Referenz). Dann kannst du die Abfrage lassen wo sie ist und die Werte direkt in das Kistenobjekt schreiben.
 

cpts

Grünschnabel
Hallo Jennesta,

erstmal recht schoenen Dank fuer deine Muehe und Antwort!

Ich werde das Geschriebene mal aufnehmen und zusehen, dass ich es umgesetzt bekomme. Der Tipp mit der lokalen Neubelegung war gut!

Danke und mfG
 

Jennesta

Erfahrenes Mitglied
Falls du weitere Fragen hast helfe ich dir gerne weiter.
Am liebsten natürlich an Code Beispielen ;)