Dreidimensionalen Array abfragen



  • Ich habe ein Projekt wo ich eine Kiste [4][4][6] erstellen muss und da dann Pakete rein packen und wieder löschen muss (Paket muss nicht gedreht werden können).
    Mein Problem ist nun dass wenn ich das erste Paket rein Packe geht es noch, aber bei meinem zweiten Paket fängt der wieder von der selben stelle an und Speichert das zweite Paket unter das erste Paket.
    z.b. :
    0 0 1
    0 0 1
    1 1 1
    Hänge hier jetzt schon wieder ein paar Tage fest und weiß nicht mehr weiter, hoff mir kann jemand weiter helfen.

    Hier noch mein Versuch die freien stellen zu suchen und zu belegen.

    do {
            for (Y=0; Y < j ; Y++){
                 for (Z=0; Z < k; Z++){
                    for (X=0; X < i; X++){
    
                        if (Kiste [Y][Z][X]== '.'){
                            for (l=0; l < j; l++){
                                if (Kiste [Y+l][Z][X] == '.')
                                   for (m=0; m < k; m++){
                                        if (Kiste [Y+l][Z+m][X] == '.')
                                            for (n=0; n < i; n++){
    
                                               if ((Kiste [Y+l][Z][X] == '.') && (Kiste [Y+l][Z+m][X] == '.') && (Kiste[Y+l][Z+m][X+n] == '.')){
                                                    Kiste[Y][Z][X] = p;
                                                    s++;
                                                    cout << s;
                                               }}}}}}}}
                                               } while (t >= s);
                                             
       ausgabe(Kiste);
    
    }
    

    Falls es wichtig sein sollte, ich abreite mit Code Blocks



  • @Patrick_P

    Glaubst du, dass du deine Frage verstehen würdest?
    Was ist k? Was i, l was t? Woher kommt s? Ist p dieses ominöse Paket?....



  • Bitte ein kompilierbares Minimalbeispiel und aussagekräftige Variablennamen. Ich habe keine Lust zu raten, was du mit den Variablen meinst und vorfür sie da sein sollen.

    Bei 11 ineinanderverschachtelten Kontrollstrukturen muss eigenlich der Ansatz schon falsch sein. Zerlege die Aufgabe in Teile, die du getrennt voneinander lösen kannst.



  • Sorry daran habe ich nicht mehr gedacht.
    i, j, k ist mein Paket [i][j][k];
    p ist meine Paket nummer, wo in der Kiste anzeigen soll, also z.b. 0 und dann 1 und so weiter
    l, m, n sollen meine Lauf variable sein, wo ich anfangen kann mein Paket rein zu packen
    t =i mal j mal k

    Ich weiß nicht wie ich ein minimalbeispiel einfügen kann oder wie ich das machen soll, habe deswegen mal mein kompletten code rein

    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
        //Funktion***
        void meldung(int Sprache, int meldungsnr);
        void fuellen(int Paket [3], char Kiste [4][4][6]);
        void loeschen(char Kiste [4][4][6], int Paket [3]);
        void ausgabe(char Kiste [4][4][6]);
    
    int main()//Hauptprogramm Paket in Kiste!
    {
        int Sprache;
        char Kiste [4][4][6], Auswahl;
        int Paket [3];
            int p = 48;
            Paket[3]=p;
    cout << Paket[0] << "  -  " << Paket[1] << "  -  " << Paket[2] << "  -  " << Paket[3] << "  -  ";
            int X, Y, Z;
            for (Y=0; Y < 4 ; Y++){
                for (Z=0; Z < 4; Z++){
                    for (X=0; X < 6; X++){
    
                        Kiste [Y][Z][X] = '.';
                    }}}
    
        //Sprache abfragen***
        cout << "Pakete in Kiste packen!\n";
        Sprache = 0;
        do {
        meldung(0,0);
        cin >> Sprache;
        } while (Sprache!=1 && Sprache!=2 && Sprache!=3);
        //Auswahl bestaetigung und Kisten inhalt***
        meldung(Sprache, 1);
        meldung(Sprache, 5);
        ausgabe(Kiste);
        //Paket Auswahl***
        meldung(Sprache, 2);
        meldung(Sprache, 8);
        cin >> Paket[0];//Y o. j
        meldung(Sprache, 9);
        cin >> Paket[1];//Z o. k
        meldung(Sprache, 7);
        cin >> Paket[2];//X o. i
        //Paket in Kiste***
        fuellen(Paket, Kiste);
        //Weiter ? ***
        label:
        do {
        meldung (Sprache,6);
        cin >> Auswahl;
    
        } while (Auswahl != 'j' && Auswahl != 'J' && Auswahl != 'y' && Auswahl != 'Y' && Auswahl != 's' && Auswahl != 'S' && Auswahl != 'n' && Auswahl != 'N' );
            if ( Auswahl != 'j' && Auswahl != 'J' && Auswahl != 'y' && Auswahl != 'Y' && Auswahl != 's' && Auswahl != 'S' ){
                meldung (Sprache, 10);
    
                return(0);}
                    if ( Auswahl != 'n' && Auswahl != 'N' ){
                        meldung (Sprache, 11);
                                }
        //Neues Paket***
        meldung(Sprache, 8);
        cin >> Paket[0];//Y o. j
        meldung(Sprache, 9);
        cin >> Paket[1];//Z o. k
        meldung(Sprache, 7);
        cin >> Paket[2];//X o. i
        p++;
        Paket[3]=p;
        fuellen(Paket, Kiste);
    
        goto label;
    
    
                meldung(Sprache, 8);
                cin >> Paket[0];//Y o. j
                meldung(Sprache, 9);
                cin >> Paket[1];//Z o. k
                meldung(Sprache, 7);
                cin >> Paket[2];//X o. i
                fuellen(Paket, Kiste);
    
    
    
    }
    
    
        //Meldung Sprache***************************
        void meldung(int Sprache, int meldungsnr) {
            const int Anzmeldung = 20;
            const int AnzSprache = 3;
            string meldungen [Anzmeldung][AnzSprache];
    
            //Sprach Auswahl
            meldungen [0][0] = "\nWaehlen Sie eine Sprache! [De(1)] \nElige un Idioma!          [Sp(2)] \nChoose a language!        [En(3)] \n";
            //Bestätigung der Sprache
            meldungen [1][1] = "\n---->Sie haben Deutsch gewaehlt!<-----\n";
            meldungen [1][2] = "\n-------->Has elegido Espanol!<--------\n";
            meldungen [1][3] = "\n------>You have chosen English!<------\n";
            //Paket größe Wählen
            meldungen [2][1] = "\nWaehlen Sie eine geeignete groesse fuer das Paket!\n";
            meldungen [2][2] = "\nElija un tamano para el paquete!\n";
            meldungen [2][3] = "\nChoose a Size for the Package!\n";
            //Paket loeschen ?
            meldungen [3][1] = "\nWollen Sie ein Paket löschen? (j/n)";
            meldungen [3][2] = "\nQuieres borrar un paquete? (y/n)";
            meldungen [3][3] = "\nDo you want to delete a package?";
            //Inhalt der Kiste sehen ?
            meldungen [4][1] = "\nWollen Sie die Inhalt der Kiste sehen? (j/n)";
            meldungen [4][2] = "\nQuieres ver el contenido de la caja? (y/n)";
            meldungen [4][3] = "\nDo you want to see the contents of the box? (s/n)";
            //Inhalt der Kiste
            meldungen [5][1] = "************Kisten Inhalt!************";
            meldungen [5][2] = "********Contenido de las cajas!*******";
            meldungen [5][3] = "************Boxes content!************";
            //Weiter machem ?
            meldungen [6][1] = "\nWollen Sie weiter machen? (j/n)";
            meldungen [6][2] = "\nQuieres continuar? (s/n)";
            meldungen [6][3] = "\nDo you want to continue? (y/n)";
            //Breite Waehlen
            meldungen [7][1] = "Waehlen Sie eine Breite! (Max.6)";
            meldungen [7][2] = "¡Elige un ancho!        (Max.6)";
            meldungen [7][3] = "Choose a width!   (Max.6)";
            //Höhe Waehlen
            meldungen [8][1] = "Waehlen Sie eine Hoehe!  (Max.4)";
            meldungen [8][2] = "¡Elige una altura!      (Max.4)";
            meldungen [8][3] = "Choose a height!  (Max.4)";
            //Tiefe Waehlen
            meldungen [9][1] = "Waehlen Sie eine Tiefe!  (Max.4)";
            meldungen [9][2] = "¡Elige una profundidad! (Max.4)";
            meldungen [9][3] = "Choose a depth!   (Max.4)";
            //Beenden!!***********
            meldungen [10][1] = "\nProgramm wird Beendet!  \n\n****Auf Wiedersehen!****  ";
            meldungen [10][2] = "\n¡El programa terminara!  \n\n\*****¡Adios!*****  ";
            meldungen [10][3] = "\nProgram will end!  \n\n****Goodbye!****  ";
            //Es geht weiter ;)
            meldungen [11][1] = "\n~~~~~Es geht weiter!~~~~~  \n\nNaechstes Paket\n";
            meldungen [11][2] = "\n~~~~~Continuar ahora!~~~~~  \n\nSiguiente paquete\n";
            meldungen [11][3] = "\n~~~~~It goes on!~~~~~  \n\nNext package\n";
    
    
    
        cout << meldungen[meldungsnr][Sprache] << endl;
        return;
    
    
        if (meldungsnr < 0 || meldungsnr > Anzmeldung - 1) {
            return; // Meldungsnummer unbekannt
        }
    }
    
    
        //Kiste Ausgabe*****************************
        void ausgabe(char Kiste [4][4][6]) {
    
            //Vereinbarung
    
            int X, Y, Z;
    
            //Ausgabe
            for (Y=0; Y < 4 ; Y++){
                for (Z=0; Z < 4; Z++){
                    for (X=0; X < 6; X++){
                        if (Y==0 && X==0)
                        cout << "                     ";
                        if (Y==1 && X==0)
                        cout << "              ";
                        if (Y==2 && X==0)
    
                        cout << "       ";
                        cout.width(3);
                        cout << Kiste [Y][Z][X];
    
                }
                cout << endl;
            }
            cout << endl;
        }
    }
    
    
        //Pakete generieren*************************
        void fuellen(int Paket [3], char Kiste [4][4][6]) {
    
            //char p;
            int X, Y, Z;
            int i, j, k, l, m, n, t, p, s=0;
            k=Paket[0];
            j=Paket[1];
            i=Paket[2];
            p=Paket[3];
            t= j*k*i;
    
            cout << k << "  " << j << "  " << i << endl;
    
            //Kiste
    
    do {
            for (Y=0; Y < j ; Y++){
                 for (Z=0; Z < k; Z++){
                    for (X=0; X < i; X++){
    
                        if (Kiste [Y][Z][X]== '.'){
                            for (l=0; l < j; l++){
                                if (Kiste [Y+l][Z][X] == '.')
                                   for (m=0; m < k; m++){
                                        if (Kiste [Y+l][Z+m][X] == '.')
                                            for (n=0; n < i; n++){
    
                                               if ((Kiste [Y+l][Z][X] == '.') && (Kiste [Y+l][Z+m][X] == '.') && (Kiste[Y+l][Z+m][X+n] == '.')){
                                                    Kiste[Y][Z][X] = p;
                                                    s++;
                                                    cout << s;
                                               }}}}}}}}
                                               } while (t >= s);
    
       ausgabe(Kiste);
    
    }
    


  • @Patrick_P

    Puh, was für in Chaos. Paket ist jedenfalls falsch dimensioniert (greifst auf Paket[3] zu, wobei 2 der maximale Index wäre).
    Mehr kann ich da gerade nicht zu sagen.



  • Und, was passiert denn, wenn dein erstes + dein zweites Paket größer ist als die Kiste (in irgendeiner Dimension)?



  • @Patrick_P sagte in Dreidimensionalen Array abfragen:

    }}}}}}}}

    Alles klar



  • Formatiere Deinen Code gscheid. Schmeiß Dein goto weg. Dann siehst Du vieleicht das Licht am Ende des Tunnels.

    VG



  • @Jockelx Ich hab jetzt erst seit 2 Semster Informatik und bin mit diesen Projekt leicht überfordert, deswegen sieht es so chaotisch aus.

    @Schlangenmensch Sollte dann eigentlich ein "Fehler" kommen dass das Paket zu groß ist oder kein Platz mehr vorhanden ist.

    @hustbaer Dachte ich mir bei deinem hilfreichen Kommentar auch 😉

    @mgaeckler Das goto ist nur provisorisch gewesen, da ich noch ziemlicher anfänger darin bin, sieht das natürlich nicht alles so gut aus und ist umständlich gemacht


  • Mod

    Nimm die Stilmängel ernst! Besonders als Anfänger! Sonst gewöhnst du dir am Ende noch an, so zu programmieren, anstatt dir anzugewöhnen, wie man es sauber macht. Besonders den Kommentar von @hustbaer . Glaubst du wirklich, ein Programm kann gut sein, das }}}}}}}} enthält?



  • @Patrick_P sagte in Dreidimensionalen Array abfragen:

    @hustbaer Dachte ich mir bei deinem hilfreichen Kommentar auch 😉

    Naja es sollte dir zu denken geben dass bzw. warum jemand überhaupt so ein Kommentar schreibt. Also denk darüber nach. Wenn du nicht draufkommst, frag gerne nach, irgendwer findet sich sicher der es dir dann erklärt.



  • @SeppJ Aber was soll ich mit einem "Alles klar" anfangen, wenn ich nicht weiß was er damit meint ? Da hat es @mgaeckler auf dem Punkt gebracht und gesagt was ich machen soll.
    Ich nehm gerne Ratschläge und Tipps an, wenn ich weiß was gemeint ist.
    Weiter oben im Code sieht es ja nicht so schlimm aus, da ich schon seit Tagen versuch die Abfrage hinzubekommen sieht es leider jetzt so aus.



  • Es wäre vor allem auch hilfreich, wenn du mal beschreiben würdest, was das Programm eigentlich tun soll. Darauf musst du vor allem mal eingehen. Ich habe bislang irgendwas von Kisten und Paketen verstanden und unklaren, undokumentierten Code gesehen.

    Dann sind aber auch viele Fehler im Programm. Ein array[3] hat gültige Indizes 0, 1 und 2, aber nicht 3.
    Das hier:

        int Paket[3];
        int p = 48;
        Paket[3] = p;
    

    ist also auf jeden Fall fehlerhaft. Schon meine IDE meckert hier die Zeile Paket[3] = p; an, spätestens dein Compiler sollte schon warnen: Array index 3 is past the end of the array (which contains 3 elements) [-Warray-bounds] (oder ähnlich). Und woher kommt die 48? Du hast generell zu viele magische Zahlen in deinem Programm stehen.

    Genau dasselbe Problem mit den 3 Sprachen, die du aber mit 1,2,3 statt 0,1,2 indizierst.

    Dann gibt es noch einige Bereiche mit "warning: code will never be executed [-Wunreachable-code]". Also, immer Warnungen aktivieren.

    Aber davon abgesehen: Du hast viel zu viele Variablen! Negativbeispiel ist fuellen, wo du gleich mit der Deklaration von 12 (!) einbuchstabigen (!!) uninitialisierten (!!!) Variablen beginnst. Wer soll da durchblicken?



  • Also man hat eine Kiste mit den maßen 4x4x6 und der Benutzer soll Pakete in die Kiste Packen und die abmaßen bestimmen können.
    Das Programm soll dann schauen ob das Paket in die Kiste passt und ob noch Platz in der Kiste vorhanden ist und dann rein Packen, wenn nicht soll Angezeigt werden dass das Paket nicht rein passt.
    Pakete müssen nicht gedreht werden und können auch instabil gestabelt werden.
    Der Benutzer soll dann auch ein Paket auswählen und aus der Kiste raus löschen können.

    Komisch, bei mir wurde diesbezüglich nie eine Warnung angezeigt, aber das änder ich mal.
    Die int 48 zeigt mir die 0 in der Kiste an, kann man bestimmt auch anders lösen.

    Mit dem Teil fuellen bin ich eh nicht zufrieden und das ist wirklich mit den ganzen variablen unübersichtlich geworden, aber ich weiß nicht wie ich das einfacher machen kann.



  • @Patrick_P sagte in Dreidimensionalen Array abfragen:

    Ich hab jetzt erst seit 2 Semster Informatik

    Erst?????
    Das konnte ich mir jetzt nicht verkneifen 🙂



  • @Mechanics sagte in Dreidimensionalen Array abfragen:

    @Patrick_P sagte in Dreidimensionalen Array abfragen:

    Ich hab jetzt erst seit 2 Semster Informatik

    Erst?????
    Das konnte ich mir jetzt nicht verkneifen 🙂

    Hatte/Hab nur alle 2 Wochen ã 1,5 Std Vorlesung, deswegen Erst 😃



  • Hä, ich raffs net. Für mich ist das eine Mathe Aufgabe. Kannst du Ausgabenbeispiele machen? Also wenn ich X Eingabe soll Y angezeigt werden...



  • Ich denke, es ist was wie ein 3D-Tetris mit Kisten/Paketen... Wenn ein Paket reinkommt, soll der verbliebene Platz für weitere Pakete angezeigt werden.



  • Der Inhalt eines Informatik-Studiums ist nicht ausschließlich "Programmieren". Das kommt zwar auch vor, aber ist ja nur ein kleiner Teil. Programmieren lernt man nur durch viel Praxis. Nur Übungsaufgaben reichen nicht.

    @out: ich denke, wenn es ein paar mehr Pakete sind in der Kiste, muss man ggf. durchprobieren/umsortieren, um mehr Platz zu schaffen. Wenn die Pakete alle Quader sind, ist die Aufgabe bestimmt leichter als wenn beliebige Paketformen zugelassen sind. Da man Pakete auch wieder entfernen können soll, muss man hier ggf. andere, darüber liegende Pakete zuerst entfernen und danach wieder reinlegen (die liegen dann ggf. tiefer). Ich denke zumindest, dass die Aufgabe in die Richtung geht, auch wenn das so bislang von @Patrick_P noch nicht formuliert wurde.



  • Ich Studiere Maschinenbau und wir kratzen da leider nur an der Oberfläche.

    Mal ein Beispiel in 2D

    Kiste leer.      Paket 1.         Paket 2. 
    0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
    0 0 0 0 0 0     1 1 0 0 0 0     1 1 2 2 2 0
    0 0 0 0 0 0     0 0 0 0 0 0     0 0 2 2 2 0
    0 0 0 0 0 0     0 0 0 0 0 0     0 0 0 0 0 0
    

    Paar Pakete würden ja noch rein passen und falls das neue Paket zu groß ist oder keinen Platz mehr haben sollte
    cout >> "Das Paket passt nicht mehr in die Kiste" ; kommen

    Paket 1 löschen 
    0 0 2 2 2 0
    0 0 2 2 2 0
    0 0 2 2 2 0 
    0 0 0 0 0 0
    

    Pakete müssen dann nicht auf gerückt werden, die bleiben an der Stelle stehen und müssen nicht gedreht werden falls es doch passen würde.


Anmelden zum Antworten