Delphi-PRAXiS
Seite 7 von 8   « Erste     567 8      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Telefonbuch (https://www.delphipraxis.net/141423-telefonbuch.html)

funkuchn 10. Okt 2009 13:07

Re: Telefonbuch
 
So da bin ich wieder und die Suchfunktion habe ich so umgeschrieben, funktion iert auch suer :)
Delphi-Quellcode:
begin
 SuchName:=edit6.text;
 AnzahlEintraege:=Telefonbuch.Count div 2;

 for i:=AnzahlEintraege-1 downto 0 do
     if Telefonbuch[i*2]=SuchName then
      begin
       showmessage(Suchname+' wurde gefunden. Die Telefonnummer lautet: '+Telefonbuch[i*2+1]);
      end
      else
     if Telefonbuch[i*2+1]=SuchName then
      begin
       showmessage(Suchname+'wurde gefunden. Der Name lautet:'+Telefonbuch[i*2]);
       end;

end;
jetzt brauch ich nur noch Tipps, wegen dem Sortieren, habe das jetzt mit Stringlist gemacht, aber das ist ja iwie doof, da ordnet der den Namen ja nicht mehr der Person zu und das sollte ja eigentlich so bleiben...Tipps?

DeddyH 10. Okt 2009 13:20

Re: Telefonbuch
 
Und genau deshalb hatte ich den kompletten Datensatz in eine Zeile geschrieben. Da müsste man nur in der Sortierroutine das entsprechende Feld "herauspuhlen" und könnte dann ganz easy die Reihenfolge tauschen. alleinherrscher, übernehmen Sie :mrgreen:

alleinherrscher 10. Okt 2009 13:27

Re: Telefonbuch
 
Hey, sehr gut hast du das gemacht mit der Suchfunktion!

Also mit dem Sortieren:

Ich würde als erstes eine Funktion bauen, die dir zwei Einträge deines Telefonbuchs tauscht. Dann kannst du den rest mit gängigen Sortieralgorithmen machen.

Also fangen wir mal an:

Delphi-Quellcode:

procedure TForm1.TauscheTelefonbuchEintrag(Index1,Index2:integer);
var TauschName,TauschTelefonnummer:string;
     Anzahl:integer;
begin

//zunächst sicherstellen, dass beide Einträge kleiner als die Anzahl der Telefonbucheinträge sind:
Anzahl:=Telefonbuch.count div 2;
if (Index1>Anzahl-1) or (Index2>Anzahl-1) then exit;

//Den Eintrag mit Nummer Index1 in dem Zwischenspeicher schreiben:
Tauschname:=Telefonbuch[2*Index1];
TauschTelefonnummer:=Telefonbuch[2*Index1+1];


//Eintrag Index2 in Eintrag Index1 schreiben:
Telefonbuch[2*Index1]:=Telefonbuch[2*Index2];
Telefonbuch[2*Index1+1]:=Telefonbuch[2*Index2+1];

//Eintrag Index2 aus Zwischenspeicher lesen:
Telefonbuch[2*Index2]:=Tauschname;
Telefonbuch[2*Index2+1]:=TauschTelefonnummer;


end;
//edit: zwei kleine Fehler entfernt (um 15.06 Uhr)

funkuchn 10. Okt 2009 13:31

Re: Telefonbuch
 
bevor ich damit anfange, was ist mit INdex1/2 gemeint? Der Inhalt des gespeicherten oder wie?

alleinherrscher 10. Okt 2009 13:37

Re: Telefonbuch
 
Zitat:

Zitat von funkuchn
bevor ich damit anfange, was ist mit INdex1/2 gemeint? Der Inhalt des gespeicherten oder wie?

Die Nummer des Eintrages:

warte ich mache ein bildchen dazu...

funkuchn 10. Okt 2009 13:38

Re: Telefonbuch
 
okay

alleinherrscher 10. Okt 2009 13:48

Re: Telefonbuch
 
Liste der Anhänge anzeigen (Anzahl: 2)
Index1 und Index2 sind also die Indizes der Telefonbucheinträge, also die zweite Spalte in der Grafik

Du könntest also sagen: Tausche Eintrag 0 und Eintrag 1.

Dann würde Hans Dieter und Tante Käthe inkl. Telefonnummer getauscht.

okay?

//EDIT: Alle Fehler behoben

//Edit:

So, nun schonmal weiter im Programm:

Frage: Wie können wir einfach nach Namen sortieren?

Die intuitive Antwort ist doch:
1) Suche aus meiner Liste den Namen heraus, dessen Buchstaben, verglichen mit allen anderen Namen in der Liste, am weitesten vorne im Alphabet stehen.
2) Tausche diesen Eintrag an den Anfang der Liste.
3) Betrachte dir jetzt nur noch den Rest der Liste und suche erneut aus den verbleibenden Namen in der Liste den Namen, der am weitesten vorne im Alphabet steht.
4) Tausche den Namen auf die zweite Position in der Liste
5) usw...

Wir brauchen also nun folgende Hilfsmittel, um die Suche durchführen zu können:

1. FOR-Schleifen
2. Eine Funktion, die die Namen miteinander vergleicht, und entscheidet, welcher Name weiter vorn im Alphabet steht. Dies leistet die Funktion Hier im Forum suchenCompareStr
3. Unsere Tauschprozedur TauscheTelefonbuchEintrag

Überleg dir mal ein bisschen was dazu, und dann machen wir weiter :zwinker:

funkuchn 10. Okt 2009 16:17

Re: Telefonbuch
 
Okay, das Prinzip habe ich verstanden....
also nur die Theorie, beim Umsetzen...ähm...naja....kam nichts Gescheites raus :roll:

alleinherrscher 10. Okt 2009 16:30

Re: Telefonbuch
 
Okay.

Also etwas pseudo-code:
Code:
Zähle j von 0 bis Anzahl_der_Telefonbucheinträge-1 hoch
  Tauschindex=j
  Zähle i von j bis Anzahl_der_Telefonbucheinträge-1 hoch
     Falls Telefonbucheintrag[2*i] weiter vorn im Alphabet steht als Telefonbucheintrag[2*TauschIndex]
         dann: Setze TauschIndex=i
  Tausche_Telefonbucheintrag(j,TauschIndex)
Erklärung: i und j sind Laufindizes, die durch eine FOR Schleife hochgezählt werden.
TauschIndex enthält den Index des Namens im TElefonbuch, der am weitestens vorne im Alphabet steht.


Versuch mal, das in Delphi Code umzubauen. Wenn du noch Verständnisfragen hast, sag bescheid.

Als Hilfe:

Die If-Abfrage kannst du so programmieren:

Delphi-Quellcode:
      if CompareStr(Telefonbuch[2*i],Telefonbuch[2*TauschIndex])<0  then
       TauschIndex:=i;
Info zu CompareStr

Viel Erfolg!

//edit: wieder mal ne kleine Code-Korrektur...sry...

funkuchn 10. Okt 2009 16:48

Re: Telefonbuch
 
okay, mein Versuch ^^:

Delphi-Quellcode:
for i:=0 downto AnzahlEintraege-1 do
 Tauschindex:=j;
 for i[j]:=0 downto AnzahlEintraege-1 do
 If Telefonbucheintrag[2*i]>Telefonbucheintrag[2*Tauschindex];
 then TauschIndex:=i;
 Tausche_Telefonbucheintrag(j,Tauschindex);
ich weiß, ich bin unfähig >.<


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr.
Seite 7 von 8   « Erste     567 8      

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