Problem mit einer Zählerschleife
-
Ich wollte eine zählerschleife machen die folgendermaßen klappt:
array was meinetwegen 3 zeilen umfasst, es wird so hochgezählt:
0 0 0 ->
0 0 1 ->
0 0 2 ->
0 0 3 ->
0 1 0 ->
0 1 1 ->
0 1 2 ->
0 1 3 ->
0 2 0 ->
...
3 3 3das ganze wollte ich so zusammenbasteln:
int ln = 5; int *array = new int[ln]; int limes = 255; for(int i = 0; i < ln; i++) { array[i] = 0; } while(true) for(int i = ln-1; i >= 0; i--) { if(array[ln-1] <= limes) array[ln-1]++; if(array[i] == limes) { array[i] = 0; if(i > 0) array[i-1]++; } /* if(array[0] == limes) { break; } */ //ausgabe cout<<"zaehler: "; for(int i = 0; i < ln; i++) { cout<<i<<": "<<array[i]<<" "; } cout<<endl; }leider funktioniert das nicht so ganz und ich weiß nicht warum?
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET 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.
-
würd das rekursiv machen *gg*
-
for (unsigned short x = 0; x < 12; ++x) for (unsigned short y = 0; y < 12; ++y) for (unsigned short z = 0; z < 12; ++z)oder was willst du haben?
-
#include <iostream> #include <iomanip> using namespace std; int main(void){ for(int i=0; i<=3;i++) for(int j=0; j<=3;j++) for(int k=0; k<=3;k++){ cout.right; cout.fill('0'); cout.width(3); cout << k+j*10+i*100 <<endl; } cin.get(); return 0; }
-
nein, sowas ist scheiße... und ziemlich un-elegant.. eigentlich müsste mein beispiel doch funktionieren, sowie ein element[i] eines array den limes reeicht wird der breiech davor hochgezählt und array[i] wieder zurückgesetzt?!
eure möglichkeit ist statisch und erlaubt keine modifikation des zählers zur laufzeit.
-
tut mir wegen der rechtschreibung leid... ich denke fast die tastatur spinnt. wie dem auch sei... ich will wie in meinem beispiel ein array von beliebiger größe auf diese art und weise hochzählen. und das klappt nunmal nicht, mit 3 schleifen wenn mein array z.b. 100 stellen hat; dann müsste ich nämlich -leider gottes- 100 schleifen machen. jedenfalls auf eure weise!
-
du hast doch den grundgedanken, dann schreibmal deinen code hin den du gemacht hast, meiner war ein kleiner denkanstoß und keine lösung, es funktioniert auch noch nicht richtig ....
-
1. Die Hilfsbereitschaft der Leute hie wird für dich schnell gegen 0 tendieren wenn Du weiterhin gut gemeine vorschläge als Scheiße bezeichnest. Das ist ein ziemlich rüdes Verhalten.
2. Wenn Du besondere Anforderungen an den Zähler stellst dann mach dir doch beim nächsten Mal die Mühe das im ERSTEN Posting auch zu sagen und nciht hinterher die Leute anzupflaumen weil sie nciht selbst drauf gekommen sind...
-
das prob ist ja.. ich verstehe nicht ganz warum mein beispiel hier nicht hochzählt, wenn ein bereich des array 255 ist.
das problem ist nicht ganz so einfach wie es scheint, aber iregdnwie sehe ich den fehler im mom nicht.
das hier funktioniert schon etwas besser... aber eben auch noch nicht ganz:
while(true) for(int i = ln-1; i >= 0; i--) { //if(array[ln-1] <= limes) array[ln-1]++; for(int j = 0; j < ln; j++) if(array[j] == limes) { array[j] = 0; if(j > 0) array[j-1]++; } //ausgabe cout<<"zaehler: "; for(int i = 0; i < ln; i++) { cout<<array[i]<<" "; } cout<<endl; }
-
Also bevor du unsere Ansätze als scheiße betrachtest ... guck dir mal diesen wirklich unschönen Code von dir an ... ne constante in ner schleife usw ... sowas geht garnet

-
^^ war wirklich net bös gemeint, aber 3 schleifen hätte ich gemacht, wenn es sinnvoll gewesen wäre.
-
meinst du sowas ?
#include <iostream> using namespace std; int main(void){ int Ary[3] = {0,0,0}; cout << Ary[2] << Ary[1] << Ary[0]<<endl; for(int i=0;i<28;i++){ if((i%3==0) && (Ary[0]!=0)){ Ary[0] = 0; Ary[1] = Ary[1]+1; if((Ary[1]%3 == 0)&& (Ary[1]!=0) ){ Ary[1] = 0; Ary[2] = Ary[2]+1; } } else Ary[0] = Ary[0]+1; cout << Ary[2] << Ary[1] << Ary[0]<<endl; } cin.get(); return 0; }habs nicht getestet....
aber wenn du das so meinst dann nimm lieber doch die schleifen -.-finde so einen code scheiße :P, aber wozu willst du das so ?
-
naja... ähnlihes problem; es werden nicht alle möglichkeiten durchprobiert. und das beispiel scheint im gegensatz zu meinem auch noch abhängig von der spaltenzahl zu sein.
-
meinste so?
int main() { int ln = 3; int *array = new int[ln+1]; int limes = 3; for(int i = 0; i < ln+1; i++) { array[i] = 0; } while(array[ln] == 0) { for(int j = ln-1; j >= 0; --j) { cout<<array[j]<<" "; } cout<<endl; int i = 0; for(; array[i] == limes; ++i) { array[i] = 0; } ++array[i]; } }
-
Blubb?
#include <stdio.h> #include <cassert> bool inc_array(unsigned* array, unsigned limit, unsigned index) { bool complete = false; if (array[index] >= limit) { assert(array[index] == limit); if (index > 0) { array[index] = 0; complete = inc_array(array, limit, index - 1); } else complete = true; } else array[index]++; return complete; } void dump_array(unsigned* array, unsigned size) { printf("["); for (unsigned i = 0; i < size; i++) { printf("%d", array[i]); if ((i + 1) != size) printf(","); } printf("]\n"); } int main() { unsigned array[3] = {}; printf("beginning with:\n"); dump_array(array, 3); unsigned step = 1; while (!inc_array(array, 5, 2)) { printf("... step %d ...\n", step); dump_array(array, 3); step++; } printf("complete.\n"); return 0; }So und nu sag mir ob ich doof bin (==die Frage falsch verstanden hab), oder ob das nu wirklich so einfach war...

-
Ist jetzt nur so eben hingekladdet, aber so etwa würd ich das anfangen:
#include <algorithm> #include <iostream> #include <iterator> static void foo_aux(int *v, std::size_t v_len, unsigned max, unsigned rec_level) { if(rec_level == v_len){ std::copy(v, v + v_len, std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; } else { foo_aux(v, v_len, max, rec_level + 1); while(v[rec_level]++ < max) { std::fill(v + rec_level + 1, v + v_len, 0); foo_aux(v, v_len, max, rec_level + 1); } } } void foo(unsigned len, unsigned max) { int *buf = new int[len]; foo_aux(buf, len, max, 0); delete[] buf; } int main() { foo(3, 3); }
-
wie gesagt.. wenn es elgant machen willst dann "rekursiv"

-
Äh, habe ich was verpasst? Wieso nicht einfach so:
int const upper_limit = 255; // == (333)4 for(int i = 0; i < upper_limit; ++i) cout << to_system_with_base(i, 4) << endl;'to_system_with_base' bleibt als Übung für den OP. Sollte sich aber im Archiv des Forums in tausendfacher Ausführung finden.
-
bei dem Problem weiß es wohl niemand -.-