![]() |
+++ 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:
Der Quelltext für den QuickSort sieht dagegen so aus:
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.
Code:
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.
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; 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 |
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.) |
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:
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.).
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; Bitte um eure Hilfe und DANKESCHÖN für alle möglichen Antworten! mfg ElRaiden |
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:
So, diese Funktion verwendest Du in deinem Quicksort-Algorithmus. Probiere ruhig ein wenig.
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; |
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