AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nummer zu String, die zweite

Offene Frage von "Killer-Bee"
Ein Thema von synex · begonnen am 14. Sep 2003 · letzter Beitrag vom 5. Apr 2006
Antwort Antwort
Seite 1 von 2  1 2      
synex

Registriert seit: 14. Apr 2003
147 Beiträge
 
Delphi 6 Personal
 
#1

Nummer zu String, die zweite

  Alt 14. Sep 2003, 20:55
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
Angehängte Dateien
Dateityp: zip nr_zu_word_test_191.zip (221,2 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
axelf98

Registriert seit: 27. Aug 2003
Ort: Ennepetal
440 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Nummer zu String, die zweite

  Alt 14. Sep 2003, 21:55
Hmm, Verrätst du uns, was das Programm am Ende genau machen soll?
Sonst kann ich schlecht einen Algorithmus schreiben!
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#3

Re: Nummer zu String, die zweite

  Alt 15. Sep 2003, 07:43
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
synex

Registriert seit: 14. Apr 2003
147 Beiträge
 
Delphi 6 Personal
 
#4

Re: Nummer zu String, die zweite

  Alt 15. Sep 2003, 13:34
@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
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#5

Re: Nummer zu String, die zweite

  Alt 15. Sep 2003, 14:11
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!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
synex

Registriert seit: 14. Apr 2003
147 Beiträge
 
Delphi 6 Personal
 
#6

Re: Nummer zu String, die zweite

  Alt 15. Sep 2003, 14:27
@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
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#7

Re: Nummer zu String, die zweite

  Alt 15. Sep 2003, 14:34
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!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
synex

Registriert seit: 14. Apr 2003
147 Beiträge
 
Delphi 6 Personal
 
#8

Re: Nummer zu String, die zweite

  Alt 15. Sep 2003, 14:39
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
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#9

Re: Nummer zu String, die zweite

  Alt 16. Sep 2003, 15:29
Hi synex,

der wesentliche Fehler liegt in den Zeilenlistbox1.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.
  Mit Zitat antworten Zitat
synex

Registriert seit: 14. Apr 2003
147 Beiträge
 
Delphi 6 Personal
 
#10

Re: Nummer zu String, die zweite

  Alt 16. Sep 2003, 19:31
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 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.
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