Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Unterprogramm zum Sortieren (https://www.delphipraxis.net/119599-unterprogramm-zum-sortieren.html)

mr_ 28. Aug 2008 23:03


Unterprogramm zum Sortieren
 
Hallo Jungs,

ich bin gerade dabei ein Delphiprogramm zu schreiben, mit dem man ein Bücherverzeichnis erstellen und verschiedene Sachen damit anstellen kann. Nach zwei Tagen Suchmaschinen quälen und Forenlesen habe ich noch immer keine Lösung für mein Problem gefunden.

Es handelt sich um Folgendes: Ich will die Anzahl der Bücher pro Kategorie fallend sortiert anzeigen lassen (mit einem Unterprogramm für das Sortieren von n Zahlen). Ich bin jetzt soweit, dass ich mir die Anzahl pro Kategorie in einem zweispaltigen StringGrid anzeigen lasse, aber ich weiß überhaupt nicht, wie ich jetzt das Unterprogramm realisiere, damit mir die Anzeige sortiert ausgegeben wird.

Hier mein Ansatz:

Delphi-Quellcode:
procedure sortieren(var a);
var i: integer;
    sel: boolean;
    dummy: string;
begin
 repeat
  sel:=true;
  for i:=1 to 4 do
   begin
    if a[i]>a[i+1] then
    begin
     dummy:=a[i];
     a[i]:=a[i+1];
     a[i+1]:=dummy;
     sel:=false
    end
   end;
  until sel;
end;

procedure TDateiarbeit.ButtonBproKClick(Sender: TObject);
var i,k: integer;
    kat: array[1..4] of integer;
    a: array[1..4] of kat;
begin
 for k:=1 to 4 do kat[k]:=0;
 k:=1;
 while StringGrid2.Cells[1,k]<>'' do
  begin
   for i:=0 to 4 do StringGrid2.Cells[i,k]:='';
   k:=k+1
  end;
 Seek(Buchdatei,0);
 while not Eof(Buchdatei) do
  begin
   Read(Buchdatei,Buch);
   with Buch do
    begin
     if (Buch.Kategorie='Krimi') then kat[1]:=kat[1]+1;
     if (Buch.Kategorie='Nachschlagewerk') then kat[2]:=kat[2]+1;
     if (Buch.Kategorie='Roman') then kat[3]:=kat[3]+1;
     if (Buch.Kategorie='Science-Fiction') then kat[4]:=kat[4]+1
    end
  end;
 sortieren(a);
 StringGrid2.Cells[0,0]:='Kategorie';
 StringGrid2.Cells[1,0]:='Anzahl der Bücher';
 for i:=1 to 4 do StringGrid2.Cells[0,i]:=???;    <-- hier sollen die Kategorien hin
                  StringGrid2.Cells[1,i]:=???      <-- hier sollen die Anzahlen hin
end;
Hat jemand von euch eine zündende Idee? Wenn ja, her damit! :feuerchen:

Lieben Dank schon mal.
Marius

Corpsman 29. Aug 2008 06:25

Re: Unterprogramm zum Sortieren
 
Also wenn ich dich richtig verstanden habe brauchst du 2 Sortieralgorithmen.

1. Sortieren nach Kategorie

2. Absteigend sortieren.

Ich schlage dir da einfach mal den Quicksort Algorithmus vor.

Den wendest du 2 ( eigentlich 5 mal )mal an.

1. Anwendung sortiert das gesamte Feld ( das geht nur wenn du deine Kategorie strings zwischenzeitig in einen Integer bastelst der dann sortiert werden kann, sonst hast du zu viele String vergleiche ).

das Tolle am Quicksort du kannst Grenzen angeben.

als 2 - 5 ten schritt rufst du den Quicksort wieder auf. Diesmal soll er die Anzahl in der Kategorie sortieren, Als Grenzen übergibst du dann immer die grenzen der Kategorieen. Diese Grenzen kannst du vorher mit nur einem Schleifendurchlauf ermitteln ;).

also in etwa so

Delphi-Quellcode:
1. Quicksort(0,n-1)

[a,b,a,c,b,a,c,b,c,a]
=>
[a,a,a,a,b,b,b,c,c,c]

2. Quicksort2(0,3)
3. Quicksort2(4,6)
4. Quicksort2(7,9)

Wenn es 3 Kategorien wären ( a,b,c) und Quicksort2 sortiert dann nach Anzahl...

mr_ 29. Aug 2008 11:42

Re: Unterprogramm zum Sortieren
 
Hm, danke für die schnelle Antwort :) , aber, ehrlich gesagt, bringt mich das nicht wirklich weiter.

Einen Sortieralgorithmus habe ich ja schon und auch den zur Ermittlung der Anzahl der Bücher pro Kategorie - aber wie bringe ich die beiden nun zusammen? Das ist eigentlich eher mein Problem.

In meinem geposteten Code sind einige Fehler bzw. habe ich Wörter nach-gut-Dünken eingesetzt...

Schwedenbitter 29. Aug 2008 12:01

Re: Unterprogramm zum Sortieren
 
Was spricht gegen eine Komponente vom Typ TListView?
Dort ist mindestens 1 Sortieralgorhytmus als Methode mit drin. Der wird dann so aufgerufen:
Delphi-Quellcode:
Procedure TMain.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
Begin
   ColumnToSort:=Column.Index;
   (Sender As TCustomListView).AlphaSort
End;
Ob das lege artis ist, kann ich nicht sagen. Es funktioniert aber bei mir.

mr_ 29. Aug 2008 12:15

