Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Nummer zu String, die zweite (https://www.delphipraxis.net/8894-nummer-zu-string-die-zweite.html)

synex 14. Sep 2003 20:55


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 dem Thread

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

axelf98 14. Sep 2003 21:55

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!

neolithos 15. Sep 2003 07:43

Re: Nummer zu String, die zweite
 
Ich würde ein Lexikon aufbauen, was über einen Suchbaum Indiziert ist.


Code:
ABC (1) --- ABC (1) - Ab
          \--UVW (?) -- DEF (2) -- Auf
So würde ich mir das Vorstellen.

synex 15. Sep 2003 13:34

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

neolithos 15. Sep 2003 14:11

Re: Nummer zu String, die zweite
 
Kleiner TIP:

Delphi-Quellcode:
TNumber = record
  fNumbers : [0..9] of PNumber;
    // pNumber = nil wenn keine Weitere Verzweigungen
  dwAlpha : Cardinal;
    // Wenn Bit gesetzt dieser Buchstabe gesetzt
end;
So ungefähr! Aber nicht bis ins letzte durchdacht!

synex 15. Sep 2003 14:27

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:
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;
Aber wie gesagt, geht nur bei 3 Zahlen.
Wie kann ich das jetzt mit deinem Code verbinden?
MfG synex

neolithos 15. Sep 2003 14:34

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:
Root: fNumbers[1] ->
 fNumbers[1], $00000001 ->
   fNumbers[1], $00000002
Das ist die Idee! Ich hoffe du siehst es!
Hab ich mir gerade ausgedacht!

synex 15. Sep 2003 14:39

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

urs.liska 16. Sep 2003 15:29

Re: Nummer zu String, die zweite
 
Hi synex,

der wesentliche Fehler liegt in den Zeilen
Delphi-Quellcode:
listbox1.Items[c-3][i+1]
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.

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:
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;
Aufgerufen wird sie so:
Delphi-Quellcode:
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;
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).
(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.

synex 16. Sep 2003 19:31

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

urs.liska 17. Sep 2003 09:11

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

urs.liska 17. Sep 2003 09:26

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]));

synex 17. Sep 2003 18:42

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

urs.liska 17. Sep 2003 20:31

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

synex 17. Sep 2003 21:00

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

urs.liska 18. Sep 2003 00:14

Re: Nummer zu String, die zweite
 
Mach mal und sag's mir dann, wenns fertig ist...

synex 18. Sep 2003 17:00

Re: Nummer zu String, die zweite
 
...werd ich...

Killer-Bee 5. Apr 2006 12:50

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