![]() |
Nummer zu String, die zweite
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute!
flomei und allen Freunden der Suchfunktion zuliebe habe ich das hier in einen neuen Thread gepackt. Für alle die den alten Thread nicht gelesen haben, es geht um folgendes: Ich bin grade dabei ein Programm zu schreiben, welches eine Nummer (z.B. 6542317) in die daraus möglichen Buchstabenkombinationen umwandelt (also 2=ABC, 3=DEF wie beim SMS schreiben). Es geht jetzt mit 3 Zahlen, da macht er alles wie er soll. Aber wenn es weniger sind, gibt er einen Fehler aus und bei mehr als 3 macht er nicht richtig weiter. Ich könnte mir denken dass es daran liegt, dass ich 3 for ... to ... do Schleifen habe, aber ich weis nicht wie ich es so umändern soll, dass es auch mit 2 oder 5 oder 10 Zahlen geht Den Code bisher habe ich größtenteils aus ![]() kurz geasgt: ich hab x 3er bzw 4er Gruppen an Buchstaben und von denen will ich alle möglichen Kombinationen auflisten. Aus ABC und DEF kann man also AD,AE,AF,BD,BE,BF,CD,CE,CF machen. vielleciht ist es so einfacher erklärt. Den Source hab ich mal drangehängt, vielleicht kann mir ja dadurch jemand weiterhelfen. Wäre nett wenn jemand Rat wüsste, MfG synex |
Re: Nummer zu String, die zweite
Hmm, Verrätst du uns, was das Programm am Ende genau machen soll?
Sonst kann ich schlecht einen Algorithmus schreiben! |
Re: Nummer zu String, die zweite
Ich würde ein Lexikon aufbauen, was über einen Suchbaum Indiziert ist.
Code:
So würde ich mir das Vorstellen.
ABC (1) --- ABC (1) - Ab
\--UVW (?) -- DEF (2) -- Auf |
Re: Nummer zu String, die zweite
@axelf98: Also das Programm soll am Ende von einer (Telefon)Nummer alle möglichen Buchstabenkombinationen auflisten, um sich eine Nummer lecihter merken zu können. Dass man sich also anstatt 4267 "HANS" merken kann.
@neolithos: Ehrlichgesagt versteh ich nicht so recht wie ich das verwirklichen soll, könntest du mir da vielleciht nen kleinen Tipp geben? Ansonsten danke schonmal soweit, MfG synex |
Re: Nummer zu String, die zweite
Kleiner TIP:
Delphi-Quellcode:
So ungefähr! Aber nicht bis ins letzte durchdacht!
TNumber = record
fNumbers : [0..9] of PNumber; // pNumber = nil wenn keine Weitere Verzweigungen dwAlpha : Cardinal; // Wenn Bit gesetzt dieser Buchstabe gesetzt end; |
Re: Nummer zu String, die zweite
@neolithos: Danke für den Tip, aber ich muss zugeben, ich checks nicht so recht. Wie verwende ich das in meinem Code?
Bisher sieht es ja so aus:
Delphi-Quellcode:
Aber wie gesagt, geht nur bei 3 Zahlen.
procedure TForm1.Button2Click(Sender: TObject);
var c,i,ii,iii:integer; begin c:=listbox1.items.count; listbox1.Items.Add(''); for i:=0 to c do begin for ii:=1 to length(listbox1.Items[i]) do begin for iii:=1 to c do begin memo1.Lines.Add( listbox1.Items[c-3][i+1]+ listbox1.Items[c-2][ii]+ listbox1.Items[c-1][iii] ); end; end; end; end; Wie kann ich das jetzt mit deinem Code verbinden? MfG synex |
Re: Nummer zu String, die zweite
Was ich geschrieben habe soll zeigen wie man die Daten im Speicher hält.
Sprich ein Lexikon was über einen Suchbaum indiziert ist (so ungefähr)! Wäre nur das Wort "ab" gespeichert....
Code:
Das ist die Idee! Ich hoffe du siehst es!
Root: fNumbers[1] ->
fNumbers[1], $00000001 -> fNumbers[1], $00000002 Hab ich mir gerade ausgedacht! |
Re: Nummer zu String, die zweite
ne du also ist sicher gut gemeint und ich bin dir acuh sehr dankbar dafür, aber ich checks nicht, sorry! Mein aktuelles Problem ist ja wie ich alle Kombinationsmöglichkeiten von x 3er bzw 4er Buchstabengruppen aufliste.
Vielen Dank nochmal, MfG synex |
Re: Nummer zu String, die zweite
Hi synex,
der wesentliche Fehler liegt in den Zeilen
Delphi-Quellcode:
und folgende. Du hast 'c' als Anzahl der Listbox-Einträge definiert. Deshalb hast Du mit Items[c-3], Items[c-2] und Items[c-1] die letzten drei Einträge der Listbox angesprochen. Wenn die Listbox weniger als drei Einträge hat, gibt es einen Fehler (weil Du Items[-1] ansprechen willst). Und egal wieviel Einträge mehr vorhanden sind, Du liest immer nur die letzten drei aus, deshalb sind in memo1 auch immer drei Buchstaben zu sehen.
listbox1.Items[c-3][i+1]
Du musst das ganze aber sowieso anders angehen. Für so etwas braucht man eine Rekursion. Du denkst doch ungefähr (Eingabe z.B. '234'): Wenn die erste Ziffer (Möglichkeiten: 'A', 'B', 'C') 'A' ist, dann kann die zweite Ziffer 'D', 'E' oder 'F' sein. Für jede dieser Möglichkeiten kann dann wiederum die dritte Ziffer etc.... Du musst also eine Funktion schreiben, die für eine gegebene Position im Eingabestring alle (meistens drei) Möglichkeiten durchgeht und sich damit selbst für die nächste Position im Eingabestring aufruft. Diese Funktion sieht so aus:
Delphi-Quellcode:
Aufgerufen wird sie so:
procedure TForm1.FindeKombinationen(Prefix, Rest: string);
var i: integer; neuPrefix, neuRest: string; HandyBuchstaben: string; begin // Finde die möglichen Buchstaben zur aktuellen Ziffer HandyBuchstaben := FindeHandyBuchstaben(Rest[1]); // gehe die möglichen Buchstaben zur aktuellen Ziffer durch for i := 1 to length(HandyBuchstaben) do begin // hänge den aktuellen Buchstaben an den bestehenden Ergebnisstring an neuPrefix := Prefix + HandyBuchstaben[i]; // wenn wir noch nicht bei der letzten Ziffer sind: if length(Rest) > 1 then begin // ersten Buchstaben des Rests abschneiden // (den haben wir an den Prefix angehängt) neuRest := Copy(Rest, 2, length(Rest) - 1); // rekursiver Aufruf für die nächste Ziffer findeKombinationen(neuPrefix, neuRest) end else // Hänge die gefundene Kombinationsmöglichkeit an die Stringliste an FKombinationen.Add(Prefix + Handybuchstaben[i]); end; end;
Delphi-Quellcode:
Was ich noch gemacht habe, ist eine private Variable FKombinationen: TStringList in die Formularklasse aufzunehmen, die im FormCreate-Ereignis erzeugt und entsprechend beim Schließen des Formulars befreit wird. So ist es erstens etwas durchsichtiger, zweitens hast Du die Arbeit des Erzeugens der Kombinationen von der Anzeige getrennt (kannst sie also besser wiederverwenden) und vor allem geht es wesentlich schneller, am Schluss auf einen Schlag die ganze Liste dem Memo zuzuweisen als jedesmal eine Zeile anzuhängen (es sind immerhin sehr viele Ergebnisse).
procedure TForm1.Button3Click(Sender: TObject);
begin FKombinationen.Clear; { vorher noch eine Sicherheitsabfrage } try StrToInt(Edit1.Text) except ShowMessage('Eingabe ist keine Zahl'); exit; end; FindeKombinationen('', Edit1.Text); memo1.Text := FKombinationen.text; end; (Außerdem musst Du natürlich noch einen Button3 hinzufügen). Um es nachzuvollziehen, was da passiert, nimm eine kurze nummer mit zwei oder drei ziffern und gehe es schrittweise durch. Achte darauf, was mit den Werten von Prefix, Rest, neuPrefix und neuRest passiert. Und bedenke: Du springst dabei nicht immer in derselben Methode hin und her, sondern die Methode ruft sich selbst immer wieder als Methode auf. D.h. die lokalen Variablen sind immer neue. Viel Erfolg damit Urs P.S. ich finde das ganze übrigens eine lustige Idee. Leider gibt meine eigene Telefonnummer kein einziges irgendwie verwertbares Wort. |
Re: Nummer zu String, die zweite
Wow was für ne Antwort!!
Erstmal Dank ich dir ganz schön, dass du dir deswegen so ne Mühe gemacht hast! Danke *g* Ich hab grad leider nicht die Zeit das einzubauen und auszuprobieren aber ich vertrau jetzt einfach mal drafu dass das funktioniert; Morgen werd ich denk ich dazu kommen das ganze einzubauen und auszuprobieren, dann meld ich mich nochmal. Im Prinzip war mir das schon klar dass das an dem c-3 hängt, aber ich wusste einfach nciht wie ich das anders machen soll. Dank dir bin ich jetzt in soweit schlauer, auch wenn ichs noch nicht versteh :D Aber das kommt sicher noch Und danke für das Kompliment, ich finds auch mal ne Idee wert, sonst würd ich mir ja den ganzen Stress net machen *g* thx nochmal, der synex |
Re: Nummer zu String, die zweite
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo synex,
mir ist noch was eingefallen: Da Dein Programm ziemlich viele Ergebnisse zurückgibt, könntest Du dem Benutzer helfen, indem Du die Ergebnisse mit einem Wörterbuch abgleichst und die Treffer separat darstellst. Dazu müsstest Du irgendwoher eine Wörterbuchdatei finden , einlesen und die Ergebnisse vergleichen. Ich habe es mal mit einem leicht geänderten MSOffice-Wörterbuch gemacht, aber da muss man natürlich auf Copyright achten. Da die Änderungen doch noch recht zahlreich geworden sind, hänge ich die komplette geänderte Unit und das Formular an (und das Wörterbuch). Das verwendete Wörterbuch ist aber offensichtlich recht ungeeignet, es findet viel zu wenige Treffer (d.h. es sind keine "Handy-kompatiblen" Wörter gespeichert). Vielleicht findest Du ja irgendwo ein T9-Wörterbuch. Viel Erfolg damit Urs |
Re: Nummer zu String, die zweite
P.S. ein kleiner aber feiner Fehler in meiner Datei:
Du musst die entsprechende Zeile in leseWortliste so korrigieren:
Delphi-Quellcode:
FWortliste[i] := AnsiUpperCase(Trim(FWortliste[i]));
|
Re: Nummer zu String, die zweite
wow man urs.lika!!
Du hast mir ja quasi die ganze Arbeit abgenommen! Das mit dem Wörterbuch hatte ich auch vor irgendwann in mein Programm einzubauen, nur wollte ich halt erstmal die ganze Nummer-zu-Buchstaben Geschichte abschließen. Was bleibt mir denn dann noch übrig? Du hast ja quasi schon das Programm geschrieben! Bei dem älteren post, wo du diese rekursive Methode mir versucht zu erklären hast und den source gepostet hast, hatte ich immer einen Fehler, irgend eine Schutzverletzung, aber jetzt das untere funktioniert einwandfrei! Ich kann dir echt kaum genug danken, jetzt muss ich mir das nur mal irgendwann so lange anschauen bis ich auch check was da eigentlich passiert :wink: Da mach ich mich jetzt mal dran, MfG synex |
Re: Nummer zu String, die zweite
Bemüh' dich nur, es zu verstehen...
Es ist ziemlich kompliziert, aber mit Geduld und Konzentration bekommt man es hin (Debuggen im Schritt-Modus, dabei immer den Überblick behalten, wo (also in welcher Schachtel-Ebene) Du bist, da hilft evtl. auch Papier und Bleistift). Eins noch: die Häufigkeit von Treffern mit einem Wörterbuch wird erhöht, wenn Du in Deiner FindeHandyBuchstaben-Methode zumindest die ÄÖÜs mitgibst. Und zum Wörterbuch: suche einfach nach *.dic-Dateien. Die ich Dir geschickt hatte, war wohl kein geeignetes. Und bei einem großen Wörterbuch wird diese Methode (immer über IndexOf zu suchen) sehr langsam. Wenn Du Dich nicht in die Richtung von indizierten Suchen (siehe frühere Posts von Anderen, da kenne ich mich auch nicht aus) versuchen wolltest, könntest Du zumindest nur die Wörter durchsuchen, die die richtige Zahl von Buchstaben haben (entweder gleich beim Einlesen ein Array von StringListen füllen oder vor dem Start der Suche alle Wörter mit der betreffenden Zahl von Buchstaben in eine Stringliste laden, die dann verwendet wird. Jetzt abschließend nochmal: Viel Erfolg Urs |
Re: Nummer zu String, die zweite
Also danke nochmal urs!
Ich werd mir das mal anschaun und (hoffentlich) auch irgendwann mal verstehen. Aber wenn ich dann mal ein fertiges Programm draus geamcht hab, hab ich irgendwie Hemmungen des dann zu veröffentlichen, weil du ja quasi des Programm geschrieben hast. Wenigstens die Idee hatte ich noch selbst ^^ Ich werd dich dann natürlich beim About kräftigst loben ^^Wenns denn mal irgendwann mal fertig wird :) Also in so weit, alles gute und danke nochmal, mfg synex |
Re: Nummer zu String, die zweite
Mach mal und sag's mir dann, wenns fertig ist...
|
Re: Nummer zu String, die zweite
...werd ich...
|
Re: Nummer zu String, die zweite
Hallo Leute.
Ich bin auf der Suche nach einem Programm das Wörter in "T9 - Zahlen" umwandelt... Also: Die Zahl... 1 steht für ABC 2 für DEF 3 für GHI 4 für JKL 5 MNO 6 PQRS 7 TUV 8 WXYZ Der Sinn davon: Ich habe mir die Liste der 10.000 häufigsten Deutschen Wörter besorgt und versuche nun eine deutsche Sprachdateu für das Palm-Texteingabe Programm "PKWrite" zu basteln. Alle wörter in der (leider bisher nur englisch verfügbaren) Datenbank sind in der Folgenden Form: Beispiel: 1 a 11124261722 accelerated 111266 access 11126622 accessed 11126626 accesses 1112663134378 accessibility 1112663142 accessible 111266353 accessing [...] Ich will also meine Deutsche Wortliste in diese Zahlenkombi umwandeln. Das Programm muss am besten nacher nen .txt Doc ausspucken wo das genau (!) so drin steht: 1 a 11124261722 accelerated 111266 access 11126622 accessed 11126626 accesses 1112663134378 accessibility 1112663142 accessible 111266353 accessing Ist das möglich und wenn ja, wie schwer ist das, was muss ich dazu lernen? =( bin voll der nub ohne Ahnung... :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz