AGB  ·  Datenschutz  ·  Impressum  







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

Fehler im Sortier-Algorythmus

Ein Thema von gordon freeman · begonnen am 7. Okt 2004 · letzter Beitrag vom 7. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#1

Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 11:58
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

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 Soll nich wieder vorkommen!
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 12:03
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 14:14
Wenn ich aber n:=tstr.count-1 eingebe bleibt die zweite Listbox leer!
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 14:19
Hi Martin,

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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 14:27
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 14:35
Dein Progammcode sieht stark nach Spaghetti aus.
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#7

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 14:37
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 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 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]
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 14:45
@ 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...

Bin für jede Hilfe dankbar, gordon
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#9

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 15:02
Hi Martin,

Zitat von gordon freeman:
Habs jetzt geändert, so wie du geschrieben hast. Jetzt wird bei mir allerdings gar keine Liste ausgegeben...
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: Fehler im Sortier-Algorythmus

  Alt 7. Okt 2004, 15:58
Zitat von alcaeus:
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;
Andreas
  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 11:47 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