[Delphi] Bubblesort - Programmieralgorithmus
Hey Leute,
Hab ein Problem:
Wir sollen Bubblesort in Delphi programmieren. Also ich habe da was geschrieben, bekomme aber einen Error. Kann mir einer von euch sagen, warum ?
Es geht um eine Liste, die Wettkampfkarten ( bei den Bundesjugendspielen z.B.) speichert. Der Benutzer des anschließenden Programms soll sich aussuchen können, nach welchen Kriterien er die Karten sortiert haben will.
Erstmal zum Problem:
siehe Bild
Das Sorting besteht aus 2 Prozeduren:
1) SortiereNach
2) Sortierschritt
Das ist deshalb so, weil wir dann quasi für insert sort und selection sort, die wir dann auch noch programmieren wollten, nur noch den Sortierschritt ändern müssten. Der Code für SortiereNach sieht folgendermaßen aus und ist ( sollte ) bei allen drei Verfahren derselbe sein:
So, das, was Bubblesort werden sollte, habe ich hier probiert:
Hab ein Problem:
Wir sollen Bubblesort in Delphi programmieren. Also ich habe da was geschrieben, bekomme aber einen Error. Kann mir einer von euch sagen, warum ?
Es geht um eine Liste, die Wettkampfkarten ( bei den Bundesjugendspielen z.B.) speichert. Der Benutzer des anschließenden Programms soll sich aussuchen können, nach welchen Kriterien er die Karten sortiert haben will.
Erstmal zum Problem:
siehe Bild
Das Sorting besteht aus 2 Prozeduren:
1) SortiereNach
2) Sortierschritt
Das ist deshalb so, weil wir dann quasi für insert sort und selection sort, die wir dann auch noch programmieren wollten, nur noch den Sortierschritt ändern müssten. Der Code für SortiereNach sieht folgendermaßen aus und ist ( sollte ) bei allen drei Verfahren derselbe sein:
|
|
Quellcode |
1 2 3 4 5 6 7 |
procedure Wettkampfliste.sortiereNach(pKriterium:integer); begin hatSortierteListe:=Wettkampfliste.init; while self.Laenge > 0 do self.sortierSchritt(pKriterium); self.HaengeListeAn(hatSortierteListe); hatSortierteListe.GibFrei; end; |
So, das, was Bubblesort werden sollte, habe ich hier probiert:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
procedure Wettkampfliste.sortierSchritt(pKriterium:integer);
var x, y, t: Wettkampfkarte;
begin
repeat
self.zumAnfang;
t:=self.AktuelleKarte;
while self.istDahinter=false do
begin
x:=self.AktuelleKarte;
self.vor;
y:=self.AktuelleKarte;
if x.Punkte(pKriterium) > y.Punkte(pKriterium) then
begin
t:=x;
x:=y;
y:=t;
end;
end;
until t=self.AktuelleKarte;
// Ist notwendig wegen dem Sortiere Nach
self.zumAnfang;
while self.istDahinter=false do
begin
hatSortierteListe.haengeAn(self.AktuelleKarte);
self.entferneAktuelles;
end;
end;
|
str8fwd.de - coming next winter
Ich sehe da kein Fehler im für uns alle sichtbaren Code - ich befürchte, das der Teufel wohl eher im Detail steckt, also in den Funktionen selber.
Eine EAccessViolation kann auch durch fehlerhaftes Handling mit Objekten ausgelöst werden zB weiß ich nicht was hatSortierteListe:=Wettkampfliste.init;/.GibFrei oder was Wettkampfkarte genau sein soll usw.
Könntest du mal das ganze Projekt hochladen?
Eine EAccessViolation kann auch durch fehlerhaftes Handling mit Objekten ausgelöst werden zB weiß ich nicht was hatSortierteListe:=Wettkampfliste.init;/.GibFrei oder was Wettkampfkarte genau sein soll usw.
Könntest du mal das ganze Projekt hochladen?
...
Ja, also ich habe den Fehler behoben, nur weiss ich nicht wie. Das ganze hat sich irgendwie gelöst, als ich mal eine andere Struktur von Bubblesort genommen habe.
Beim ersten reiche ich ja die schwächsten nach hinten durch. Bei der jetzigen Lösung reiche ich die besten von hinten nach vorne. Also quasi genau umgekehrt. Außerdem habe ich einige Veränderungen am Code vorgenommen. Ist jetzt um einiges Lesbarer.
Das Projekt habe ich auch angehangen.
Hier ist der Code:
1. Wie gehabt die Prozedur SortiereNach:
2. Der eigentliche Bubblesort Sortierschritt:
3. Neu hinzugekommen sind zwei Prozeduren, die der Sortierschritt benötigt:
a) Der Auftrag vertausche mit Vorgaenger:
b) Die Anfrage nach dem Vorgaenger:
so funzt es zumindest. Ich habe es trotzdem mal angehangen, falls du es mal ausprobieren willst. Da ist das ganze Programm drin.
mfg Shin
Beim ersten reiche ich ja die schwächsten nach hinten durch. Bei der jetzigen Lösung reiche ich die besten von hinten nach vorne. Also quasi genau umgekehrt. Außerdem habe ich einige Veränderungen am Code vorgenommen. Ist jetzt um einiges Lesbarer.
Das Projekt habe ich auch angehangen.
Hier ist der Code:
1. Wie gehabt die Prozedur SortiereNach:
|
|
Quellcode |
1 2 3 4 5 6 7 |
procedure Wettkampfliste.sortiereNach(pKriterium:integer); begin hatSortierteListe:=Wettkampfliste.init; while self.laenge > 0 do self.sortierSchritt(pKriterium); self.haengeListeAn(hatSortierteListe); hatSortierteListe.gibFrei; end; |
2. Der eigentliche Bubblesort Sortierschritt:
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
procedure Wettkampfliste.sortierSchritt(pKriterium:integer);
var done: boolean;
begin
// BubbleSort
repeat
done:=true;
self.zumEnde;
while not self.istAmAnfang do
begin
if self.Vorgaenger.Punkte(pKriterium) < self.AktuelleKarte.Punkte(pKriterium) then
begin
done:=false;
self.vertauscheMitVorgaenger;
end else self.zurueck;
end;
until done;
// Notwendig für SortiereNach
self.zumAnfang;
while not self.istDahinter do
begin
hatSortierteListe.haengeAn(self.AktuelleKarte);
self.entferneAktuelles;
end;
end;
|
3. Neu hinzugekommen sind zwei Prozeduren, die der Sortierschritt benötigt:
a) Der Auftrag vertausche mit Vorgaenger:
|
|
Quellcode |
1 2 3 4 5 6 7 8 |
procedure Wettkampfliste.vertauscheMitVorgaenger; var lHilfe : Wettkampfkarte; begin self.zurueck; lHilfe:=self.AktuelleKarte; self.entferneAktuelles; self.fuegeDahinterEin(lHilfe); end; |
b) Die Anfrage nach dem Vorgaenger:
|
|
Quellcode |
1 2 3 4 5 6 |
function Wettkampfliste.Vorgaenger : Wettkampfkarte; begin self.zurueck; result:=self.AktuelleKarte; self.vor; end; |
so funzt es zumindest. Ich habe es trotzdem mal angehangen, falls du es mal ausprobieren willst. Da ist das ganze Programm drin.
mfg Shin
str8fwd.de - coming next winter


