 |
| |
|
|
 |
Autor |
Nachricht |
 |
| |
| mr_ |
#1| Verfasst am: 28.08.2008, 23:03 Titel: Unterprogramm zum Sortieren |
 |
 |
 |
|
gerade reingestolpert Beiträge: 4 angemeldet: 13.08.2008 Delphi 2005 Personal

|
Sprache: Delphi (Win32) 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: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50
| 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 |
|
 |
|
|
|
| |
| Corpsman |
#2| Verfasst am: 29.08.2008, 06:25 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
Mitglied Alter: 26 Status: offline Beiträge: 793 angemeldet: 08.11.2005 Delphi 5 Professional

|
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: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 11
| 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... |
| |
 --
Visit my Site at www.Corpsman.de.vu
or try my marble madness clone Balanced ( ca. 3,9 mb ) aktuell ver 0.64 ( jetzt mit onlinehighscores )
Zuletzt bearbeitet von Corpsman am 29.08.2008, 06:29, insgesamt 2-mal bearbeitet. |
 |
|
|
|
| |
| mr_ |
#3| Verfasst am: 29.08.2008, 11:42 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
gerade reingestolpert Beiträge: 4 angemeldet: 13.08.2008 Delphi 2005 Personal

|
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 |
#4| Verfasst am: 29.08.2008, 12:01 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
Mitglied Alter: 33 Status: offline Beiträge: 91 angemeldet: 22.03.2003 Wohnort: Finsterwalde

|
Was spricht gegen eine Komponente vom Typ TListView?
Dort ist mindestens 1 Sortieralgorhytmus als Methode mit drin. Der wird dann so aufgerufen:
| Delphi-Quellcode: | markieren | 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_ |
#5| Verfasst am: 29.08.2008, 12:15 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
gerade reingestolpert Beiträge: 4 angemeldet: 13.08.2008 Delphi 2005 Personal

|
Hm, dagegen spricht, das ich die Komponente TListView in meiner Lösung nicht benutzen soll, sondern eine Lösung mit Unterprogramm finden muss. |
|
 |
|
|
|
| |
| DeddyH |
#6| Verfasst am: 29.08.2008, 12:21 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 8.311 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
Dann werfe ich mal die DP-Suche an: Stringgrid sortieren |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
If a train station is where the train stops, what the hell is a workstation? |
 |
|
|
|
| |
| p80286 |
#7| Verfasst am: 29.08.2008, 16:09 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
aktives Mitglied Status: offline Beiträge: 155 angemeldet: 28.04.2008 Wohnort: Düsseldorf Delphi 7 Personal

|
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:
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 |
#8| Verfasst am: 29.08.2008, 16:44 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
ehem. Benutzer

|
#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 |
Zuletzt bearbeitet am 30.08.2008, 11:20, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| mr_ |
#9| Verfasst am: 30.08.2008, 10:44 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
gerade reingestolpert Beiträge: 4 angemeldet: 13.08.2008 Delphi 2005 Personal

|
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! |
|
 |
|
|
|
| |
| zarcaphii |
#10| Verfasst am: 30.08.2008, 11:19 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 07.06.2008 Turbo Delphi für Win32

|
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? |

Zuletzt bearbeitet von zarcaphii am 30.08.2008, 11:20, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| grenzgaenger |
#11| Verfasst am: 30.08.2008, 11:26 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
ehem. Benutzer

|
sorry, in #1 meinte ich formatieren, nicht sortieren ...
das mit der tObjectlist (OL) ist easy...
a) brauchst mal ein objekt
type
tMyObjekt=class
myfeld: mytype;
end;
dieses bearbeitest du dann in deinem progy und nimmst es in die liste auf
var
OL: tMyObjectList;
begin
OL := tMyObjectList.create;
....
OL.add(tMyObjekt.create);
...
und dann sagste nur noch einfach
OL.Sort(myCompareFunction);
dann noch kurz dein stringgrid updaten.. und fertig.
IMHO find ich das mit der OL einfacher und sicherer als mit records, dann da darfst dich um die ganze speicherverwaltung kümmern... bei Objekten und OL übernimmt das die VCL für dich (zum grossen teil) |
|
 |
|
|
|
| |
| DeddyH |
#12| Verfasst am: 30.08.2008, 11:49 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 8.311 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
Das scheint ja eben nicht Sinn der Aufgabe zu sein. Ich würde zunächst mal bei den Records bleiben und diese per Bubblesort sortieren (man kann ja da gleich die entsprechenden Kriterien auswerten). |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
If a train station is where the train stops, what the hell is a workstation? |
 |
|
|
|
| |
| zarcaphii |
#13| Verfasst am: 30.08.2008, 12:01 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 07.06.2008 Turbo Delphi für Win32

|
@grenzgaenger:
Auch wenn die OjectList im "späteren Leben" wirklich praktisch ist, man sollte sowas auch mal von Hand gemacht haben. Der Aufwand ist ja durchaus überschaubar.
Ich nehme außerdem an ,dass du auch davon ausgehst, dass mr_ noch keine nennenswerten Erfahrungen mit OOP hat (immerhin schreibst du ihm ja sogar die creates mit auf).
OOP sollte man ebenfals grundlegender beigebracht bekommen als "Mach mal 'MyXY:=XY.create', dann funktioniert das.".
@DeddyH:
Wieso Bubblesort? |
 |
 |
|
|
|
| |
| DeddyH |
#14| Verfasst am: 30.08.2008, 12:08 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 8.311 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
| zarcaphii hat folgendes geschrieben: | Wieso Bubblesort?  |
Weil der am Einfachsten zu verstehen ist. |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
If a train station is where the train stops, what the hell is a workstation? |
 |
|
|
|
| |
| zarcaphii |
#15| Verfasst am: 30.08.2008, 12:15 Titel: Re: Unterprogramm zum Sortieren |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 24 angemeldet: 07.06.2008 Turbo Delphi für Win32

|
Gut, das stimmt natürlich.
Je nachdem wie gut es klappt könnte er ja beides einbauen |
 |
 |
|
|
|
 | |