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 einenunsigned 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.