PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : popelprogramm :)


Flak
2005-07-02, 20:00:40
hallo,

ich will ein programm in vba schreiben, wo ich in ner textbox ein wort oder mehrere buchstaben eintippe und das programm gibt mir ne liste, oder jeweils bei einem klick eine möglichkeit von andren wörtern aus diesen buchstaben.

hab sowas zwar schonmal gemacht, is aber lang her :(
wäre nett wenn mir wer helfen könnte :)

mfg Flak

DocEW
2005-07-04, 09:43:40
Also ich habe sowas zwar noch nie gemacht, aber wenn du "echte" Wörter haben willst, brauchst du wohl so eine Art Wörterbuch. Wenn du nur die Buchstaben verwürfeln willst, musst du ja nur eine zufällige Permutation generieren.
Vielleicht sagst du erstmal, was von beidem du machen willst.

Senior Sanchez
2005-07-04, 11:10:53
Ich glaube er will so ein programm, um bei 9 live zu gewinnen.

noid
2005-07-04, 11:27:36
Ich glaube er will so ein programm, um bei 9 live zu gewinnen.

sicherlich ist er dimmy aus mannheim - der innenstich X-D

das wird stellenweise aber ne recht lange liste.

icemanemp
2005-07-04, 13:26:17
Kannst ja noch nebenbei ein Algorithmus entwerfen, der sinnlose und sinnvolle Wörter trennt ;)

Dann gleich mal hier auf den Thread anwenden und mein Post ist weg!

Was sollen wir dir jetzt noch dabei helfen? Du hast den eingegeben Text beim Button-Click Ereigniss im zugriff und machst dir deine Wörterliste drauss...
Ist doch ein Anfängerprojekt... wenn du das net hinbekommst, dann liegt es eher daran, das deine VB-Kenntnisse vielleicht nicht mehr vollständig sind. Da du ja auch schreibst, das du so was schon gemacht hast, aber es lange her ist...

Oder bin ich zu streng?

DocEW
2005-07-04, 17:12:14
Für 9live gibt es doch den "TV quiz solution finder (http://134.169.29.162/Realms/)". ;)

Icqmanemp, streng war das schon. Finde ich nicht schlimm, wenn man hier fragt, wie man ein bestimmtes Problem am besten löst. Ist ja auch nicht ganz trivial, im Falle der Lexikonversion (zumindest, wenn du nicht einfach trotzdem alle Möglichkeiten durchprobierst und nur nachguckst, ob sie im Lexikon stehen).

Flak
2005-07-05, 13:24:20
ja meine kenntnise von vb sind nicht mehr ganz vollständig, damit habt ihr vollkommen recht. is auch nicht zu streng, ich ärger mich selbst das ich mich nicht weiterbilde (ich fauler hund).
die idee mit der prüfung is gut könnte man auch einbauen. aber der anfang wäre für mich eben das durcheinanderwürfeln.
1. wie bekomm ich aus dem string der textbox die einzelnen buchstaben raus?
2. wie sieht die funktion aus die alles zufällig anordnet.

das mit 9 live stimmt fast. ich will net gewinnen aber dadurch bin ich auf die idee gekommen ;)

n paar tipps wären nett, aber wenn ihr nicht wollt is auch gut :rolleyes:

icemanemp
2005-07-05, 13:46:55
Kann leider kein VB, aber Delphi...

Auf einen Zeichen von einem String solltest du doch normalerweise mit dem Index des zeichens zugreifen können oder? Also mit Variable := String[3]

Die Routine muss jedes Zeichen mit dem nächsten Tauschen bis es wieder an der Startposition angekommen ist. Dann kommt das nächste Zeichen dran bis zu seiner Startposition usw.

Hoffe geholfen zu haben, auch wenn Delphi anders als VB ist... wenigstens zur allgemeine Denkweise

DocEW
2005-07-05, 17:06:54
Die Routine muss jedes Zeichen mit dem nächsten Tauschen bis es wieder an der Startposition angekommen ist. Dann kommt das nächste Zeichen dran bis zu seiner Startposition usw.
So klappt das aber nicht (wenn ich es richtig verstanden habe). Auf diese Weise bekommst du z.B. bei einem Alphabet von {A,B,C} nur

AAA
BAA
CAA

ABA
ACA

AAB
AAC

und es fehlen z.B. BAC oder CBA. Außerdem hast du dann Buchstaben doppelt, aber er will ja aus genau den Buchstaben aus dem Ursprungswort alle Möglichkeiten generieren. Das heißt er hat z.B. "ACB" gegeben und will

ABC
ACB
BAC
BCA
CAB
CBA

bekommen. Aber vielleicht ist das ja auch, was du meintest, icemanemp.

massa
2005-07-05, 17:09:57
Leider ist mir keine Möglichkeit bekannt auf die einzelnen Buchstaben eines Strings wie in einem char-Array (z.B. in C) zuzugreifen. Deshalb mal kurz eine Lösung wie ichs mit VB machen würde:

Private Sub Command1_Click()
Dim buchstaben() As String 'Dynamisches Array für die Buchstaben
Dim text As String 'Variable für den eingegebenen Text
Dim i As Integer 'Zählvariable
text = Form1.Text1.text
ReDim buchstaben(1 To Len(text)) 'Arraygröße anpassen
For i = 1 To Len(text) 'Schleife für die Länge des Textes laufen lassen
buchstaben(i) = Mid(text, i, 1) 'Hier wird der Text ab position i für 1 Zeichenlänge
'ausgeschnitten und an die entsprechnende Stelle im Array eingefügt
Next
End Sub


