 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 06.02.2014, 13:15 Titel: Kombination von allem mit allem |
|
|
Hola.
ich habe gerade wieder angefangen zu programmieren und stoße leider schon recht schnell an meine Grenzen
Folgende Aufgabe:
Ich frage ein paar Dinge ab und möchte nun eine Datei erstellen in dem jegliche Kombination der Eingaben gespeichert wird.
Also z.B.
Abfrage 1: Schaufel
Abfrage 2: Hammer
Abfrage 3: Stiefel
usw.
In der Datei sollte nun die Kombination alles mit allem stehen, also
Schaufel, Hammer, Stiefel, Schaufelhammer, Schaufelstiefel, Hammerschaufel, Hammerstiefel, Stiefelschaufel, Stiefelhammer.
Also die Abfragen usw. sind nicht das Problem, aber wie bekomme ich es hin, dass diese Kombinationen entstehen ??
Danke im Voraus
Oli |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 06.02.2014, 13:32 Titel: |
|
|
Du könntest sowas in der Art machen:
Code: | Neu = n+1
For i=1 to n
For k=1 to n
if i<>k then
Dat(Neu)=Dat(i) & Dat(k)
Neu = Neu + 1
end if
next k
next i |
Das Feld Dat() enthält deine abgefragten Begriffe, n ist die Anzahl der Begriffe. Anschlie0end werden deine neuen Kombinationen in Dat() gespeichert (oder du schreibst in dieser Zeile direkt in die Datei).
Dat() muss natürlich ausreichend groß dimensioniert werden.
Grüße
Rainer |
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 06.02.2014, 17:51 Titel: |
|
|
Hallo Rainer.
Danke für deine Antwort.
Funktioniert soweit, aber was müsste ich tun, damit es auch die Kombination SchaufelHammerStiefel usw. gibt.
Bis jetzt bekommt ja jedes Wort nur einen Zusatz, aber sollen ja wenn möglich alle Kombinationsarten erstellt werden.
Gruessle
Oli |
|
Nach oben |
|
 |
