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