Hilfe - Matrix umgekehrt ausgeben



  • Hallo,

    ich suche dringend nach Hilfe und hänge über dem Problem schon eine ganze Weile.

    Ich würde gerne eine Matrix umgekehrt ausgeben.
    Mein Einlagerungscode wäre dieser:

    for (int s=0; s<4; s++) {
    if (feld2[ebene][s] < 30) {
    while (feld2[ebene-1][s] < 30 && werkstuecke > 0) {
    feld2[ebene-1][s] = feld2[ebene-1][s] +1;
    werkstuecke--;
    };
    }
    else s++; //ein Fach weiter
    };

    Nun soll das Programm quasi von "rechts" die vorher eingelagerten "werkstuecke" wieder heraus nehmen, dabei sollte die Fächer dieser Ebene von links nach rechts wieder genullt werden. Also quasi nachgeschoben werden.
    Ich weiß aber leider nicht wie ich diesen Code "umdrehen" soll..

    Vielleicht kann mir ja hier jemand behilflich sein.

    Danke+ Gruß, 🙂



  • Du hängst da schon eine ganze Weile? Ist nich wahr. Hast du bei dem Teil mit den Vorschleifen geschlafen oder fehlt es dir an der Logik selbst?
    Achja, und benutze bitte Codetags!



  • Ich versuch mal etwas Klarheit zu bekommen

    Du hast 4 Fächer.
    In diese passen 30 Werkstücke rein.
    Wenn ein Fach voll ist, dann soll das nächset genommen werden.

    Es gibt noch verschiedene Ebenen von den 4 Fächern

    Aber trotzdem verstehe ich 2 Sachen nicht:

    for (int s=0; s<4; s++) {       // gehe alle Fächer der Ebene durch
                if (feld2[ebene][s] < 30) {   // wenn noch Platz ist
                        while (feld2[ebene-1][s] < 30 && werkstuecke > 0) { // Warum denn jetzt ebene-1 ?
                            feld2[ebene-1][s] = feld2[ebene-1][s] +1;       // Einlagern
                            werkstuecke--;
                            };
                        }
                 else s++; //ein Fach weiter // wird das nicht schon im Schleifenkopf (Zeile 1) gemacht?
            };
    

    Deine while-Schleife kannst du auch berechnen lassen.

    FlyingBull schrieb:

    Nun soll das Programm quasi von "rechts" die vorher eingelagerten "werkstuecke" wieder heraus nehmen, dabei sollte die Fächer dieser Ebene von links nach rechts wieder genullt werden. Also quasi nachgeschoben werden.

    Du willst aus dem Fach 3 etwas rausnehmen und dann soll das wieder mit Teilen aus dem Fach 2 aufgefüllt werden.
    Und das Fach 2 dann mit Teilen aus Fach 1 ?

    Das Wäre dann eine Mischung aus LIFO, wenn die Fächer noch nicht voll sind und LILO wenn die Fächer schon mal voll waren.

    Wie erkennst du den Unterschied, ob das Teil aus Fach 3 oder Fach 0 kommt?
    Im Augenblick sind es ja nur Werte im Fach. Da gibt es keinen Unterschied ob du erst Fach 0 leer machst und dann Fach 1 ...



  • Richtig DirkB,

    Die else Funktion könnte ich weg lassen.
    Das [Ebene-1]: Die Matrix muss bei der Zeilenabfrage 1,2 o 3 belegt werden. Deshalb Ebene-1 sodass ich nicht ins "Leere" schreibe.
    Das läuft auch so.

    Die Frage ist nur: wie kann ich das Feld nun umdrehen um mir Pro Zeile eine Ausgabe, von den eingegebenen Werkstücken, zu erhalten.

    Danke + Gruß



  • Der Code räumt die Fächer von 3 nach 0 leer

    for(int i=3;i>=0 && werkstuecke>0;i--) 
    {
      if (feld2[ebene][s] > werkstuecke ) 
      { feld2[ebene][s] -= werkstuecke;  // es sind genug Werkstücke im Fach
        werkstuecke = 0;
      } 
      else
      { werkstuecke -= feld2[ebene][s];
        feld2[ebene][s] = 0;
    }
    


  • Danke DirkB,

    Es läuft soweit mit dem auslagern.
    Leider zieht er die Werkstücke noch nicht von links nach Rechts.

    Gruß,



  • Du lagerst von 0 nach 3 ein, willst aber von 3 nach 0 auslagern.
    Was passiert in der Zeit, wo du nur in Fach 0 eingelagert hast (z.B: 20)
    Nach dem Auslagern von 15 sollen dann die restlichen 5 in Fach 3 sein?

    Wo werden dann die Nächsten 20 eingelagert? Fach 0?

    Welchen Vorteil hat das?

    for(int i=0;i<4 && werkstuecke>0;i++)  // maximal 4 Durchläufe oder alle Werkstücke sind geholt
    {
      if (feld2[ebene][3] > werkstuecke )
      { feld2[ebene][3] -= werkstuecke;  // es sind genug Werkstücke im Fach
        werkstuecke = 0;                 
      }
      else
      { werkstuecke -= feld2[ebene][3];         // jetzt ist Fach 3 leer
        for (int j=3;j>0;j--)                   // Darum auffüllen
        { feld2[ebene][j] = feld2[ebene][j-1];  // Fach 2 -> Fach 3, Fach 1 -> Fach 2, Fach 0-> Fach 1
        }
        feld2[ebene][j]=0;                      // Fach 0 ist jetzt leer
      }
    }
    

    ungetestet



  • Glaube ich hab das Falsch dargestellt... sorry.

    Meine Ebenen sind meine Zeilen und meine Spalten meine Fächer

    Gruß,



  • Ich habe die Kommentare nochmal angepasst.

    FlyingBull schrieb:

    Nun will ich eben aus dem 4. Fach herausnehmen und beim Auslagern werden zuerst Werkstücke aus Fach 4 entnommen.

    Zeile 3 - 5

    FlyingBull schrieb:

    Sind nicht genügend Werkstücke in Fach 4, dann werden die vorhandenen Werkstücke entnommen.

    Zeile 8

    FlyingBull schrieb:

    Darauf läuft die Automatisierung und alle Fächer dieser Ebene werden um ein Fach nach rechts geschoben.

    Zeile 9-12

    FlyingBull schrieb:

    Wieder werden Werkstücke entnommen.

    Zeile 3-8

    FlyingBull schrieb:

    Reicht es wieder nicht, erfolgt der nächste Rechts-Shift

    Zeile 9-12

    FlyingBull schrieb:

    usw. maximal viermal.

    Zeile 1



  • Es läuft!
    Perfekt.
    Danke! 🙂


Anmelden zum Antworten