Dreidimensionalen Array abfragen



  • @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.



  • Programmier das doch erstmal in 1D. Wenn das funktioniert und du verstehst wie es geht, ist das erweitern auf 2D und dann 3D ein Klacks.

    Und schmeiss deinen unlesbaren Code weg. Danke.



  • Die Probleme sind ja schon genannt worden: Absolut keine Abstraktion mit Hilfe einer geeigneten Struktur und die Hauruckmethode, alles in dieser einen Funktion machen zu wollen. Wenn du für das Problem unterteilst, schreibt sich das Programm fast von alleine.
    Minimalbeispiel für eine 3D-Arrayklasse:

    template<typename T, class C=std::vector<T>>
    class Arr3D
    {
    public:
    	Arr3D(size_t w=1, size_t h=1, size_t d=1, const T& fill=T())
                : m_width(w), m_height(h), m_depth(d), m_data(w*h*d, fill)
    	{ }
    	const T& Get(size_t x, size_t y, size_t z) const {
    		return m_data[index(x, y, z)];
    	}
    	void Set(size_t x, size_t y, size_t z, const T& val) {
    		m_data[index(x, y, z)]=val;
    	}
    	void Fill(const T& fill=T()) {std::fill(m_data.begin(), m_data.end(), fill);}
    	size_t GetWidth() const	{return m_width;}
    	size_t GetHeight() const {return m_height;}
    	size_t GetDepth() const {return m_depth;}
    private:
    	size_t index(size_t x, size_t y, size_t z) const {
    		assert(x<m_width && y<m_height && z<m_depth);
    		return x+m_width*(y+m_height*z);
    	}
    	size_t m_width, m_height, m_depth;
    	C m_data;
    };
    

    Das ist halt wirklich das abolute Minimum. Aber so hat man zumindest Gewissheit, nicht über Arraygrenzen hinaus zu lesen oder zu schreiben. Es könnte noch erweitert werden, dass auch in der Releaseversion die Grenzen gecheckt werden. Bei dem C-Array wird ggf. eine OS-Exception ausgelöst oder du überschreibst eigene Stack-Variablen und das Programm crasht, wenns blöd läuft, an einer ganz anderen Stelle.
    Dann noch die vielen direkt gecodeten Konstanten. Du kannst ja mal nachzählen, an wievielen Stellen du diesen kurzen Code ändern müsstest, wenn sich die Dimension der Box ändern soll. Gleiches gilt auch für das '.'-Zeichen.
    Und eben unterteilen:
    Ob ein Paket in eine Ebene passen könnte, lässt sich schon schnell ermitteln, indem alle freien Plätze in der Ebene gesucht werden. Nur wenn die Anzahl größer gleich Paketbreite x Pakettiefe ist, kann es überhaupt passen.
    Dann die Indizes bestimmen, bis einem etwas Besseres einfällt, könnte man einfach von einem Index aus in x-, y- und z-Richtung schauen. Netter Nebeneffekt: Wenn die Grenze der y-Richtung auf 0 gesetzt wird, kann auch kein Paket unter ein bereits Eingefügtes gelegt werden. Wenn alle drei Bedingungen erfüllt sind, kann das Paket platziert werden und mit dem nächsten fortgefahren werden.
    Wenn du für jeden Schritt eine Funktion schreibst, die für sich nicht viel macht, dafür aber korrekt arbeitet, ließe sich das Programm auch noch zu einem späteren Zeitpunkt erweitern und verbessern.



  • @Patrick_P Du solltest (mit Whitespace) formatierten Text mit Code-Tags versehen, damit die Leerzeichen auch erhalten bleiben.

    @Patrick_P sagte in Dreidimensionalen Array abfragen:

     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
    


  • @yahendrik Danke für das Beispiel 🙂
    Läuft aber noch nicht ganz bei mir, weil paar #include gefehlt haben und noch ein paar errors vorhanden sind.

    @DirkB Habe ich geändert, danke 😉


Anmelden zum Antworten