![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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