Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi +++ Hilfe - komme nicht weiter - Projekt: Adressbuch +++ (https://www.delphipraxis.net/78544-hilfe-komme-nicht-weiter-projekt-adressbuch.html)

ElRaiden 6. Okt 2006 18:09


+++ Hilfe - komme nicht weiter - Projekt: Adressbuch +++
 
Hallo!

Ich arbeite zurzeit am Projekt Adressbuch und bin jetzt auf ein Problem gestoßen.

Meine Kontakte werden in einem dynamischen Array als Records gespeichert (bin nur ein Anfänger ;) ). Zum Sortieren wollte ich QuickSort benutzen, doch hier bin ich auf ein Problem gestoßen. Ich möchte, dass ich durch eine ComboBox auswählen kann, wonach sortiert wird, z.B. nach dem Namen oder Wohnort. Der Quelltext sieht ungefähr so aus:

Code:
procedure TForm1.ComboBox1Change(Sender: TObject);
var linkegrenze, rechtegrenze : integer;
    i : integer;
    auswahl, pivotelement : string;

begin
  i := 0;
  linkegrenze := 0;
  rechtegrenze := length(Adressbuch)-1;
  case ComboBox1.ItemIndex of
  0 : ;
  1 : begin
      pivotelement := Adressbuch[0].vorname;
      auswahl := Adressbuch[i].vorname
      p_Sortieren(linkegrenze, rechtegrenze, auswahl, pivotelement);
      end;
  2 : begin
      pivotelement := Adressbuch[0].name;
      auswahl := Adressbuch[i].name;
      p_Sortieren(linkegrenze, rechtegrenze, auswahl, pivotelement);
      end;
  3 : begin
      pivotelement := Adressbuch[0].strasse;
      auswahl := Adressbuch[i].strasse;
      p_Sortieren(linkegrenze, rechtegrenze, auswahl, pivotelement);
      end;

  ... usw.
Der Quelltext für den QuickSort sieht dagegen so aus:

Code:
procedure TForm1.p_sortieren (linkegrenze,rechtegrenze : integer; pivotelement : string; var auswahl : string);
var j,k,i : integer;                                                           // Hilfsvariablen
    hilfsarray : array of string;
    LinkesFeldLinks, LinkesFeldRechts, RechtesFeldLinks, RechtesFeldRechts : integer;
begin
  setlength (hilfsarray, rechtegrenze+1);                                      // Länge des Hilfsarrays setzen
  if linkegrenze < rechtegrenze then
  begin
    j := linkegrenze;                                                          // Grenzen bestimmen
    k := rechtegrenze;
    for i := linkegrenze+1 to rechtegrenze do                                  // Sortieren der Elemente im Hilfsarray
    begin
      if auswahl < pivotelement then
      begin
        hilfsarray[j] := auswahl;
        j := j+1;
      end
      else
      begin
        hilfsarray[k] := auswahl;
        k := k-1;
      end;
    end;
    hilfsarray[k] := pivotelement;                                             // Pivotelement an der richtigen Stelle im Hilfsarray
    for i := linkegrenze to rechtegrenze do                                    // Übertragen der Werte in das Ursprungsarray (Adressbuch)
    begin
      auswahl := hilfsarray [i];
    end;
    LinkesFeldLinks := linkegrenze;                                            // Grenzen neu festlegen, jeweils links und rechts vom Pivotelement
    LinkesFeldRechts := k-1;
    RechtesFeldLinks := k+1;
    RechtesFeldRechts := rechtegrenze;
    p_sortieren(LinkesFeldLinks,LinkesFeldRechts,auswahl,pivotelement);        // Rekursion
    p_sortieren(RechtesFeldLinks,RechtesFeldRechts,auswahl,pivotelement);
  end;
end;
Das Problem ist, wie die Profis schnell sehen werden, dass es mit der Variable "auswahl" nicht hinhaut. Überall wo in der QuickSort-Prozedur "auswahl" steht, sollte eigentlich "Adressbuch[i].vorname" für das Sortieren von Vornamen stehen. Das Programm solte also wissen: jetzt muss ich auf Adressbuch[i].xxx zugreifen, je nachdem was in der ComboBox ausgewählt wurde. Man könnte natürlich auch mehrere QuickSort-Prozeduren erstellen (in denen jeweils entweder "Adressbuch[i].vorname" oder "Adressbuch[i].wohnort" stehen würde), was jedoch sehr unschön ist, da das Problem bestimmt auch anders zu lösen ist. Ich möchte einfach, dass nach der Auswahl wonach sortiert wird, entsprechende Variablen übergeben werden, damit die QuickSort-Prozedur weißt: aha, auswahl steht jetzt für Adressbuch[i].vorname oder ggf. auswahl steht jetzt für Adressbuch[i].wohnort usw.

Wäre sehr nett, wenn mir jemand zeigen würde, wie es lang gehen soll, da ich echt keine Ahnung habe. Sitze schon an dem problem mehrere Stunden und komme einfach nicht weiter!

