Delphi Problem mit Bubblesort-Sortierfunktion

Br0t

Lieutenant
Registriert
Sep. 2006
Beiträge
799
Hey Leute,
Ich hätte da mal eine Frage. Ich habe versucht ein Programm zu schreiben, bei dem mit einem Button ein Array mit zufälligen Zahlen belegt wird. Diese werden dann in eine Memobox eingetragen. Soweit alles gut.

Jetzt möchte ich aber, dass ein 2. Button mithilfe von Bubblesort das Array sortiert und anschließend wieder in die Memo überträgt.
Eigentlich habe ich dabei doch keinen Fehler gemacht oder? Ich sehe zumindest keinen... Auf jeden Fall spuckt er mir das Array immer wieder unverändert aus, wie er es vorher generiert hat...

Code:
unit UgenerateSort;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    bZahlen: TButton;
    bSort: TButton;
    mStrings: TMemo;
    procedure bZahlenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure bSortClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Tausche(a,b: Integer);
  end;

var
  Form1: TForm1;
  a : array[0..12] of Integer;
  i,j: Integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;        // Initialisierung der Randomfunktion
end;

procedure TForm1.Tausche(a,b: Integer); //Tauschprozedur
var Tausch: Integer;
begin
  Tausch := a;
  a := b;
  b := Tausch;
end;

procedure TForm1.bZahlenClick(Sender: TObject); //Prozedur zum Generieren der
var z: Integer;                                 // Felder des Arrays "a"
begin
  for z:=0 to 12 do
    begin
      a[z]:= random(100);
    end;
  for z:=0 to 12 do
      mStrings.Lines.Add(IntToStr(a[z]));
end;


procedure TForm1.bSortClick(Sender: TObject);  // Bubblesort Sortierfunktion
begin
  for i:=0 to 11 do
    for j:=0 to (12-i) do
      begin
        if a[j] > a[j+1] then
         begin
          Tausche(a[j],a[j+1]);
         end;
      end;

  mStrings.Clear;
  for i:=0 to 12 do
  mStrings.Lines.Add(IntToStr(a[i]));

end;

end.

Ich wäre sehr dankbar, wenn ihr mal drüberschauen könntet :). Wahrscheinlich ist es ein offensichtlicher Fehler, aber es ist auch das erste Mal, dass ich was mit Bubblesort programmiere, also evtl ein Systematikfehler...

MfG Br0t :) :D
 
so wie ich das sehe liegt das problem beim tauschen:

Tausche(a[j],a[j+1]);

durch diesen aufruf weist du ja den elementen im array meiner meinung nach nichts zu ... ich hab zwar nun länger nix mehr mit delphi gemacht aber wenn ich mich nicht täusche musst du die getauschten werte noch den werten in dem array (oder einem neuen array) zuweisen ...
 
Code:
          Tausche(a[j],a[j+1]);
Code:
  Tausch := a;
  a := b;
  b := Tausch;
Wenn ich das richtig sehe, tauscht du da nicht die Zellen im Array aus, sondern nur daraus kopierte Werte. Außerdem kommst du da mit den Variablennamen durcheinander (du hast einen Integer a und ein Integer-Array a)...

Versuch mal folgende Implementation von Tausche:
Code:
procedure TForm1.Tausche(i,j: Integer); //i,j: Indizes
var Tausch: Integer;
begin
  Tausch := a[i];
  a[i] := a[j];
  a[j] := Tausch;
end;
Der Aufruf muss natürlich entsprechend angepasst werden:
Code:
Tausche(j,j+1);
 
Hi. Einen Systematikfehler kann ich nicht erkennen. Das Problem ist ich kenn mich in Delphi nicht aus. Weißt du vielleicht wie die Werte übergeben werden. Wenn es nämlich Call by Value ist dann kannst du mit deiner Methode "Tausche" das Array nicht verändern.

:edit: Bin ein bißchen spät dran. :D
 
Sodale. ^^ Sorry musste gestern relativ viel schaffen hatte keine Zeit mehr um an den PC zu gehen.
Also ich habe das mal ausprobiert mit den Indizes tauschen --> Programm geht immer noch nicht. Danach habe ich versucht einfach mal x&y als parameter der prozedur zu wählen --> geht immer noch nicht....

Langsam fange ich an dieses kleine Programm zu hassen! :D

EDIT: @1668mib: Habe ich das Tut richtig verstanden, dass eine Call by Reference Funktion nur einen Parameter in dieser Klammer drin haben darf und das muss das Endergebnis sein? Weil ich muss ja 2 Werte übergeben.... Das ist irgendwie doof...

EDIT2: Ich verstehe das nicht wirklich. Das Programm hängt sich immer sofort auf,sobald ich auf den Sortieren Button drücke....
 
Zuletzt bearbeitet:
Sodale. ^^ Sorry musste gestern relativ viel schaffen hatte keine Zeit mehr um an den PC zu gehen.
Also ich habe das mal ausprobiert mit den Indizes tauschen --> Programm geht immer noch nicht. Danach habe ich versucht einfach mal x&y als parameter der prozedur zu wählen --> geht immer noch nicht....

Langsam fange ich an dieses kleine Programm zu hassen! :D

EDIT: @1668mib: Habe ich das Tut richtig verstanden, dass eine Call by Reference Funktion nur einen Parameter in dieser Klammer drin haben darf und das muss das Endergebnis sein? Weil ich muss ja 2 Werte übergeben.... Das ist irgendwie doof...

EDIT2: Ich verstehe das nicht wirklich. Das Programm hängt sich immer sofort auf,sobald ich auf den Sortieren Button drücke....

EDIT3: Ich habe eine Frage zu dem Vorschlag mit den zu tauschenden Indizes:

Wir haben diesen Code:
Code:
  Tausche(j,j+1);

Aber er kann diese beiden doch gar nicht tauschen, da dann j verändert würde und j ist die Zählervariable oder??
 
Also:

Ich habs mal programmiert ;)
Bei mir klappt es auf diese Art:
Code:
unit UMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  a : array[0..12] of integer;

procedure Tausche(var a,b : integer);
var u : integer;
begin
  u := a;
  a := b;
  b := u;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  for I := 0 to 12 do
    begin
      a[i] := random(100);
      memo1.Lines.add(inttostr(a[i]));
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j : integer;
begin
  for i:=0 to 12 do
    for j:=0 to (12-i) do
      begin
        if a[j] > a[j+1] then
          begin
            Tausche(a[j],a[j+1]);
          end;
      end;

  Memo1.Clear;
  for i:=0 to 12 do
    memo1.Lines.Add(IntToStr(a[i]));


end;

procedure TForm1.FormShow(Sender: TObject);
begin
  randomize;
end;

Also du solltest erstmal achten, immer lokale Variablen zu nehmen, sonst können mehr fehler passieren, war jetz nicht der fall aber trotzdem^^

Dann würd ich die prozedur im interface-Teil nicht unbedingt deklarieren, sondern vor der Prozedur, die Tausche benötigt stellen.

Hab mal alles angehängt

P.S.:
Code:
  for i:=0 to [B]12[/B] do
    for j:=0 to (12-i) do
      begin
        if a[j] > a[j+1] then
          begin
            Tausche(a[j],a[j+1]);
          end;
      end;
 

Anhänge

Zuletzt bearbeitet: (Anhang hinzugefügt)
Heeey :) Ich danke dir ^^
Es funktioniert sogar ^^ aber ich habe eine Frage(weniger mit dem Thema zusammenhängend) Welche Delphi-Version benutzt du? Weil ich mag das Icon von deiner *.exe-Datei ;)

MfG Br0t
 
Zurück
Oben