Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kombination von allem mit allem

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 06.02.2014, 13:15    Titel: Kombination von allem mit allem Antworten mit Zitat

Hola.

ich habe gerade wieder angefangen zu programmieren und stoße leider schon recht schnell an meine Grenzen traurig

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
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 06.02.2014, 13:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 06.02.2014, 17:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
TimesChange



Anmeldungsdatum: 20.11.2013
Beiträge: 85

BeitragVerfasst am: 06.02.2014, 19:16    Titel: Antworten mit Zitat

Davon hast du oben aber nichts geschrieben zwinkern

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 lächeln
Das können aber andere besser, ich kann nur Pimperles-Programme...

Grüße
Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 06.02.2014, 19:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 09.02.2014, 17:51    Titel: Antworten mit Zitat

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 zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 09.02.2014, 18:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 09.02.2014, 19:08    Titel: Antworten mit Zitat

@momohk ... schau dir mal dies hier an .. vieleicht hilft das etwas, um das rechenprinzip von binär und deinem zu verstehen ... http://forum.qbasic.at/viewtopic.php?t=5074


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 10.02.2014, 15:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
momohk



Anmeldungsdatum: 21.01.2014
Beiträge: 9
Wohnort: Deutschland

BeitragVerfasst am: 14.02.2014, 10:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz