Mehrere Strings zusammensetzen



  • hallo,
    also man hat
    String 1
    String 2
    String 3
    String 4
    String 5
    String 6
    String 7
    String 8
    String 9

    gibt es eine methode um alle möglichen zusammensetzungen auszuprobieren und in eine TStringList zu speichern? (also 1+2+3+4+5+6+7+8+9 und andere zusammensetzungen)
    ich hoffe das gibt es denn es würde sehr lange dauern alle möglichkeiten manuell einzugeben vorallem wenn es um die 20 strings werden oder mehr 😃

    danke schon mal



  • Hallo

    ja, das prinzip nennt sich Permutation.
    Das kannst du entweder mit Schleifen nachbauen oder du packst die Einzel-Strings in einen std::vector/std::list und läßt std::next_permutation drüber laufen, bis du alle Möglichkeiten in eine StringList eingetragen hast.

    bios bald
    akari



  • uff ^^ erst mal danke für die antwort aus der ich leider nicht ganz schlau werde ^^
    ich kenne mich nicht mit sowas aus

    wenns net zuviel verlangt ist könntest du mir ein beispiel schreiben? ^^

    mfg da nööb



  • Hallo

    #include <vector>
    #include <algorithm>
    ...
      std::vector<AnsiString> strings; // dynamisches Arra für die Strings
      for (int lv = 1; lv < 7; ++lv) strings.push_back(IntToStr(lv)); // Array füllen
    
      bool permut = true; // Ob es eine weitere Kombination gibt
      int count = 1; // Anzahl der Kombinationen
      AnsiString Buffer; // Zwischenspeicher für Ausgabe
    
      // Schleife zum Abarbeiten jeder einzeln möglicher Kombination
      while(permut)
      {
    
        // Ausgabe der aktuellen Kombination
        Buffer = "(" + IntToStr(count) + ") ";
        for (std::size_t lv = 0; lv < strings.size(); ++lv)
          Buffer += " " + strings[lv];
        ListBox1->Items->Add(Buffer);
    
        // Nächste Kombination bestimmen, wenn möglich
        permut = std::next_permutation(strings.begin(), strings.end());
        ++count;
      }
    

    natürlich kannst du das was next_permutation auchselber schreiben...

    bis bald
    akari



  • danke erst mal
    aber wo kommen da die 9 Strings vor?
    falls es jetzt ne blöde frage ist: Bin' Nööb ^^



  • Hallo

    for (int lv = 1; lv < 7; ++lv) strings.push_back(IntToStr(lv)); // Array füllen
    

    Ich habe nur 7 genommen, und dann auch nur als einfache Zahlen von 1 bis 7.
    Ist aber egal, was du in den vector füllst. Es wird lexigrafisch sortiert.
    Must nur aufpassen... so ab 10 Elementen dauert das ganze schon sehr lange...

    bis bald
    akari



  • Hallo

    nein, ab 10 Ausgangs-elementen bricht die ListBox zusammen.
    machs lieber so :

    std::vector<AnsiString> strings; // dynamisches Arra für die Strings
      for (int lv = 1; lv < 10; ++lv) strings.push_back(IntToStr(lv)); // Array füllen
    
      bool permut = true; // Ob es eine weitere Kombination gibt
      int count = 1; // Anzahl der Kombinationen
      AnsiString Buffer; // Zwischenspeicher für Ausgabe
      TStringList* list = new TStringList; // Liste, die im Hintergrund alle Kombinationen aufnimmt
    
      // Schleife zum Abarbeiten jeder einzeln möglicher Kombination
      while(permut)
      {
    
        // Ausgabe der aktuellen Kombination
        Buffer = "(" + IntToStr(count) + ") ";
        for (std::size_t lv = 0; lv < strings.size(); ++lv)
          Buffer += " " + strings[lv];
        list->Add(Buffer);
    
        // Nächste Kombination bestimmen, wenn möglich
        permut = std::next_permutation(strings.begin(), strings.end());
        Label1->Caption = IntToStr(count);
        ++count;
      }
      list->SaveToFile("Permut.txt");
      delete list;
    

    bis bald
    akari



  • cool danke so meinte ich das
    wo genau nimmt das programm die zahlen her? Es sollen nämlich eigentlich Strings sein die man in Edit-Felder eingibt

    mfg nööb



  • akari schrieb:

    std::vector<AnsiString> strings; // dynamisches Arra für die Strings
      for (int lv = 1; lv < 10; ++lv) strings.push_back(IntToStr(lv)); // Array füllen
    

    Genau daher - anstelle dieser beiden Zeilen kannst du auch die Werte von woanders holen.
    (allerdings solltest du darauf achten, daß dein vector<> am Beginn der while()-Schleife sortiert ist, sonst verpasst du die Hälfte der möglichen Ausgabe)



  • Hallo

    habe ich doch schon hier geschrieben

    akari schrieb:

    for (int lv = 1; lv < 7; ++lv) strings.push_back(IntToStr(lv)); // Array füllen
    

    Du kanst dem vector auf die Eingabe-Werte aus Edit-Feldern anfügen

    strings.push_back(Edit1->Text); // Fügt den Text aus Edit1 als letztes Element in den vector ein
    

    bis bald
    akari



  • ich hab jetzt

    for (int lv = 1; lv < 7; ++lv) strings.push_back(Edit1->Text);
    

    dann wird allerdings nur Edit1 verwendet also hab ich es so versucht:

    for (int lv = 1; lv < 7; ++lv) strings.push_back(Edit1->Text);
    for (int lv = 1; lv < 7; ++lv) strings.push_back(Edit2->Text);
    

    aber dann funktioniert es auch nicht richtig
    bitte um hilfe 😞

    mfg Nööb



  • Hallo

    du weißt aber schon, was eine For-Schleife ist und das die für eine Auswirkung hat?

    bis bal
    akari



  • akari schrieb:

    Hallo

    du weißt aber schon, was eine For-Schleife ist und das die für eine Auswirkung hat?

    bis bal
    akari

    eigentlich schon O.o aber ich blicke im moment nicht ganz durch



  • Hallo

    ich habe geschrieben

    strings.push_back(Edit1->Text); // Fügt den Text aus Edit1 als letztes Element in den vector ein
    

    Das fügt also einmal den Text an das Array an.

    Du schreibst

    for (int lv = 1; lv < 7; ++lv) strings.push_back(Edit1->Text);
    

    Das fügst sechsmal den jeweils gleichen Text an das Array an.

    bis bald
    akari



  • ähm....^^
    wie is das gemeint?^^ :schäm:



  • Hallo

    überleg dir doch bitte erstmal, was du überhaupt machen willst... mach einen Programm-Ablaufplan oder so. Oder fang erstmal mit den Grundlagen von C++ an.

    bis bald
    akari



  • Hallo,
    Sei mir nicht böse, aber ich glaube nicht, dass du weißt was eine For-Schleife machst. Arbeite besser mal ein grundlegendes Tutorial durch und schau dir dann akari's Beiträge nochmal an.

    mfg cb

    /EDIT zu spät!



  • akari schrieb:

    Hallo

    überleg dir doch bitte erstmal, was du überhaupt machen willst... mach einen Programm-Ablaufplan oder so. Oder fang erstmal mit den Grundlagen von C++ an.

    bis bald
    akari

    es gibt 9 edit eingabefenster wo man die 9 zeichen eingeben sollen von denen alle möglichkeiten abgespeichert werden sollen

    carstenbauer schrieb:

    Hallo,
    Sei mir nicht böse, aber ich glaube nicht, dass du weißt was eine For-Schleife machst. Arbeite besser mal ein grundlegendes Tutorial durch und schau dir dann akari's Beiträge nochmal an.

    mfg cb

    /EDIT zu spät!

    Eine For-schleife wiederholt solange einen Vorgang bis eine Bedingung erfüllt ist in diesem fall bis die variable lv 7 erreicht hat....soweit ich weiß



  • Hallo

    da du ja doch nicht auf unsere Ratschläge hören willst...

    std::vector<AnsiString> strings; // dynamisches Arra für die Strings
      strings.push_back(Edit1->Text); 
      strings.push_back(Edit2->Text); 
      strings.push_back(Edit3->Text); 
      strings.push_back(Edit4->Text); 
      strings.push_back(Edit5->Text); 
      strings.push_back(Edit6->Text); 
      strings.push_back(Edit7->Text); 
      strings.push_back(Edit8->Text); 
      strings.push_back(Edit9->Text); 
    
      bool permut = true; // Ob es eine weitere Kombination gibt
      int count = 1; // Anzahl der Kombinationen
      AnsiString Buffer; // Zwischenspeicher für Ausgabe
      TStringList* list = new TStringList; // Liste, die im Hintergrund alle Kombinationen aufnimmt
    
      // Schleife zum Abarbeiten jeder einzeln möglicher Kombination
      while(permut)
      {
    
        // Ausgabe der aktuellen Kombination
        Buffer = "(" + IntToStr(count) + ") ";
        for (std::size_t lv = 0; lv < strings.size(); ++lv)
          Buffer += " " + strings[lv];
        list->Add(Buffer);
    
        // Nächste Kombination bestimmen, wenn möglich
        permut = std::next_permutation(strings.begin(), strings.end());
        Label1->Caption = IntToStr(count);
        ++count;
      }
      list->SaveToFile("Permut.txt");
      delete list;
    

    bis bald
    akari



  • Danke aber da stimmt etwas nicht.
    Zum test hab ich mal folgendes gemacht

    strings.push_back(Edit1->Text); 
      strings.push_back(Edit2->Text); 
      strings.push_back(Edit3->Text); 
      strings.push_back(Edit4->Text);
      strings.push_back(Edit5->Text);
      //strings.push_back(Edit6->Text);
      //strings.push_back(Edit7->Text);
      //strings.push_back(Edit8->Text);
      //strings.push_back(Edit9->Text);
    

    dann das programm gestartet und in den 5 edits a, b, c, d und e eingegeben.
    das bringt 24 möglichkeiten (?)
    allerdings wenn ich eingebe (in der reihenfolge) e,a,b,c,d
    dann gibt es nur 6 ergebnisse die dann alle mit e beginnen Oo

    mfg Nööb


Anmelden zum Antworten