Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

Shin Ryu

Routinier

Dabei seit: 23.03.2003

Beiträge: 467

 

1 Zum Seitenanfang

Samstag, 29. Oktober 2005, 17:22

[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:

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;
»Shin Ryu« hat folgendes Bild angehängt:
  • Unbenannt.jpg
str8fwd.de - coming next winter
 

† Luna †

Doppel-As

Dabei seit: 10.04.2005

Beiträge: 117

 

2 Zum Seitenanfang

Montag, 31. Oktober 2005, 13:00

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?
...
 

Shin Ryu

Routinier

Dabei seit: 23.03.2003

Beiträge: 467

 

3 Zum Seitenanfang

Montag, 31. Oktober 2005, 22:19

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:

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
»Shin Ryu« hat folgende Datei angehängt:
str8fwd.de - coming next winter