Mehrere Strings zusammensetzen



  • 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



  • Hallo

    das ist nicht verwunderlich und ist von CStoll auch schon angemerkt worden

    CStoll schrieb:

    (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)

    Du must vor der Permutation darauf achten, das die Elemente aufsteigend sortiert sind, um wirklich alle Permutationsmöglichkeiten zu bekommen.
    Dazu verwendest du einfach std::sort

    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);
    
      std::sort(strings.begin(), strings.end()); // Sortieren
    
      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



  • Nur so aus Interesse: Wenn ich 5 Objekte A,B,C,D,E habe, dann gibt es doch 5! Möglichkeiten, oder lieg ich da falsch? (5!=5*4*3*2*1=120)

    mfg cb



  • Hallo

    ja wenn du 5 verschiedene Elemente hats, kommen in der Tat durch den von mir verwendeten Algo dann 120 Kombinationen heraus.

    bis bald
    akari



  • @akari: danke funzt super 😃 krieg ich noch irgendwie die zähling weg? also ich meine das vor jeder möglichkeit steht wievielte das ist?

    (1) abcde
    (2) abced
    (3...und so weiter

    @carstenbauer: ich meine mit möglichkeiten die 120; alle möglichen zusammensetzungen



  • Hallo

    klar bekommst du das weg. Schau dir doch an, wo das in meinem Quellcode eingebaut wird... Tip: Zähler heißt auf englich count.

    bis bald
    akari



  • akari schrieb:

    Hallo

    klar bekommst du das weg. Schau dir doch an, wo das in meinem Quellcode eingebaut wird... Tip: Zähler heißt auf englich count.

    bis bald
    akari

    Yo ist mir schon klar das es das count ist aber ich kriegs net so hin das es es immer noch im Label1 anzeigt aber nicht in der StringList
    Meiner Ergebnisse waren bisher das entweder nur ein Buchstabe in jeder Möglichkeit sthet oder gar nichts.

    So hab ich es im moment:

    Label2->Caption="1";
    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);
    
      std::sort(strings.begin(), strings.end()); // Sortieren
    
      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)&&(Label2->Caption=="1"))
      {
        Application->ProcessMessages();
        // 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;
        ListBox1->Items = list;
      } 
      list->SaveToFile("Permut.txt"); 
      delete list;
    

Anmelden zum Antworten