Nun hast die alle Buchstaben deiner Textbox in einem Array was ich hier der einfacheren Handhabung halber bei einem Index von 1 starten lasse.

Um nun alle möglichen Kombinationen der Buchstaben herauszubekommen brauchst du eine mathemathische Formel. Ich weiß spontan zwar nicht wie diese aussieht sollte aber nicht sonderlich schwer sein es herauszufinden. Nunja wenn du dann alle Kombinationsmöglichkeiten hast dann kannst du ja anfangen dir alle möglichen neuen Wörter zusammenzubauen.

Per Randomize Funktion wird das ganze IMHO nichts, da du ja dann nur irgendwelche zufällig zusammegestellten (und sich evtl. wiederholenden) Wörter erhälst.

Flak
2005-07-05, 22:47:53
ha, ich habs ;D

ihr habt mich auf die richtige spur gebracht. am hilfreisten war massa ;)

Private Sub CommandButton1_Click()

Dim sVorgabe As String
Dim sAusgabe As String

Randomize
sVorgabe = TextBox1.Text
Debug.Print "Original: " & sVorgabe
Dim n As Integer
Dim nAnzahl As Integer
Dim nZaehler As Integer

nAnzahl = Len(sVorgabe)

For nZaehler = 1 To nAnzahl
n = Rnd(1) * (Len(sVorgabe) - 1) + 1
sAusgabe = sAusgabe & Mid(sVorgabe, n, 1)
sVorgabe = Left(sVorgabe, n - 1) & Mid(sVorgabe, n + 1)

Next
Debug.Print "Gemischt: " & sAusgabe
Label1.Caption = sAusgabe


End Sub

was sagt ihr dazu? jedenfalls klappts ;)
@massa bei dir können die buchstaben ja doppelt vorkommen da du "text" so lässt wie er ist, oder? :)

jetzt muss ich noch die möglichkeit ausschliessen das 2 mal die gleiche kombination hintereinander kommt. das einzigste was mir einfällt wäre alle bisherigen ergebnisse irgendwo zu speichern und diese jedesmal neu abzufragen.
oder gibts noch ne andere möglichkeit?

massa
2005-07-06, 10:45:03
sieht interessant aus ;)

bei mir können keine doppelten Buchstaben vorkommen, weil ich lediglich den Orginaltext in die einzelnen Buchstaben zerlege und diese dann der Reihe nach in ein Array packe. Mit dem Problem der Buchstabenmischung hab ich mich da nicht beschäftigt.

Zu deiner Lösung:
Klasse Ansatz nur scheint es mir so, als bekommst du für z.B. ein Wort mit 3 Buchstaben nur 3 Kombinationen möglich wären hier aber 6. (Siehe Beispiel von DocEW). Du müsstest also Die Schleife nicht von 1 bis len(Text) durchlaufenlassen, sondern von 1 bis (Anzahl möglicher Kombinationen).
Außerdem musst du wie du schon festgestellt hast bereits erstellte Lösungen speichern um Wiederholungen auszuschließen. Das Problem sieht auf den ersten Blick trivial aus, hats aber ganz schön insich :)

icemanemp
2005-07-06, 11:39:45
So klappt das aber nicht (wenn ich es richtig verstanden habe). Auf diese Weise bekommst du z.B. bei einem Alphabet von {A,B,C}

@DocEW
Hast es falsch verstanden.
So wie dein 2. Beispiel sollte meine Erklärung sein! z.B. wird der erste Buchstabe solange mit seinem rechten Nachbarn getauscht bis er wieder an der Anfangsposition ist! Dann der 2. Buchstabe nach Rechts so lange getauscht bis er an seiner Startposition ist usw. Tauschen heisst auch über die Arraygrenze hinweg zum ersten Element. Durch reines tauschen, so wie ich es schon das erst mal gesagt habe, können ja nur die Buchstaben in genau der gleiche Anzahl wie im Originaltext enthalten sein!

Ist ja auch wurscht ;) Er hat es ja hinbekommen!

DocEW
2005-07-06, 14:15:12
icemanemp,
leider klappt das auch so wie du es beschreibst nicht. Der Ansatz mit dem Vertauschen kann schon an sich nicht klappen, das kann man sich wie folgt überlegen:
Sei n:=(Länge des Wortes). Du vertauscht jeden Buchstaben des Wortes n mal. Für jeden Buchstaben bekommst du also n verschiedene Wörter, insgesamt für alle n Buchstaben kannst du dann maximal (wenn nicht doppelt auftaucht) n² verschiedene Wörter bekommen.
Die Menge aller möglichen Permutationen der n Buchstaben ist aber n! (Fakultät) groß. Daher kannst du nicht alle generiert haben. Wenn man die doppelt generierten mitrechnet, sieht es noch schlechter aus, z.B. werden für "ABCD" nur 8 verschiedene Wörter generiert und es gibt 1*2*3*4 = 24.

Beispiele für die tatsächliche Implementation findet man über google, z.B. hier
http://www.tutorials.de/showthread.php?threadid=75639&highlight=permutation

(aber vorsicht, steht auch viel Mist da... ;))

MaRs
2005-07-06, 17:24:09
Um bei 9live zu gewinnen gibt es sowas webbasiert bei irgendeiner uni aus den neuen Bundesländern, hab leider den Link verlegt. Dort werden auch nur die Wörter ausgegeben, die es tatsächlich gibt.

Flak
2005-07-06, 18:57:16
also müsste ich anstatt
For nZaehler = 1 To nAnzahl
For nZaehler = 1 To FakultaetvonnAnzahl

hm mach ich mal, aber net heute (kopfweh :()