001
16.10.2018, 16:47 Uhr
ITWorks4U
|
Nun, da sich noch keiner dazu geäußert hat, mach ich das mal. ;-)
C++: |
for (bool b : chain){ /* ... */ }
|
Ab C++14, wenn ich mich nicht irre, gibt es die foreach-Schleife. Diese ist besonders bei Programmiersprachen, wie Java und C# vorhanden und wird verwendet, um ein Array, ein Feld, Vektor, ... komplett durchlaufen zu lassen, ohne überhaupt sich darüber einen Kopf zu machen, wie viele Elemente vorhanden sind.
printf() ist zwar in C beheimatet, kann aber auch unter C++ problemlos verwendet werden. Es muss also nicht unbedingt cout << ... << endl; da stehen.
Zitat von bakoll: |
Und den Ausdruck hinter ((b)? "W" : "B") versteh ich auch nicht.... Was meint der?
|
Das ist die Kurzschreibweise für:
C++: |
bool b = chain.at(i); if (b == true) { printf("W"); /* cout << "W" << endl; Kann auch verwendet werden. */ } else { printf("B"); }
inhalt.push_back(((b)? "W" : "B"));
|
Im Anschluss wird auf den Vektor "inhalt" an der Position i ein "W" oder "B" hinzugefügt, je nachdem, ob b wahr oder falsch war.
Zitat von bakoll: |
Ich möchte, daß in den Vector inhalt, folgendes hineingepackt wird, wenn ein B im B-W-Code davor steht, solll eine Null im Vector inhalt erscheinen, wenn ein W an der Stelle im B-W-Code davor steht, soll die Nr. der Stelle erscheinen.
Beispiel: Der Code BBBWBBWWWW soll im Vector als 00040078910 erscheinen.
|
So ganz nebenbei: Es wurde ein Vektor vom Typ bool erstellt, aber Strings, in dem Fall Wörter der Länge 1, wurden hier eingefügt. Jeder Compiler würde spätestens hier die Arbeit verweigern. ;-) Modifizieren wir das mal, wobei die längere Schreibweise für ein besseres Verständnis hier verwendet wurde:
C++: |
std::vector<int> getChainContent(const std::vector<bool> &chain) {
std::vector<int>content; /* Wir wollen 0 für "B" und ansonsten Position i für "W" haben, daher eine natürliche Zahl. */ /* alternativ auch: for (bool b : chain) { ... } */ for (int i = 0; i < chain.size(); i++) { bool b = chain.at(i);
if (b == true) { /* für jedes "B" wird eine 0 eingetragen */ inhalt.push_back(0); } else { /* sonst Position i für jedes "W" */ inhalt.push_back(i); } }
/* ... damit man diesen Vektor auch noch woanders verwenden kann */ return content; }
|
Anmerkung: Ich habe mir im Übrigen erlaubt den Schritt zu überspringen, dass aus dem Resultat von b[i] ein "B", sonst ein "W" zu machen, da wir hier nicht drei Vektoren brauchen und nur eins zurück geben. Der übergebene Vektor chain im Parameter wird nur zum Auslesen verwendet und macht nichts weiter. Wir brauchen somit keinen vector<String> zum Aufbewahren von "B" oder "W", sondern nehmen gleich einen vector<int>, da wir ja an der Position[i] eine 0 oder i eintragen und diesen wiederum an den Benutzer zurück geben.
¤: Hab den Code jetzt auch mal frei Schnauze zusammen gebastelt. Sollte aber funktionieren. ;-) -- Programmierrezepte frei Haus! Dieser Post wurde am 16.10.2018 um 16:55 Uhr von ITWorks4U editiert. |