Danke im Vorraus für eure Hilfe! :-D

Mfg

ElRaiden

alzaimar 6. Okt 2006 18:21

Re: +++ Hilfe - komme nicht weiter - Projekt: Adressbuch +++
 
Schreibe Dir eine Funktion 'Vergleiche (a,b : TElement)'. Diese Funktion liefert -1, wenn "a < b", 0, wenn "a = b" und +1 wenn "a > b" ist.
So, was bedeutet denn "a < b" ?
Wenn der Anwender nach dem Vornamen sortieren will, dann bedeutet das "a.Vorname < b.Vorname", wenn der Anwender nach dem Nachnamen sortieren will eben a.Nachname > b.Nachname usw.

Mit dieser Funktion kannst Du dann auch z.B. innerhalb gleicher Nachnamen nach Vornamen sortieren (oder nach Geburtsdatum etc.)

ElRaiden 6. Okt 2006 18:37

Re: +++ Hilfe - komme nicht weiter - Projekt: Adressbuch +++
 
hmm, also erstmal einen schönen Dank für deine schnelle Antwort. Ich muss noch zufügen, dass ich gerade dabei bin, so die Grundlagen zu erforschen, also mich noch nicht so mit Funktionen auskenne.

Außerdem habe ich es vllt nicht so gut erklärt, das Problem natürlich.

Ich könnte für das sortieren mehrere folgende Prozeduren erstellen, die sich nur in dem Bereich unterscheiden, wonach sortiert wird, also entweder nach Vorname, Nachnamen, PLZ, Wohnort usw:

Code:
procedure p_sortierenname(linkegrenze,rechtegrenze : integer);
var pivotelement : string;
    j,k,i : integer;
    hilfsarray : array of string;
    LinkesFeldLinks, LinkesFeldRechts, RechtesFeldLinks, RechtesFeldRechts : integer;
begin
  setlength (hilfsarray, rechtegrenze+1);
  if linkegrenze < rechtegrenze then
  begin
    pivotelement := Adressbuch[0].name;
    j := linkegrenze;
    k := rechtegrenze;
    for i := linkegrenze+1 to rechtegrenze do
    begin
      if Adressbuch[i].name < pivotelement then
      begin
        hilfsarray[j] := Adressbuch[i].name;
        j := j+1;
      end
      else
      begin
        hilfsarray[k] := Adressbuch[i].name;
        k := k-1;
      end;
    end;
    hilfsarray[k] := pivotelement;
    for i := linkegrenze to rechtegrenze do
    begin
      Adressbuch[i].name := hilfsarray [i];
    end;
    LinkesFeldLinks := linkegrenze;
    LinkesFeldRechts := k-1;
    RechtesFeldLinks := k+1;
    RechtesFeldRechts := rechtegrenze;
    p_sortierenname(LinkesFeldLinks,LinkesFeldRechts);
    p_sortierenname(RechtesFeldLinks,RechtesFeldRechts);
  end;
end;
Nur dann müsste ich jeweils mehrere Prozeduren erstellen, die sich nur darin unterscheiden, wonach sortiert wird. Könnte ich nicht für "Adressbuch[i].name" eine Variable einsetzten, die ich früher bestimmen kann (je nach Auswahl der Combobox, z.b: Adressbuch[i].wohnort oder Adressbuch[i].plz usw.).

Bitte um eure Hilfe und DANKESCHÖN für alle möglichen Antworten!

mfg

ElRaiden

alzaimar 6. Okt 2006 18:45

Re: +++ Hilfe - komme nicht weiter - Projekt: Adressbuch +++
 
Also:
Der Anwender wählt aus, wonach er sortieren möchte. Belassen wir es bei der Auswahl 'Vorname', 'Nachname', 'Strasse'.

Wir merken uns in einer Variablen ('Sortierkriterium'), was der Anwender möchte. Dabei bedeutet '0', das er nach dem Vornamen sortieren will, 1 das er nach dem Nachnamen sorieren will und 2, das er nach der Strasse sortieren will.

Die Funktion sieht z.B. so aus:
Delphi-Quellcode:
Function Vergleiche (Const a, b : TAdresse) : Shortint;
Begin
  case SortierKriterium of
    0 :
     If a.Vorname < b.Vorname Then
       Result := -1
     else If a.Vorname > b.Vorname then
       Result := +1
     else
       Result := 0;
    1 :
     If a.Name < b.Name Then
       Result := -1
     else If a.Name > b.Name then
       Result := +1
     else
       Result := 0;
    2 :
     If a.Strasse < b.Strasse Then
       Result := -1
     else If a.Strasse > b.Strasse then
       Result := +1
     else
       Result := 0;
  End;
End;
So, diese Funktion verwendest Du in deinem Quicksort-Algorithmus. Probiere ruhig ein wenig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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