Hilfe für Anfänger bei verschachtelten For Schleifen und Vektoren





  • Willst du std::next_permutation nachbauen?

    #include <algorithm>
    #include <string>
    #include <vector>
    #include <iostream>
    
    int main()
    {
        std::vector<std::string> combinations;
    	std::string s = "abc";
        do {
    		combinations.push_back(s);
        } while(std::next_permutation(s.begin(), s.end()));
    	for(std::vector<std::string>::const_iterator iter = combinations.begin(); iter != combinations.end(); ++iter)
    		std::cout << *iter << "\n";
    }
    


  • Danke für die Antworten. Habe etwas Ordnung reingebracht. Ich probiere mal andere Kompilierer aus. Permutationen richtig, nur jeder Buchstabe soll neben dem "Nachbarn" stehen abc und nicht bac zum Beispiel. Danke nochmals. Ich brauche etwas Zeit um alles zu verstehen was gepostet wurde. 🙂



  • Außerdem kannst du noch die vectoren einfacher initialisieren:

    vector<string> v = {"a", "b", "c"};
        vector<string> m = {"ab", "ba", "bc", "cb"};
    

    Das spart dir diese vielen Variablen wie s,b,c,... und die vielen push_backs und ist außerdem wesentlich übersichtlicher. Wie man sieht, haben die vectoren die Längen 3 und 4, nicht 7 (nimm v.size() bzw. m.size() oder die begin/end-Paare)

    Ich möchte aus mehreren String-Vektoren alle Möglichkeiten in eine Liste speichern.

    Was sind denn "alle Möglichkeiten" genau? Das müsstest du genauer beschreiben. Was macht insbesondere der vector m? Soll der schon das Ergebnis sein? Was ist mit "ac" und "ca"?



  • Danke, funkt jetzt, jeweils die zweiten Parameter waren falsch. Habe entweder zu kleine oder zu große Werte genommen. Size () ist gut aber da bekomme ich warnings bezüglich unsigned integers. Mal gucken.



  • Wenn die Schleifenwerte eh Werte des vector sind, nimm statt int std::size_t, das gibt auch keine Warnungen mehr.



  • terminating with uncaught exception of type std::out_of_range: basic_string

    #include <string>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
    
        string s = "a";
        string b = "b";
        string c = "c";
        string ab = "ab";
        string ba = "ba";
        string bc = "bc";
        string cb = "cb";
        vector<string> v ;
        vector<string> m;
        v.push_back(s);
        v.push_back(b);
        v.push_back(c);
        m.push_back(ab);
        m.push_back(ba);
        m.push_back(bc);
        m.push_back(cb);
       string sv = "z";
        vector <string> vier, drei;
        string sp ;
        string sh;
        string sd, sr, so;
    
        for (int i=0;i<3;i++){
            sh = v[i];
    
            for (int j=0;j<4;j++){
    
            sv = m[j];
            sd = m [j];
    
            sv.erase(1,1);
            sd.erase (0,1);
    
            if (sh == sv && sh != sd)
             {
    
              sp = sh + sd;    
    
              drei.push_back(sp);
             }
    
    	   }
    	   }
    
    	       for (size_t i=0;i<=drei.size ();i++){
            sh = drei[i];
            sr = drei [i];
            so = drei [i];
            sr.erase (0,1);
            so.erase (1,1);
    
            for (size_t j=0;j<=m.size ();j++){
            sv = m[j];
            sd = m [j];
    
            sv.erase(1,1);
            sd.erase (0,1);
    
            if (sr == sv && so != sd)
             {
              cout << sd << endl;
              cout <<sh<< endl;
              sp = sh + sd;    
    
            vier.push_back(sp);
             }
    
                }
                }
             for (int l=0;l <4;l++){
                        cout <<drei [l] << endl;
              }
             for (int k=0;k <2;k++){
    
        cout << vier [k] << endl;
      }
        cout << endl;
    
    	}
    

    Wie löse ich das Problem in Zeile 75?



  • cAnfänger[12] schrieb:

    Wie löse ich das Problem in Zeile 75?

    Gar nicht, da es dort kein Problem gibt.

    Schau die lieber zunächst mal Zeilen 57 und 64 an (beide falsch).

    Und beachte die Hinweise weiter oben, d.h. 3 und 4 NICHT hardcoden. Außerdem benutzt du zwei verschiedene i-Variablen in verschachtelten Schleifen. Denkt man zumindest. Dann stellt man fest: deine Einrückung ist furchtbar. Die 2. Schleife mit i als Zähler ist nur falsch eingerückt! Rücke als allererstes ordentlich ein!!einself!!!



  • Danke werde alles berücksichtigen. Klappt jetzt. Habe die zweiten Parameter wieder selbst bestimmt. Muss lernen wie es mit size () geht oder den Iteraroren. Grüße

    Edit;

    Ich bin mitlerweile bei 7 stellen. Alles wunderbar nur bei acht Stellen macht es nur bis k z.B. .

    Gibt es Limitierungen in irgendeiner Form?

    170000 Werte sind noch nicht so viele oder?
    Ist es ok 350 Zeilen Code anzuhängen?



  • cAnfänger[12] schrieb:

    Muss lernen wie es mit size () geht oder den Iteraroren. Grüße

    Beispiele:

    // irgeneinen vector definieren
    std::vector<int> v = {1, 3, 6, 14};
    
    // Loop mit index:
    for (size_t i = 0; i < v.size(); ++i)
        std::cout << "Index " << i << " -> " << v[i] << '\n';
    
    // Loop mit begin/end:
    for (auto it = v.begin(); it != v.end(); ++i)
        std::cout << *it << '\n';
    
    // Loop ohne Index/Iterator (bevorzuge dies, wenn möglich):
    for (const auto &i : v)
        std::cout << i << '\n';
    

  • Mod

    cAnfänger[12] schrieb:

    Ich bin mitlerweile bei 7 stellen. Alles wunderbar nur bei acht Stellen macht es nur bis k z.B. .

    Gibt es Limitierungen in irgendeiner Form?

    170000 Werte sind noch nicht so viele oder?

    Es gibt Grenzen, aber die sind eher theoretischer Art. 170000 ist lächerlich wenig für einen handelsüblichen Computer. Viel wahrscheinlicher ist, dass in deinem Programm weitere Fehler sind. Dein Beispielcode war schließlich bereits voller Fehler, und aus deinen Bemerkungen schließe ich, dass du einen ganz anderen Code vorliegen hast als den, den du uns gezeigt hast. Dieser andere Code wird fast mit Sicherheit noch mehr Fehler enthalten.

    Ist es ok 350 Zeilen Code anzuhängen?

    Nein. Wie man Probleme nachstellbar und nachvollziehbar macht



  • Gut dann muss ein Fehler im Code sein.
    Es ist der gleiche Code nur mit mehr Buchstaben/ Stellen.

    http://ideone.com/dMWC6f

    Hier auf ideone danke für eure Zeit.



  • Hier mal ein paar Punkte. Aufgrund der Formatierung habe ich das alles aber nicht auf Funktionalität überprüft.

    Punkt 1: Formatierung grauenhaft. Saubere und einheitlich einrücken und Klammern setzen!

    Punkt 2: Hardgecodete Integer sind nicht schön.

    Punkt 3: Bennene deine Variablen vernünftig.

    Punkt 4: Bleib bei einer Sprache für deine Bennenung (drei vs. three). Am besten erfolgen Benennungen auf englisch.

    Punkt 5: Strukturiere deinen Code und schreibe Funktionen.

    Punkt 6: Irgendwie erschließen sich mir die ganzen erases nicht. Du löschst irgendwelche Zeichen aus den Strings, machst aber hinterher höchstens mit einem Teil davon noch irgendwelche Vergleiche.

    Punkt 7: Was erwartest du, was die Ausgabe von: std::cout << neun[177240] sein sollte.



  • cAnfänger[12] schrieb:

    Habe die zweiten Parameter wieder selbst bestimmt. Muss lernen wie es mit size () geht oder den Iteraroren.

    Ernsthaft?



  • Endlich fertig, vielen dank für die tollen Tipps. Jetzt noch alle Permutationen mit dem Code aus Beitrag 3 abspeichern. 😉 Grüße

    http://ideone.com/vYnHId


  • Mod

    sh = neun[i];
               sr = neun[i];
              so = neun[i];
              s3 = neun[i];
              s4 = neun[i];
             s5 = neun[i];
              s6 = neun[i];
              s7 = neun[i];
              s8 = neun[i];
              sr.erase (0,7);
             so.erase (1,7);
             s3.erase (0,1);
             s3.erase (1,6);
             s4.erase (0,2);
              s4.erase (1,5);
              s5.erase (0,3);
              s5.erase (1,4);
               s6.erase (0,4);
             s6.erase (1,3);
             s7.erase (0,5);
             s7.erase (1,2);
             s8.erase (0,6);
            s8.erase (1,1);
    

    *Schauder*
    So eine Einrückung ist doch wohl nicht dein Ernst. Wie schafft man das?

    (Vom Inhalt des Codes reden wir lieber gar nicht)



  • Variablen mit den Namen "eins" bis "neun" sind ein eindeutiges Zeichen, dass hier irgendwas gehörig flasch läuft. Ich habe ne Aufgabe, die dir das Problem nur allzu deutlich aufzeigt: erweitere das Programm so, dass der Benutzer die Länge eingeben kann (auch 100 oder 76 sollen mögliche Eingaben sein).


Anmelden zum Antworten