AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi +++ Hilfe - komme nicht weiter - Projekt: Adressbuch +++
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von ElRaiden · begonnen am 6. Okt 2006 · letzter Beitrag vom 6. Okt 2006
Antwort Antwort
ElRaiden

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

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

  Alt 6. Okt 2006, 18: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
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

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

  Alt 6. Okt 2006, 18:21
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.)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
ElRaiden

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

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

  Alt 6. Okt 2006, 18:37
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 6. Okt 2006, 18:45
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz