Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz