![]() |
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:
/edit: @alcaeus Hab doch glatt vergessen, den Code zu posten :oops: Soll nich wieder vorkommen!
////////////////////////////////////////////////////////////
//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; |
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 |
Re: Fehler im Sortier-Algorythmus
Wenn ich aber
Delphi-Quellcode:
eingebe bleibt die zweite Listbox leer! :?
n:=tstr.count-1
|
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 |
Re: Fehler im Sortier-Algorythmus
Hab den Code jetzt oben, in meinen ersten Beitrag reingepackt. Es ist eine Prozedure, die folgendes tut:
Hoffe, ich habe alle Klarheiten beseitigt :wink: |
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: ![]() |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
IMHO ist hier der Fehler:
Delphi-Quellcode:
Deine Liste hat 7 Einträge, diese sind von 0-6 durchnummeriert. Also müsste der Code so lauten:
n:=tstr.Count;
for Zaehler1 := n downto 2 do for Zaehler2 := 1 to Zaehler1-1 do
Delphi-Quellcode:
Bei der 2. Schleife bin ich mir nicht ganz sicher, aber bei der ersten ist 100%ig der Indexfehler drin.
n:=tstr.Count-1;
for Zaehler1 := n downto 1 do for Zaehler2 := 0 to Zaehler1-1 do Greetz alcaeus [add] Zitat:
Zitat:
[/add] |
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 |
Re: Fehler im Sortier-Algorythmus
Hi Martin,
Zitat:
Greetz alcaeus |
Re: Fehler im Sortier-Algorythmus
Zitat:
![]() Und als Erweiterung zu dieser Basisklasse:
Delphi-Quellcode:
Und nun die Anwendung:
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;
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 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz