Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler im Sortier-Algorythmus (https://www.delphipraxis.net/31323-fehler-im-sortier-algorythmus.html)

gordon freeman 7. Okt 2004 10:58


Fehler im Sortier-Algorythmus
 
Hi Leute,
ich hab mir nach dem Bubblesort-Verfahren 'nen Algorythmus geschrieben, der Daten sortiert. Die Daten sind in der Form dd-mm-jj in einer Listbox gespeichert. Nun werden sie übernommen. Es wird zuerst das Jahr verglichen, dann der Monat und dann der Tag. Das früheste Datum soll als erstes in der sortierten Listbox erscheinen. Allerdings kommt immer der Fehler:

EStringListError: Das Maximum (7) wird überschritten :cry:

Kann mir einer sagen, wieso?

tia, gordon

Hier der Code:
Delphi-Quellcode:
////////////////////////////////////////////////////////////
//Die Einträge aus dem Übergebenen TString werden sortiert//
//und in die Form10.Listbox2 eingefügt                   //
////////////////////////////////////////////////////////////
procedure TForm10.BubbleSort(tStr:TStrings);
var tag1,monat1,jahr1,n,Zaehler1,Zaehler2:integer;
    tag2,monat2,jahr2:integer;
    tausch,s:string;
begin
n:=tstr.Count;
for Zaehler1 := n downto 2 do
    for Zaehler2 := 1 to Zaehler1-1 do
        begin
        {Das Jahr wird aus 1 herausgeschnitten}
        s:=tstr[Zaehler2];
        delete(s,1,pos('-',s));
        delete(s,1,pos('-',s));
        jahr1:=strtoint(s);

        {Der Monat wird aus 1 herausgeschnitten}
        s:=tstr[Zaehler2];
        delete(s,1,pos('-',s));
        delete(s,pos('-',s),length(s));
        monat1:=strtoint(s);

        {Der Tag wird aus 1 herausgeschnitten}
        s:=tstr[Zaehler2];
        delete(s,pos('-',s),length(s));
        tag1:=strtoint(s);

        {Das Jahr wird aus 2 herausgeschnitten}
        s:=tstr[Zaehler2+1];
        delete(s,1,pos('-',s));
        delete(s,1,pos('-',s));
        jahr2:=strtoint(s);

        {Der Monat wird aus 2 herausgeschnitten}
        s:=tstr[Zaehler2+1];
        delete(s,1,pos('-',s));
        delete(s,pos('-',s),length(s));
        monat2:=strtoint(s);

        {Der Tag wird aus 2 herausgeschnitten}
        s:=tstr[Zaehler2+1];
        delete(s,pos('-',s),length(s));
        tag2:=strtoint(s);

        if jahr1 > jahr2 then //Ist Jahr 1 Später als 2
           begin             //Ja, sie werden getauscht
           tausch:=tStr[Zaehler2];
           tStr[Zaehler2]:=tStr[Zaehler2+1];
           tStr[Zaehler2+1]:=tausch;
           end
        else                 //Nein, Jahr 2 ist Später oder gleich 1
            begin
            if jahr1 = jahr2 then //Sind die Jahre gleich
               begin             //Ja
               if monat1 > monat2 then //Ist Monat 1 größer als 2
                  begin               //Ja, sie werden getauscht
                  tausch:=tStr[Zaehler2];
                  tStr[Zaehler2]:=tStr[Zaehler2+1];
                  tStr[Zaehler2+1]:=tausch;
                  end
               else                   //Nein, Monat 2 ist später oder gleich 1
                   begin
                   if monat1 = monat2 then //Sind die Monate gleich
                      begin                //Ja
                      if tag1 > tag2 then  //Ist Tag 1 später als 2
                         begin             //Ja, siw werden getauscht
                         tausch:=tStr[Zaehler2];
                         tStr[Zaehler2]:=tStr[Zaehler2+1];
                         tStr[Zaehler2+1]:=tausch;
                         end;
                      end;
                   end;
               end;
            end;
        end;
Form10.ListBox2.Items:=tstr;
end;
/edit: @alcaeus Hab doch glatt vergessen, den Code zu posten :oops: Soll nich wieder vorkommen!

alcaeus 7. Okt 2004 11:03

Re: Fehler im Sortier-Algorythmus
 
Hi Martin,

du sprengst einfach die Grenzen des StringGrids. Wahrscheinlich läuft deine Schleife bis StringList1.Count anstatt StringList1.Count-1
Aber ohne Code wird das hier nur ein Ratespiel.

Greetz
alcaeus

gordon freeman 7. Okt 2004 13:14

Re: Fehler im Sortier-Algorythmus
 
Wenn ich aber
Delphi-Quellcode:
n:=tstr.count-1
eingebe bleibt die zweite Listbox leer! :?

alcaeus 7. Okt 2004 13:19

Re: Fehler im Sortier-Algorythmus
 
Hi Martin,

wie versprochen, ohne Code wird das ein Ratespiel. Zeig doch bitte mal den Code der Sortierprozedur.

Greetz
alcaeus

gordon freeman 7. Okt 2004 13:27

Re: Fehler im Sortier-Algorythmus
 
Hab den Code jetzt oben, in meinen ersten Beitrag reingepackt. Es ist eine Prozedure, die folgendes tut:
  • Sie verlangt einen TString in diesem Fall betitelt mit "tstr"
  • Die Variable n wird mit tstr.count gleichgesetzt
  • Dann beginnt das Bubblesort-Verfahren
    1) Das erste Datum wird in Jahr, Monat und Tag aufgesplittet
    2) Das zweite Datum wird in Jahr, Monat und Tag aufgesplittet
    3) Wenn Jahr 1 später (also größer) als Jahr 2 ist wird getauscht (Das früheste soll zuerst)
    4) Wenn nicht getauscht wird, wird geprüft, ob die Jahre gleich sind.
    5) Wenn gleich, dann wird das selbe mit den Monaten und ggf. mit den Tagen gemacht.
    6) Als letztes wird die TStrings-Variable noch an Listbox2 übergeben und angezeigt.