Re: Unterprogramm zum Sortieren
 
Hm, dagegen spricht, das ich die Komponente TListView in meiner Lösung nicht benutzen soll, sondern eine Lösung mit Unterprogramm finden muss. :roll:

DeddyH 29. Aug 2008 12:21

Re: Unterprogramm zum Sortieren
 
Dann werfe ich mal die DP-Suche an:Hier im Forum suchenStringgrid sortieren

p80286 29. Aug 2008 16:09

Re: Unterprogramm zum Sortieren
 
Hallo DeddyH,

entschuldige aber wenn ich das richtig verstanden habe, braucht mr_ eine Procedure/Function die sortiert, und keine sortierte Ausgabe. Das klingt verdammt nach Hausaufgabe.
(der Weg ist das Ziel)

Ich schlage vor, das ganze über ein record zu realisieren:

Delphi-Quellcode:
t_buecher: record
              Anzahl : integer;
              Katego : string[20];
           end;
oder so ähnlich.

Für's Sortieren nimmt man dann irgendeinen Bubblesort-Abkömmling, den versteht jeder Lehrer,
oder aber wenn's wirklich was sinvolles sein soll, dann alle records in ein TList packen und mit TList.Sort sortieren. Da die Vergleichsfunktion Sache des Programmieres ist, kann man hübsche Sachen damit machen.

Gruß
K-H

grenzgaenger 29. Aug 2008 16:44

Re: Unterprogramm zum Sortieren
 
#1: würd ich mir angewöhnen den code ordentlich zu formatieren ... (a) ersparst du dir eigene fehler, (b) findest du schneller fehler und (c) können andere sich schneller ein bild machen und dir helfen.

#2: würd ich eine visuelle kompo nicht zum sortieren verwenden (egal ob stringgrid, listbox, listview, etc. pp.)

mach das am besten über eine object list, definiere deine objekte sauber und hänge sie in die liste... in dieser verwaltest du deine objekte.. wenn du sortieren willst, sortiere deine objectliste (OL) und aktualisiere daraus deine visuelle kompo. für das sortieren der OL, musst nur eine kleine funktion schreiben, in der du feststellt, welches objekt kleiner oder grösser ist und anschliessend die methode sort mit der vergleichsroutine aufrufen... und schon haste es sortiert :-)

<HTH> GG

mr_ 30. Aug 2008 10:44

Re: Unterprogramm zum Sortieren
 
Hej ihr,

@p80286
Zitat:

wenn ich das richtig verstanden habe, braucht mr_ eine Procedure/Function die sortiert, und keine sortierte Ausgabe.
Ja, genau. :) Ich brauch eine Prozedur, die auf Knopfdruck die Bücher pro Kategorie ermittelt, diese Daten (Anzahl und Kategorie) an ein Unterprogramm weitergibt, welches wiederum die Werte sortiert an die erste Prozedur zurückgibt. Und die erste Prozedur soll mir das dann in einem StringGrid anzeigen.

Die Idee mit dem Record finde ich auch gut, ich weiß aber nicht so genau, wie ich es umsetzen soll.

@grenzgaenger
zu #1: Meinst du den formalen Aufbau? Ups, ich dachte, ich hätte ihn gut sortiert... Aber danke für den Hinweis, du hast völlig Recht!

Was meinst du mit objectliste? Ein Record?


Ich werde mich morgen gleich mal daran setzen und versuchen, den Record reinzubasteln... und dann (wenns immer noch nicht klappt) meinen Code posten.

Was ich aber nicht hingekriege, ist, wie ich beide Prozeduren in Verbindung bringe, also welche Formalitäten ich beachten muss bei der Parameterübergabe, wie ich die eine Prozedur in der anderen aufrufe und die Parameter passend wieder zurückgebe, und so... Was sagt ihr zu meinem bisherigen Code (abgesehen davon, dass noch kein Record drin ist)?

Vielen Dank für eure Mühen! :thumb:

zarcaphii 30. Aug 2008 11:19

Re: Unterprogramm zum Sortieren
 
Die Objectlist ist eine Klasse, die von Delphi zur Verfügung gestellt wird. In dieser Liste kannst du Objektinstanzen verwalten. Dazu gehört unter anderem ein Sortierarlgo.

Momentan würde ich dir aber empfehlen diese Klasse vorerst liegen zu lassen.
1.) Weiß ich nicht, ob du überhaupt schon objektorientiert programmieren kannst und
2.) sieht die Aufgabe mehr danach aus, als solltest du dir selber Gedanken über einen sinnvollen Sortieralgorithmus machen.

Ich gebe dir mal ein paar Anregungen:
• Der Record ist zum Spechern deiner Daten gut geeignet. Eine Vorlage wie er in deinem Programm aussehen könnte wurde weiter oben ja schon gepostet.

• Du hast bis jetzt einen Array sortiert. Dabei würde ich für diese Aufgabe bleiben.

• Es ist auch schon der "Quicksort" vorgeschlagen worden. Quicksort ist ein rekursives Sortierverfahren, das im Durchschnitt schneller arbeitet als jede andere Methode. Wikipedia weiß mehr (die Grafik auf der Seite finde ich btw. Klasse).

Wenn du diese 3 Dinge jetzt in einen Zusammenhang bringen kannst, hast du deine Aufgabe eigentlich schon erledigt ^_^

Ich hoffe ich konnte dir helfen.

P.S.: Gibt es eigentlich immer nur die 4 Bücherkategorien oder sollte dein Programm da flexibel sein?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:25 Uhr.
Seite 1 von 2  1 2      

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