AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unterprogramm zum Sortieren

Ein Thema von mr_ · begonnen am 29. Aug 2008 · letzter Beitrag vom 30. Aug 2008
Antwort Antwort
Seite 1 von 2  1 2      
mr_

Registriert seit: 13. Aug 2008
4 Beiträge
 
Delphi 2005 Personal
 
#1

Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 00:03
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!

Lieben Dank schon mal.
Marius
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 07:25
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...
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
mr_

Registriert seit: 13. Aug 2008
4 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 12:42
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...
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 13:01
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.
Alex Winzer
  Mit Zitat antworten Zitat
mr_

Registriert seit: 13. Aug 2008
4 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 13:15
Hm, dagegen spricht, das ich die Komponente TListView in meiner Lösung nicht benutzen soll, sondern eine Lösung mit Unterprogramm finden muss.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#6

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 13:21
Dann werfe ich mal die DP-Suche an:Hier im Forum suchenStringgrid sortieren
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 17:09
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
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#8

Re: Unterprogramm zum Sortieren

  Alt 29. Aug 2008, 17:44
#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
  Mit Zitat antworten Zitat
mr_

Registriert seit: 13. Aug 2008
4 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Unterprogramm zum Sortieren

  Alt 30. Aug 2008, 11:44
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!
  Mit Zitat antworten Zitat
Benutzerbild von zarcaphii
zarcaphii

Registriert seit: 7. Jun 2008
28 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Unterprogramm zum Sortieren

  Alt 30. Aug 2008, 12:19
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:05 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