Hoffe, ich habe alle Klarheiten beseitigt :wink:

shmia 7. Okt 2004 13:35

Re: Fehler im Sortier-Algorythmus
 
Dein Progammcode sieht stark nach Spaghetti aus. :zwinker:
1.) BubbleSort ist eines der schlechtesten Sortierverfahren; verwende lieber Quicksort
2.) du musst den Sortieralgorythmus von den Daten trennen.
Dazu gibt es einen Artikel in der Code-Library:
Basisklasse für Sortieralogorythmen

alcaeus 7. Okt 2004 13:37

Re: Fehler im Sortier-Algorythmus
 
Hi Martin,

IMHO ist hier der Fehler:
Delphi-Quellcode:
n:=tstr.Count;
for Zaehler1 := n downto 2 do
  for Zaehler2 := 1 to Zaehler1-1 do
Deine Liste hat 7 Einträge, diese sind von 0-6 durchnummeriert. Also müsste der Code so lauten:
Delphi-Quellcode:
n:=tstr.Count-1;
for Zaehler1 := n downto 1 do
  for Zaehler2 := 0 to Zaehler1-1 do
Bei der 2. Schleife bin ich mir nicht ganz sicher, aber bei der ersten ist 100%ig der Indexfehler drin.

Greetz
alcaeus

[add]
Zitat:

Zitat von shmia
1.) BubbleSort ist eines der schlechtesten Sortierverfahren; verwende lieber Quicksort

Und was wenn er BubbleSort implementieren muss (z.B. Schule)? Wenn er Bubblesort verwenden will, dann bitte.

Zitat:

Zitat von shmia
2.) du musst den Sortieralgorythmus von den Daten trennen.

IMHO ist das in diesem Fall nicht so leicht möglich, da er ja nicht nur 2 Zahlen vergleichen muss, sondern zuerst mal die Einträge auseinanderpflücken und anschließend vergleichen muss.
[/add]

gordon freeman 7. Okt 2004 13:45

Re: Fehler im Sortier-Algorythmus
 
@ shmia:
Danke für die Klasse, aber ich glaube BubbleSort reicht mir. Aber wie soll ich die Daten von dem Sortier-Algo trennen. Es muss doch jedes neue Datum aufgrund der Werte von Zaehler2 ausgelesen und in seine Bestandteile zerlegt werden (Jahr, Monat, Tag), wie sollte das anders gehen?


@ alcaeus
Habs jetzt geändert, so wie du geschrieben hast. Jetzt wird bei mir allerdings gar keine Liste ausgegeben... :wall:

Bin für jede Hilfe dankbar, gordon

alcaeus 7. Okt 2004 14:02

Re: Fehler im Sortier-Algorythmus
 
Hi Martin,

Zitat:

Zitat von gordon freeman
Habs jetzt geändert, so wie du geschrieben hast. Jetzt wird bei mir allerdings gar keine Liste ausgegeben... :wall:

wenn du mir noch ein Beispiel für einen Listeneintrag geben könntest, dann werde ich mir deinen Code im Laufe des Nachmittags mal genauer ansehn und ihn durchtesten. Im Moment hab ich aber keine Zeit dafür.

Greetz
alcaeus

shmia 7. Okt 2004 14:58

Re: Fehler im Sortier-Algorythmus
 
Zitat:

Zitat von alcaeus
Zitat:

Zitat von shmia
2.) du musst den Sortieralgorythmus von den Daten trennen.

IMHO ist das in diesem Fall nicht so leicht möglich, da er ja nicht nur 2 Zahlen vergleichen muss, sondern zuerst mal die Einträge auseinanderpflücken und anschließend vergleichen muss.

Das wird in Basisklasse für Sortieralogorythmen erklärt.
Und als Erweiterung zu dieser Basisklasse:

Delphi-Quellcode:
   TSortStringGrid = class(TSortBaseClass)
   protected
      function Compare(Index1, Index2: Integer): Integer;override;
      procedure Exchange(Index1, Index2: Integer);override;
   public
      AGrid : TStringGrid;
   end;

function TSortStringGrid.Compare(Index1, Index2: Integer): Integer;
begin
   // Hier ist die Stelle, an der der Vergleich durchgeführt wird
   // in diesem Beispiel wird nur die 1. Spalte zum Vergleich herangezogen
   Result := CompareText(AGrid.Cells[1, Index1], AGrid.Cells[1, Index2]);
end;

procedure TSortStringGrid.Exchange(Index1, Index2: Integer);
var
   tmp : TStringList;
begin
   // Vertauschen 2. Rows im StringGrid
   tmp := TStringList.Create;

   tmp.Assign(AGrid.Rows[Index1]);
   AGrid.Rows[Index1] := AGrid.Rows[Index2];
   AGrid.Rows[Index2].Assign(tmp);
   tmp.Free;
end;
Und nun die Anwendung:
Delphi-Quellcode:
var
   sg : TSortStringGrid;
begin
   sg := TSortStringGrid.Create;
   sg.AGrid := StringGrid1;
//   sg.QuickSort(1, StringGrid1.RowCount-1);
   sg.BubbleSort(1, StringGrid1.RowCount-1);
   sg.Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:02 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