Einzelnen Beitrag anzeigen

ElRaiden

Registriert seit: 6. Okt 2006
2 Beiträge
 
#1

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

  Alt 6. Okt 2006, 19:09
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!

Mfg

ElRaiden
  Mit Zitat antworten Zitat