Array Variablen rotieren lassen



  • Guten Abend,
    im unten stehenden Code soll, nach der Eingabe des Benutzers, die Inhalte des Arrays rotiert werden. Bis zur Eingabe "10" funktioniert es.
    Über Hilfe wäre ich sehr dankbar.

    #include <iostream>
    #include <conio.h>
    #include <cstdlib>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
        srand(time(NULL));
        int feld[20], temp, temp2, zuf;
        unsigned stellen;
    
        for (int i=0; i<20; i++) //Definieren der Variablen mit Zufallszahlen
        {
            zuf=rand()%51;
            feld[i]=zuf;
            cout<<feld[i]<<' '; //Ausgabe des Datenfeldes
        }
    
        cout<<endl<<endl<<"Um wie viele Stellen soll nach links rotiert werden? ";
        cin>>stellen;
    
        cout<<endl;
        for (int j=0; j<stellen; j++) //Anzahl der Rotierungen
        {    
            for (int i=0; i<19; i++) 
            {
                if (feld[i]==feld[0])  //Spezialfall
                {
                    temp2=feld[19];
                    feld[19]=feld[0];
                    i++;
                }
                temp=feld[i];
                feld[i]=feld[i+1];
                feld[i-1]=temp;
            }
            feld[18]=temp2;
        }
    
        for (int i=0; i<20; i++) //Ausgabe des rotierten Feldes
        {
            cout<<feld[i]<<' ';
        }
    
        getch();
    }
    

    EDIT:
    die Laufzeitvariablen der zweiten for-Schleife korrigiert (i anstelle von j)



  • Habe Deinen Fehler nicht gesucht. Aber evtl ist ein ein Klassiker der Programmierkunst hilfreich, einfaches Rotieren in O(n): Man rotiert ein Array, indem man bis zur Rotiergrenze und ab der Rotiergrenze umdreht und danach das ganze Array umdreht.



  • volkard schrieb:

    einfaches Rotieren in O(n): Man rotiert ein Array, indem man bis zur Rotiergrenze und ab der Rotiergrenze umdreht und danach das ganze Array umdreht.

    hä? ... kannst Du mir das mal am Beispiel verdeutlichen

    ansonsten

    for(int j = 0; j < anzahl; j++)
    {
      int backup = feld[0];
      for(int i = 0; i < 19; i++)
      {
        feld[i] = feld[i + 1]
      }
      feld[19] = backup;
    }
    


  • Ja, eine bildliche Darstellung wäre gut.



  • mogel schrieb:

    volkard schrieb:

    einfaches Rotieren in O(n): Man rotiert ein Array, indem man bis zur Rotiergrenze und ab der Rotiergrenze umdreht und danach das ganze Array umdreht.

    hä? ... kannst Du mir das mal am Beispiel verdeutlichen

    Halt beide Hände mit gestreckten Fingern übereinander. Schreib auf die Finger von oben nach unten die Zahlen von 1 bis 10.
    Und jetzt das Rotieren.
    Start: 1 2 3 4 5 6 7 8 9 10
    Dreh eine Hand um.
    5 4 3 2 1 6 7 8 9 10
    Dreh die andere Hand um.
    5 4 3 2 1 10 9 8 7 6
    Dreh beide miteinander um.
    6 7 8 9 10 1 2 3 4 5
    Sich klarmachen, daß das das selbe ist, wie das Gesamtarray um 5 Plätze zu rotieren, also die Hände zu vertauschen.
    Viola.

    Sobal das flüssig und ohne Anleitung funktioniert, mach an einer Hand zwei Finger ab, daß es ein Array der Größe 8 wird und um 3 rotiert wird. Wenn das auch klappt, sollte das Verfahren klar sein.



  • ist ja clever ... da schlägt man jede Rotation mit O(3) tot 🙂



  • Verstehe ich das jetzt richtig: Man soll also die zwei Hände als jeweils ein Feld interpretieren und es später in ein Feld schreiben? So richtig verstehe ich es nicht.



  • Phisherman schrieb:

    Verstehe ich das jetzt richtig: Man soll also die zwei Hände als jeweils ein Feld interpretieren und es später in ein Feld schreiben? So richtig verstehe ich es nicht.

    Ist ein wenig verwirrend da es mehrere Arten gibt die Hände mit gestreckten fingern übereinander zu halten. IMHO meint volkard es wie Beispiel 3 in folgendem Pdf: http://www.cs.bell-labs.com/cm/cs/pearls/s02b.pdf


Anmelden zum Antworten