Mehrere Strings zusammensetzen
-
hallo,
also man hat
String 1
String 2
String 3
String 4
String 5
String 6
String 7
String 8
String 9gibt 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 mehrdanke 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 auswenns 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 eingibtmfg 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 hilfemfg 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
akarieigentlich 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
akaries 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 gemachtstrings.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 Oomfg Nööb