TimesChange
Anmeldungsdatum: 20.11.2013 Beiträge: 85
|
Verfasst am: 06.02.2014, 19:16 Titel: |
|
|
Davon hast du oben aber nichts geschrieben
Du könntest eine weitere Schleife (for L = 1 to n...) einfügen, für dein Beispiel (3 Begriffe) würde das reichen.
Das ist aber nicht sinnvoll, wenn du viele Begriffe hast, und alle denkbaren Doppel- und Mehrfachkombinationen erzeugen willst.
Dann bräuchte man wohl eher eine rekursiv aufgerufene Prozedur, oder so
Das können aber andere besser, ich kann nur Pimperles-Programme...
Grüße
Rainer |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 06.02.2014, 19:50 Titel: |
|
|
Code: | dim td() as string 'elementespeicher
dim tc as integer 'anzahl elemente
dim t as string 'eingabevariable
dim tx as UInteger 'zählervariable
'!ACHTUNG! bereits 8 eingaben erzeugen 16 millionen kombinationen!!!
Print "Bitte geben sie daten ein! (fertig mit leerer zeile)"
do
Input t
if t = "" then exit do
tc += 1
redim preserve td(tc) as string
td(tc) = t
Print Str(tc) & " Elemente im speicher! Das ergibt " & str(tc ^ tc) & " kombinationen!"
tx += 1
loop
If tc = 0 Then print "keine eingabe! bye!": End -1 'wenn nix drin, auch keien kombi!
dim tmax as UInteger = tc ^ tc 'maximale anzahl an kombinationen
dim trest as UInteger 'rest-variable für berechnung
dim tval as UInteger 'aktueller wert-variable für berechnung
Dim ttot as double 'timeout für sleep udn cpu schonung
Do
trest = tx
t = ""
Do 'das folgende prinzip bassiert auf dem binärem rechnen, nut wird hier stat 0 und 1 alle varianten bis tc verwendet.
if ttot < timer() Then 'dient dem schutz vor extremer cpu auslastung bei zu vieler kombinationen
Sleep 1, 1
ttot = timer() + 1
End If
tval = trest mod tc
trest = fix(trest / tc)
t += td(tc - tval) '"bit" bzw "tc wert" der position aus dem array holen und an string anhängen
If trest = 0 then exit Do 'wenn nix mehr vorhanden, schleife verlassen.
Loop
Print t 'kombination ausgeben
tx += 1 'nächste kombi
If tx >= tmax then exit Do 'wenn max erreicht, exit (sonst krachts)
Loop
Print "gesammt:" & tx
end 0
|
EDIT:
Als kurze erklärung zum hintergrund des verfahrens.
Man nehme das Binärprinzip zur hand:
0, 1, 10, 11, 100, 101, 110, 111, 1000, ... usw.
Beim binärem gibt es nur 0 und 1 ... wir ändern das jetzt einfach und führen werte von 0 bis <anzahl elemente> ein.
angenommen, wir haben 3 elemente:
0, 1, 2, 10, 11, 12, 20, 21, 22, 100, 101, 102, 110, 111, 112, 120, ... usw.
jeder wert wird als indexnummer des array verwendet .. damit das ganze klapt wird eine variable erzeugt, die einfach +1 rechnet .. das läuft quasi die gesammten kombinationen ab welche maximal <anzahl> hoch <anzahl> sind ...
um den ersten wert in unserem zähler zu erhalten rechnen wir den "rest" heraus, mit mod
wert = zählerkopie mod anzahl
anschliessend wird der zähler (welcher in eine temp variable kopiert wurde) um eine entsprechende stelle reduziert:
zählerkopie = fix(zählerkopie / anzahl)
das wird solange widerholt, bis der wert 0 erreicht hat (zählerkopie = 0)
jeder wert entspricht damit einem wert zwischen 0 und anzahl -1 ... da das array mit 1 beginnt entsprechend den wert + 1 rechnen.
das ganze dann noch aus dem array in einem temp-string zusammenkombinieren, und ausgeben.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 09.02.2014, 17:51 Titel: |
|
|
Hallo TPM.
Sorry für die späte Rückmeldung und danke für deine Antwort.
1. Es funktioniert
2. Ich verstehe es nicht wirklich
3. Du hast recht, die das Ganze wir ziemlich groß, darum mein Frage.
Gäbe es die Möglichkeit die Länge zu begrenzen, also, obwohl ich 20 Werte habe und alle mit allen kombinieren möchte, sollen max. 3 drei Werte gemeinsam ausgegeben werden.
Gruessle
Oli |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 09.02.2014, 18:43 Titel: |
|
|
Vielleicht solltest Du den Permutationengenerator (so etwas willst Du ja übrigens!) etwas präziser definieren, denn ich bin mir nicht sicher, ob Du
Code: | Schaufelschaufelschaufel
Hammerhammerhammer
Stiefelstiefelstiefel |
auch haben willst.
Wenn jedes Wort immer nur maximal 1x vorkommen darf und "Schaufelhammer" und "Hammerschaufel" gleichwertig sind, reduzieren sich die Möglichkeiten bereits beträchtlich: Dann hast Du es mit einer Art Set-Datentyp zu tun, d.h. jedes Wort erscheint oder erscheint nicht.
Zur Illustration
Code: | xx1 = Schaufel
x1x = Hammer
1xx = Stiefel
1 001 = Schaufel
2 010 = Hammer
3 011 = Schaufelhammer
4 100 = Stiefel
5 101 = Schaufelstiefel
6 110 = Hammerstiefel
7 111 = Schaufelhammerstiefel |
d.h. bei n Begriffe also immer 2^n-1 Kombinationen.
Am besten also mit dem 3-Wort-Beispiel einmal vollständig von Hand alle gewünschten Kombinationen bilden, danach kann das Bildungsmuster herausgelesen werden. Gleichzeitig stellt diese von Hand erstellte Tabelle den Testfall für den Permutationengenerator dar.
Übrigens der Mastermindknacker aus meiner Sammlung verwendet auch so einen Permutationengenerator. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.02.2014, 15:18 Titel: |
|
|
momohk hat Folgendes geschrieben: | Gäbe es die Möglichkeit die Länge zu begrenzen, also, obwohl ich 20 Werte habe und alle mit allen kombinieren möchte, sollen max. 3 drei Werte gemeinsam ausgegeben werden. |
Inzwischen selber den FbEdit angeworfen und ein kleines Beispiel zusammengestellt:
http://beilagen.dreael.ch/QB/PermuationsGenerator.bas
Genaue Definition der Permutationen im Beispiel:
- jeder Begriff nur maximal 1x vorkommend
- Reihenfolge irrelevant, d.h. HammerSchaufel und SchaufelHammer sind gleichwertig => nur eines davon wird benötigt
- dafür auch weniger als die maximalen k Begriffe (im Minimum 1 Begriff)
Rechnerisch entstehen so bei max. k Begriffe aus n:
totalKombinationen = Summe(i=1..k, n!/(i!*(n-i)!))
z.B. wie im Beispiel n=9, k=3:
Code: | 9*8*7 9*8 9
----- + --- + - = 84 + 36 + 9 = 129
3*2*1 2*1 1 |
In Deinem Fall mit n=20, k=3:
Code: | 20*19*18 20*19 20
-------- + ----- + -- = 1140 + 190 + 20 = 1350
3* 2* 1 2* 1 1 |
Von der Programmierung her ist für so etwas Rekursion nötig. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
momohk
Anmeldungsdatum: 21.01.2014 Beiträge: 9 Wohnort: Deutschland
|
Verfasst am: 14.02.2014, 10:11 Titel: |
|
|
Hallo Dreael, Hallo PuppetMaster,
Vielen Dank für eure Mühen. Ich muss jetzt erst mal versuchen das alles zu verstehen, denn ich möchte ja nicht einfach kopieren.
@Dreael, Hammerstiefel und Stiefelhammer wären in meiner Anwendung nicht gleichwertig, müssten also beide vor kommen, HammerHammer Hammer, jedoch nicht.
Gruessle
Oli |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|