feld rotation



  • Hi,
    hab folgendes Programm geschrieben, das auch bis auf ein Problem funktionier.
    Es soll eine integer Zahl n (postitv) eingegeben werden und dann sollen die felder um die anzahl n nach rechts rotieren. Aber der Inhalt des feldes [9] passt nie .
    Kann mir jemand sagen warum? Hier das prog zum ausprobieren:

    #include <iostream>
    using namespace std;
    int main (void)
    {
    int i;
    int array[10];
    int b;
    int n;
    int a;
    int z;
    int f;
    i=0;
    a=0;
    f=10;
    z=0;
    while (i<10)
    {
    i=i+1;
    array[i]=i;
    cout << array[i] << " " << flush;
    }
    cout << " " << endl;
    cout << "n eigeben: "<<flush;
    cin >> n;

    while (a+1<n)
    {
    a=a+1;
    b=array[9];
    array[9]=array[8];
    array[8]=array[7];
    array[7]=array[6];
    array[6]=array[5];
    array[5]=array[4];
    array[4]=array[3];
    array[3]=array[2];
    array[2]=array[1];
    array[1]=array[0];
    array[0]=b;

    }

    while (z<10)
    {
    cout << array[z] << " " << flush;
    z=z+1;
    }
    system("pause");
    }



  • Falsches Forum. So komische Sachen wie Strings in Streams bitshiften gibts nur in C++.

    Benutze bitte die [cpp][/cpp]-Tags.

    Deine ints lassen sich auch zusammen deklarieren.

    int i=0, b, n, a=0, z=0, f=10;
    

    Nach genauerem Hinsehen deklariere die Variablen lieber erst wenn du sie brauchst und nicht schon alle direkt am Anfang.

    Ich weiß auch grad nicht warum dein feld[9] spinnt, aber du kannst ja vor und nach der Zeile mit array[9]=array[8] das array[9] ausgeben und damit kucken an welcher Stelle es nicht stimmt.



  • Pjottre500 schrieb:

    ...
    while (i<10)
    {
    i=i+1;
    array*=i;
    cout << array[i] << " " << flush;
    }
    ...
    *

    ^^ das ist schonmal verkehrt. i wird zu früh hochgezählt, array[0] kriegt nix ab, array[10], das es nicht gibt, wird beschrieben. setz mal i vorher auf -1 oder die zeile [i]i=i+1* ganz unten in die schleife. vielleicht gehts dann.
    btw, der code ist sowieso ziemlicher schrott, am besten alles nochmal machen.
    🙂



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Versuch mal das hier

    ( das waren ganze 30 min meines lebens um dir zu helfen! 🕶 )

    #include <iostream>
    #include <string>
    
    #define MAX_ADDR( x ) ( (x) + sizeof ( (x) ) / sizeof ( (x)[0] ) )
    
    using namespace std;
    
    int main ( )
    {
    	const size_t MAX_L = 20;
    	int array[MAX_L];
    
    	int* pa = array;
    	int n = 0;
    
    	for ( int i = 1; i <= MAX_L; ++i, ++pa )
    	{
    		*pa = i;
    		cout << *pa << " " << flush;
    	}
    
    	cout << endl << "n eigeben: " << flush;
    	cin >> n;
    
    	if ( !cin )
    	    return -1;
    
        int tmp = 0;
    	for ( int i = 0; i < n; ++i )
    	{
            tmp = array[0];
    		for ( int k = 0; k < MAX_L - 1; ++k )
    		{
    			array[k] = array[k + 1];
    		}
    		*( MAX_ADDR( array ) - 1 ) = tmp;
    	}
    
        pa = array;
    	while ( pa < MAX_ADDR( array ) )
    	{
    		cout << *pa++ << " " << flush;
    	}
    
    	return 0;
    }
    

    Du kannst MAX_L beliebig setzen - es wird immer noch funktionieren 👍



  • Feld schrieb:

    Du kannst MAX_L beliebig setzen - es wird immer noch funktionieren 👍

    Beliebig setzen ja, funktionieren nein.



  • So, hab es jetzt soweit, das es einwandfrei funktioniert, jetzt soll ich noch die Funktion, die die feldinhalte verschiebt auslagern, wie mach ich das?

    #include <iostream>
    using namespace std;
    int main (void)
    {
    int i;
    int j;
    int array[10];
    int b;
    int n;
    int a;
    int z;
    int f;
    i=0;
    j=0;
    a=-1;
    f=10;
    z=0;
    while (i<10)
    {
    i=i+1;
    array[j]=i;
    cout << array[j] << " " << flush;
    j=j+1;
    }
    cout << " " << endl;
    cout << "n eigeben: "<<flush;
    cin >> n;

    while (a+1<n)
    {
    a=a+1;
    b=array[9];
    array[9]=array[8];
    array[8]=array[7];
    array[7]=array[6];
    array[6]=array[5];
    array[5]=array[4];
    array[4]=array[3];
    array[3]=array[2];
    array[2]=array[1];
    array[1]=array[0];
    array[0]=b;

    }

    while (z<10)
    {
    cout << array[z] << " " << flush;
    z=z+1;
    }
    system("pause");
    }



  • Benutz bitte [cpp]-Tags (erste weisse Schaltfläche unter dem Textfeld). Das sieht dann so aus:

    #include <iostream>
    using namespace std;
    int main (void)
    {
        int i;
        int j;
        int array[10];
        int b;
        int n;
        int a;
        int z;
        int f;
        i=0;
        j=0;
        a=-1;
        f=10; 
        z=0;
        while (i<10)
        {
              i=i+1;
              array[j]=i;
              cout << array[j] << " " << flush;
              j=j+1;
              }
        cout << " " << endl;
        cout << "n eigeben: "<<flush;
        cin >> n;               
    
       while (a+1<n)
        {
        a=a+1;
        b=array[9];
        array[9]=array[8];
        array[8]=array[7];
        array[7]=array[6];
        array[6]=array[5];
        array[5]=array[4];
        array[4]=array[3];
        array[3]=array[2];
        array[2]=array[1];
        array[1]=array[0];
        array[0]=b;
    
        }
    
    while (z<10)
    {
    cout << array[z] << " " << flush;
    z=z+1;  
    }
    system("pause");
    }
    

    Nimm das nicht persönlich, aber dein Code ist grauenhaft. Was bringt die Massen-Deklaration am Anfang der Funktion? Deklariere Variablen erst, wenn du sie brauchst. Und initialisiere sie gleich mit sinnvollen Werten, wenn möglich. Nimm ausserdem For-Schleifen, While ist hier nicht geeignet. Die elementweisen Array-Zuweisungen à la array[9]=array[8]; kannst du auch in eine Schleife packen. Wenn du das Ganze mit Modulo löst, brauchst du nicht einmal Spezialfälle zu beachten.

    Pjottre500 schrieb:

    So, hab es jetzt soweit, das es einwandfrei funktioniert, jetzt soll ich noch die Funktion, die die feldinhalte verschiebt auslagern, wie mach ich das?

    Weisst du, wie man in C++ eine Funktion definiert? Falls ja: schreibe dir eine, die als Parameter einen Zeiger auf int (für das Array) und einen unsigned int (für die Grösse) nimmt. Falls nein, solltest du das dringend in deinem C++-Buch nachlesen, Funktionen sind nämlich absolute Grundlagen.



  • nööö schrieb:

    Feld schrieb:

    Du kannst MAX_L beliebig setzen - es wird immer noch funktionieren 👍

    Beliebig setzen ja, funktionieren nein.

    In welchem Fall nicht?
    Ich gehe davon aus, das size_t auch passende Werte zugewiesen bekommt. Klar, wenn du -1 reinschreibst wird es nicht gehen, aber das ist schon eher Problem bei denjenigen, der es eingibt und nicht bei Programm als solches.


Anmelden zum Antworten