Autor Beitrag
EvA
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 05.06.05 16:36 
Hallo,

ich möchte 30 Zahlen, die ich untereinander in einem Stringgrid stehen habe, ihrer Größe nach sortiert und im selben Stringgrid wieder ausgegeben haben. Wie muss ich dieses eingeben. Ich habe es schon mit Schleifen versucht und mich auch schon versucht in alle möglichen Internetseiten reinzulesen, habe die Sortierverfahren jedoch nicht verstanden. Wäre nett, wenn mir jemand ein Bsp. geben könnte und es vielleicht auch kurz erklärt. Danke

EvA
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 05.06.05 16:42 
Moin!

Zeig doch mal deinen Code, den du bisher hast. Andernfalls läuft es ja darauf hinaus, dir das Programm zu schreiben. :wink: Und das ist hier nicht ganz so gern gesehen... :D

Ansonsten gibt es hier haufenweise Beiträge zum Thema "Sortieren", einfach mal die Forum-Suche bemühen.

cu
Narses
EvA Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 05.06.05 18:40 
Hallo Narses, das habe ich bis jetzt Zustande gebracht. Die innere Schleife soll die Zahlen immer tauschen, wenn die zweite größer ist als die erste, und die äußere Schleife die innere Schleife immer wieder wiederholen, wobei ich auch nich genau weiss, wie lange ich das machen muss...na ja, hier mal das "Programm", wie gesagt mit 30 Zahlen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.sortieren;
var zeile,durchgaenge:integer;
    speicher: real;
begin
durchgaenge:=0;
REPEAT
zeile:=-1;
 REPEAT
 zeile:=zeile+1;
 IF stringgrid2.Cells[0,zeile]<stringgrid2.Cells[0,zeile+1]
 THEN begin
     speicher:=StrToFloat(stringgrid2.cells[0,zeile]);
     stringgrid2.cells[0,zeile]:=stringgrid2.cells[0,zeile+1];
     stringgrid2.cells[0,zeile+1]:=FloatToStr(speicher);
     end
 UNTIL zeile=29;
durchgaenge:=durchgaenge+1;
UNTIL durchgaenge=1000;

end;


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 05.06.05 18:53 
Das normale StringGrid kann nicht so einfach sortieren. Entweder nimmst du einen Listview oder das TMS StringGrid.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 05.06.05 20:54 
Moin!

user profile iconEvA hat folgendes geschrieben:
das habe ich bis jetzt Zustande gebracht. Die innere Schleife soll die Zahlen immer tauschen, wenn die zweite größer ist als die erste, und die äußere Schleife die innere Schleife immer wieder wiederholen, wobei ich auch nich genau weiss, wie lange ich das machen muss...

Na, ist doch schonmal was. Schau dir mal diesen Thread an, da habe ich schonmal BubbleSort entwickelt. Versuch mal, das auf deinen Code zu "übertragen".

Wenn´s nicht klappt, das Ergebnis hier präsentieren, dann geht´s weiter.

cu
Narses
EvA Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 05.06.05 21:45 
@Narses: So, habe das Programm nochmal ein wenig verbessert, das mit dem Dreieckstausch habe ich ja auch so, bei mir kommt jetzt sogar schon eine Reihenfolge heraus, wenn ich das sortier, aber das Programm sortiert zB die Zahlen 1,400,334,3,2222,20,41,10,60 leider nur wie folgt:
60
400
41
334
3
2222
20
10
1

irgendwie sortiert das Programm die Zahlen nur nach der vordersten Zahl :cry:

Hier noch der Quellcode:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.sortieren;
var zeile,durchgang,speicher:integer;
begin
durchgang:=30;
zeile:=-1;
REPEAT
zeile:=-1;
durchgang:=durchgang-1;
 REPEAT
 zeile:=zeile+1;
 IF stringgrid2.Cells[0,zeile]<stringgrid2.Cells[0,zeile+1]
 THEN begin
     speicher:=StrToInt(stringgrid2.cells[0,zeile]);
     stringgrid2.cells[0,zeile]:=stringgrid2.cells[0,zeile+1];
     stringgrid2.cells[0,zeile+1]:=IntToStr(speicher);
     end
 UNTIL zeile=durchgang;
UNTIL durchgang=0;

end;


EvA

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
EvA Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 05.06.05 21:49 
Noch kurz zur Erklärung:

Jetzt soll das Programm einmal die größte Zahl "nach vorne verschieben", sie danach dann nich mehr benutzen, deshalb die Variable "durchgang" und dann den nächsten Durchlauf starten, bis wieder das größte für die zweite Zeile rauskommt.

Vielleicht kann man meine neuen Überlegungen ja nachvollziehen :wink:

EvA
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 05.06.05 23:58 
Moin!

user profile iconEvA hat folgendes geschrieben:
aber das Programm sortiert zB die Zahlen ... leider nur wie folgt:

