Arrays mit Zustandsänderung
-
#include <iostream> #include <string> using namespace std; string array[]={"Hallo","Test"};
geht doch einfach!
-
da es sich ja nur um an/aus-Zustände handelt, würd ich am einfachsten ein bool-Array nehmen. Das ist wohl am einfachsten...
-
wollt nur zeigen das es geht...
-
Du kannst es auch mit einem struct und nem Array machen, also:
struct car { std::string name; bool running; };
dann ein array erstellen
const int carcount = 6; car cars[carcount]; // init ... // später in der Zuweisung ... cars[i].running = !(cars[i].running); ...
-
Hallo,
ich hab es jetzt so geamcht, dass ich mir ein int array erstellt habe und dann anfangswerte zuweise (hier die 2). das ganze schaut so aus:
for(int i=0; i<= autos; i++) { array[i] = 2; } return 0;
mit einer schleife lasse ich mir dann immer die namen ausgeben, also auto 1....
for (int anzahl = 1; anzahl <= autos; anzahl++) { cout << "Auto " << anzahl << ": "; for (int i=1; i<= sizeof(iarray); i++) { if (array[i] == 2) { cout << " an " << endl; } else if (array[i] == 3) { cout << " aus " << endl; } else // falls eine andere Zahl dort stehen sollte { } break; } } return 0; }
und gleich dahinter die jeweiligen anfangszustände, also alle Autos aus.
so jetzt hab ich nen problem mit der zustandsänderung. es soll ja dann ab 2 beginnend das array für die länge durchlaufen werden und dann der zustand geändert werden. (bsp. bei 2, also 2, 4, 6; dann geht es weiter bei 3, dann wird 3 geändert und 6....)
der code schaut so aus
int aenderungZustand(int autos) { int au = autos; for ( int i = 2 ; i <= au ; i++) { if(array[i] == 2) { array[i]=3; } else if(array[i] == 3) { array[i]=2; } else { array[i]=0; } }
wo ,mache ich denn da jetzt den fehler, bei dieser sache hier wird jeder zustand jedes mal geändert, also es wird immer jeder punkt im array durchlaufen, wobei ja nur beim ersten die vielfachen von 2, beim 2 durchlauf die vielfachen von 3 usw. geändert werden sollen.
und mein 2. tes momentanes problem besteht in der erneuten ausgabe.
int zustandSichtbar(int anzahl) { int an = anzahl; for (int anzahl = 1; anzahl <= an; anzahl++) { cout << "Auto " << anzahl << ": "; for (int i=1; i<= sizeof(array)/sizeof(array[i]);i++) { switch(array[i]) { case 2: cout << " aus " << endl; break; case 3: cout << " an " << endl; break; default: cout << endl; break; } } return 0; } return 0; }
hier werden jetzt alle zustände nochmal ausgegeben, was ja falsch ist
das wird ausgegeben:
Auto 1 : aus
an
aus....
Auto 2: aus
an
aus...
...das ist ja falsch da es so aussehen sollte
Auto 1: aus
Auto 2: an
Auto 3 ausAlso da muss irgendwo noch der Fehler sein, dass ich immer das ganze array hinter jedem auto ausgebe und nicht nur die position. aber ich find den fehler da nicht...
Kann mir jemand von euch da bei meinen problemem mal kurz helfen? danke
-
hm, na gut, dann doch fertige Schleife ...
Ich versteh' nicht, wieso Du da mit int rummachst, ein Auto kann doch nur an oder aus sein. Ein bool reicht hier vollkommen. Die Namen brauchst Du ja nicht, wie Du sagtest, also brauchst auch erstmal kein struct, aber dann nimm doch ein Array von bool.
const int carcount = 6; bool cars[carcount]; // Init, ist zwar eigentlich standard false, aber sicherheitshalber: for (int i = 0; i < carcount; ++i) { cars[i] = false; } // Erstmal abstand hochzählen for (int abstand = 2; abstand <= carcount; abstand++) { // Alle Autos ablaufen for (int i = 0; i < carcount; ++i) { // Wenn Auto im aktuellen Abstand: if ( (i+1) % abstand == 0 ) { // (i + 1), um weil der Array-Index bei "0" beginnt, die Autos aber bei "1" cars[i] = !cars[i]; // Wechsel zwischen true (an) und false (aus) } } } // Ausgabe: std::cout << "Endzustand:" << std::endl; for (int i = 0; i < carcount; ++i) { std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl; }
Ist jetzt ungetestet, aber sollte so laufen, evtl. 2-3 Syntaxfehler, aber von der Logik her sollte das so funzen.
-
was vielleicht noch eleganter wäre ist, wenn du statt '++i' und der Modulo-Abfrage einfach 'n += Abstand' schreibst.
Also:
for (int i=Abstand-1; i<carcout; i += abstand) cars[i] = !cars[i];
-
Jop, hast Recht, spart auf jeden Fall unnötige Schleifendurchläufe.
-
Hallo nochmals, ich hab jetzt den Code mal nachvollzogen und das scheint ja mit der Lösung gut zu klappen, bloß eine Frage hab ich dazu noch, wenn ich das Compiliere, bekomme ich an dieser Stelle ne Fehlermeldung:
std::cout << "Endzustand:" << std::endl; for (int i = 0; i < carcount; ++i) { std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl;
Was hat das std:: da zu zuchen, muss ich da noch etwas anlegen für?
-
das
std::cout
bedeutet, das er das cout aus dem namespace std holt..
Hast du irgendwo (am anfang deines programmes) schon sowas stehen:
using namespace std; //oder using std:cout; using std::endl;
wenn ja, kannst die std da wegmachen!
Und im übrigen, wäre die Fehlermeldung nicht schlecht, das wir die mal uns anschauen könnten
-
Ja okay, sorry wegen der Fehlermeldung
ich reich sie jetzt mal nach.
Das mit dem std hat sich dank deiner Hilfe auch geklärt, es sind alle Fehlermeldungen verschwunden. Ich hatte den std schon weiter oben anders definiert.
Aber nun zur letzten Fehlermeldung und zwar an dieser Codestelle:std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl
Fehlermeldung: " error C2064: Ausdruck ergibt keine Funktion, die 1 Argument übernimmt"
-
Oh Sorry,
std::cout << "Auto " << (i+1) << ": " (cars[i] ? "an" : "aus") << std::endl;
muss natürlich
std::cout << "Auto " << (i+1) << ": " << (cars[i] ? "an" : "aus") << std::endl;
Hatte ein "<<" vergessen, aber ich hatte ja gesagt, dass evtl. 2-3 Syntaxfehler drin sind.
-
Da fehlt ein <<.
[edit]zu spät[edit]
-
Hey super, dank euch beiden, jetzt läuft es!
Ich hab am Ende da so viel schon ausgetestet gehabt, nochmal das ganze Array neu übergeben usw. aber das war mir auch nicht aufgefallen.... klasse!!!
Also danke