Das liegt daran, dass du einen Vergleich auf Zeichenkettenbasis machst, und da ist das nun mal so. :wink:

Du könntest das z.B. so korrigieren:
ausblenden Delphi-Quelltext
1:
IF StrToInt(stringgrid2.Cells[0,zeile]) < StrToInt(stringgrid2.Cells[0,zeile+1])					

Ist aber nicht sonderlich effektiv. Sinnvoller wäre es, wenn du ein Feld mit den Werten füllst und auch sortierst, und nur für die Bildschirmausgabe Werte in das StringGrid einträgst.

Deine "Schleifenkonstruktion" ist auch etwas "abenteuerlich" :wink: Schau dir doch bitte nochmal genau mein Beispiel in dem von mir angegebenen Thread an, vielleicht solltest du deine Schleifen etwas dahingehend "verbessern".

cu
Narses
EvA Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mo 06.06.05 20:14 
Hallo Narses,
ich habe mir jetzt nochmal das Beispiel für das Sortieren von Dir angeguckt. Habe es jetzt auch erstmal mit Namenssortierung wie es auch Method_Man versucht hat, dies ist jetzt dabei rausgekommen, leider funktioniert es noch nicht :(

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button2Click(Sender: TObject);
var zaehler,Nmax,index:integer;
hilf:string;
begin
Nmax:=4;
zaehler := Nmax -1;
  repeat
    index := 1;
    repeat
      if ( stringgrid1.cells[index,0] > stringgrid1.cells[index+1,0] ) then begin
        hilf := stringgrid1.cells[index,0];
        stringgrid1.cells[index,0] := stringgrid1.cells[index+1,0];
        stringgrid1.cells[index+1,0] := hilf;
      end;
      index := index +1;
    until (index > zaehler);
    zaehler := zaehler +1;
  until (zaehler <= 0);
end;


EvA
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 07.06.05 09:48 
Moin!

Immerhin schonmal ein Ergebnis. Allerdings hast du noch drei Fehler im Code:
1. Du hast zaehler erhöht, statt herabzuzählen, das gibt dann eine ziemlich lange Schleife... :wink:
2. Du hast Spaltenindex 0 genommen, das sind normalerweise die Beschriftungen.
3. Du hast Spalte und Zeile in der StringGrid-Indizierung vertauscht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
  const
    SORT_COL = 1;

  var
    zaehler,Nmax,index: Integer;
    hilf:string;
begin
  Nmax:=4;
  zaehler := Nmax -1;
  repeat
    index := 1;
    repeat
      if ( stringgrid1.cells[SORT_COL,index] > stringgrid1.cells[SORT_COL,index+1] ) then begin
        hilf := stringgrid1.cells[SORT_COL,index];
        stringgrid1.cells[SORT_COL,index] := stringgrid1.cells[SORT_COL,index+1];
        stringgrid1.cells[SORT_COL,index+1] := hilf;
      end;
      index := index +1;
    until (index > zaehler);
    zaehler := zaehler -1;
  until (zaehler <= 0);
end;

Ich habe mal diesen Code daraus gemacht und bei mir funktoniert es.

Spezialaufgabe: :wink:
Die Laufweiten der Schleifen sind doch bekannt. Stell also den Algorithmus auf FOR-Schleifen um. Wenn du noch ganz gewagt optimieren willst, dann kannste auch einen Bool (z.B. swapped: Boolean) vor jedem inneren Schleifenlauf auf FALSE setzen und auf TRUE, wenn du Elemente tauschst. Wenn swapped nach einem inneren Lauf immer noch FALSE ist, biste fertig und kannst auch die äußere Schleife verlassen.

cu
Narses

//EDIT: mir fällt grad auf, dass du ja evtl. die Daten zeilenweise im StringGrid haben könntest. Dann ist "Fehler 3" natürlich keiner. :wink: Ich habe die Daten untereinander gesetzt, so dass man besseren Überblick hat.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 08.06.05 16:18 
Moin!

Hier noch die Lösung der letzten "Spezialaufgabe"; für den Fall, dass es jemanden interessiert. :wink:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
  const
    SORT_COL = 1;
  var
    i,j: Integer;
    hilf: String;
    swapped: Boolean;
begin
  for i := StringGrid1.RowCount-2 downto 1 do begin
    swapped := FALSE;
    for j := 1 to i do
      if ( StringGrid1.Cells[SORT_COL,j] > StringGrid1.Cells[SORT_COL,j+1] ) then begin
        hilf := StringGrid1.Cells[SORT_COL,j];
        StringGrid1.Cells[SORT_COL,j] := StringGrid1.Cells[SORT_COL,j+1];
        StringGrid1.Cells[SORT_COL,j+1] := hilf;
        swapped := TRUE;
      end;
    if (NOT swapped) then
      Break;
  end;
end;


cu
Narses