Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Prism Min-Sort Verfahren (https://www.delphipraxis.net/103852-min-sort-verfahren.html)

delphi_master 22. Nov 2007 18:09


Min-Sort Verfahren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute
Ich brauche dringend hilfe in der Schule müssen wir als Hausübung Zuffalsgenerierte Zahlen in einem memo ausgeben und dies dann sortiert in einem zweiten ausgeben. Das ganze soll mit dem Min - Sort Verfahren geschehen doch leider habe ich keine Ahnung wie das gehen soll :gruebel: !!! Könnt ihr mir bitte helfen :?: Ich habe den Arbeitsauftrag per email bekommen (ich häng in euch an )

guidok 22. Nov 2007 18:23

Re: Min-Sort Verfahren
 
Naja, steht doch im Text, oder?

Suche in deinem Array den kleinsten Wert und schreibe ihn an die erste Stelle in der Ausgabeliste. Danach suchst du aus dem verbleibenden Rest, den kleinsten Wert und schreibst ihn an die nächste Stelle in der Ausgabeliste, usw.

DP-Maintenance 22. Nov 2007 18:25

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Sonstige Fragen zu Delphi" verschoben.
Hier gehören nur funktionierende Code-Snippets hinein.

quendolineDD 22. Nov 2007 18:44

Re: Min-Sort Verfahren
 
Schaut man mal über Google, wie der Sortieralgorithmus funktioniert bekommt man sogar bei Wikipedia den fertigen Pascal-Code :-P

Delphi-Quellcode:
{ MinSort, als eine Variante von SelectionSort }
{ Uebergabe: Zu sortierendes Array, das an den Stellen 1 bis n mit natuerlichen Zahlen belegt ist }
Procedure MinSort(Var Feld: Array Of LongInt);
Var
  i, j    : LongInt; { Zaehlvariablen }
  Temp, Min: LongInt; { Zwischenspeicher, Minimum }
Begin
  For i := 0 To High(Feld) Do Begin
    Min := i;
    For j := i + 1 To High(Feld) Do
      If Feld[j] < Feld[Min] Then Min := j;
    Temp := Feld[Min];
    Feld[Min] := Feld[i];
    Feld[i] := Temp;
  End;
End; { Procedure MinSort }
Hab ihn nicht getestet, dürfte aber korrekt sein.

Wenn zum Beispiel in Edit1 die Länge des Arrays (Anzahl dessen Felder) eingegben werden soll, dann geht das wie folgt:

Delphi-Quellcode:
iArray = array of integer;
und im Quelltext:

Delphi-Quellcode:
if TryStrToInt(Edit1.Text, x) then begin
setlength(iArray, x);
for i := 0 to x do iArray[i] := Random(100)
else
ShowMesage('Fehlerhafte Eingabe. +'Edit1.Text'+ entspricht keinem Integer!');
end;
Vergiss nicht in der FormCreate Randomize; aufzurufen um den Zufallsgenerator zu initialisieren.

grenzgaenger 23. Nov 2007 18:08

Re: Min-Sort Verfahren
 
Zitat:

Zitat von guidok
Naja, steht doch im Text, oder?

Suche in deinem Array den kleinsten Wert und schreibe ihn an die erste Stelle in der Ausgabeliste. Danach suchst du aus dem verbleibenden Rest, den kleinsten Wert und schreibst ihn an die nächste Stelle in der Ausgabeliste, usw.

sag mal, ist das nicht der selectionsort?? :roll:

quendolineDD 23. Nov 2007 18:10

Re: Min-Sort Verfahren
 
Jap und zum Selectionsort gehören auch Min- und Maxsort :)

grenzgaenger 23. Nov 2007 18:23

Re: Min-Sort Verfahren
 
Zitat:

Zitat von quendolineDD
Jap und zum Selectionsort gehören auch Min- und Maxsort :)

nicht dass ich wüsste. das asc/dsc gibt ja nur die sortierrichtung an... ist aber kein eigenständiges sortierverfahren...

GreenHorn3600 23. Nov 2007 19:04

Re: Min-Sort Verfahren
 
Mal 'n wenig QällKot spendier:
Delphi-Quellcode:
unit a_scheiss;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    za: array [1 .. 20] of integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i,x,y: integer;
begin
  memo1.Clear; memo2.Clear;
  for I := 1 to 20 do za[i] := i;
  for I := 1 to 20 do
  begin
    x := random(20-i)+1;
    y := za[i];
    za[i] := za[x];
    za[x] := y;
  end;
  for i := 1 to 20 do
    memo1.Lines.Add(inttostr(za[i]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,m,x: integer;
begin
  for I := 1 to 20 do
  begin
    x := i;
    for j := i+1 to 20 do
      if za[x] > za[j] then
        x := j;
      begin
        m := za[x];
        za[x] := za[i];
        za[i] := m;
      end;
    memo2.Lines.Add(inttostr(za[i]));
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  close;
end;

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

end.
Delphi-Quellcode:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'A Scheiß'
  ClientHeight = 216
  ClientWidth = 335
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 4
    Top = 6
    Width = 75
    Height = 25
    Caption = 'erzeuge'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 4
    Top = 32
    Width = 75
    Height = 25
    Caption = 'max sort'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 4
    Top = 58
    Width = 75
    Height = 25
    Caption = 'close'
    TabOrder = 2
    OnClick = Button3Click
  end
  object Memo1: TMemo
    Left = 83
    Top = 0
    Width = 122
    Height = 213
    Lines.Strings = (
      'Memo1')
    TabOrder = 3
  end
  object Memo2: TMemo
    Left = 206
    Top = 0
    Width = 123
    Height = 213
    Lines.Strings = (
      'Memo2')
    TabOrder = 4
  end
end
//Edit: mal nachgelesen hab

quendolineDD 26. Nov 2007 19:30

Re: Min-Sort Verfahren
 
Zitat:

Zitat von grenzgaenger
Zitat:

Zitat von quendolineDD
Jap und zum Selectionsort gehören auch Min- und Maxsort :)

nicht dass ich wüsste. das asc/dsc gibt ja nur die sortierrichtung an... ist aber kein eigenständiges sortierverfahren...

Zitat:

Zitat von Wikipedia
Der Begriff Sortierlese oder Selection-Sort (englisch selection »Auswahl«, to sort »sortieren«), auch MinSort (von Minimum) bzw. MaxSort (von Maximum), Selectsort oder ExchangeSort (AustauschSort) genannt, bezeichnet einen naiven Sortieralgorithmus, der in-place arbeitet und in seiner Grundform instabil ist, wobei er sich auch stabil implementieren lässt. Die Komplexität von SelectionSort ist, in der Landau-Notation ausgedrückt, O(n2).

http://de.wikipedia.org/wiki/Selectionsort
Ganz oben, die Erläuterung. Ich beziehe mich darauf.

cobi23 4. Mär 2013 10:54

AW: Min-Sort Verfahren
 
Hallo,

ich wollte das auch mal ausprobieren, aber bei mir kommt irgendwie immer ein Fehler. Könnt ihr mir dabei helfen?
:?:
Code:
unit USelect;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    za: array [1..20] of integer;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i,x,y:Integer;
  begin
    memo1.Clear; memo2.Clear;
    for I:= 1 to 20 do za[i] :=i;
    for I:= 1 to 20 do
    begin
      x:=Random(20-i)+1;
      y:=za[i];
      za[i]:=za[x];
      za[x]:=y;
      for i:= 1 to 20 do
      memo1.Lines.Add(inttostr(za[i]));
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j,m,x:integer;
  begin
  for I:= 1 to 20 do
  begin
    x:=i;
    for j:=i+1 to 20 do
    if za[x] > za[j] then
    x:=j;
    begin
      m:=za[x]
      za[x] := za [i];
      za[i] := m;
      end;
    memo2.Lines.Add(inttostr(za[i]));
    end;
  end;
end;

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

end.
Bei mir erscheint dann "uselect.pas(57,12) Error: Illegal assignment to for-loop variable "i" "
Ich verstehe da nicht was von mir verlangt wird.

p80286 4. Mär 2013 11:00

AW: Min-Sort Verfahren
 
Zitat:

Zitat von cobi23 (Beitrag 1205836)
Hallo,

ich wollte das auch mal ausprobieren, aber bei mir kommt irgendwie immer ein Fehler. Könnt ihr mir dabei helfen?

Würdest Du uns auch verraten welche Fehlermeldung?

Gruß
K-H

gammatester 4. Mär 2013 11:23

AW: Min-Sort Verfahren
 
Da Pascal keinen Unterschied zwischen i und I macht, benutzt du in
Delphi-Quellcode:
for i:= 1 to 20 do
memo1.Lines.Add(inttostr(za[i]));
den äußeren Schleifenindex doppelt. Nimm einfach ein anderen zB k (der dann natürlich deklariert werden muß).

cobi23 4. Mär 2013 11:48

AW: Min-Sort Verfahren
 
Danke für die Antwort, jetzt kommt aber bei mir diese Fehlermeldung:

"uselect.pas(73,7) Fatal: Syntax error, ";" expected but "identifier ZA" found
"

Code:
unit USelect;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    za: array [1..20] of integer;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i,x,y,k:Integer;
  begin
    memo1.Clear; memo2.Clear;
    for I:= 1 to 20 do za[i] :=i;
    for I:= 1 to 20 do
    begin
      x:=Random(20-i)+1;
      y:=za[i];
      za[i]:=za[x];
      za[x]:=y;
      for k:= 1 to 20 do
      memo1.Lines.Add(inttostr(za[i]));
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j,m,x:integer;
  begin
  for I:= 1 to 20 do
  begin
    x:=i;
    for j:=i+1 to 20 do
    if za[x] > za[j] then
    x:=j;
    begin
      m:=za[x]
      za[x] := za [i];
      za[i] := m;
      end;
    memo2.Lines.Add(inttostr(za[i]));
    end;
  end;
end;

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

end.

CCRDude 4. Mär 2013 12:11

AW: Min-Sort Verfahren
 
In dem Fall sagt die Meldung doch schon, was Sache ist :)
Warum wird in der Zeile wohl ein Semikolon erwartet?
Kurzer Blick in die Zeile davor...

cobi23 4. Mär 2013 12:56

AW: Min-Sort Verfahren
 
Oh, mein Fehler. Danke das du mich darauf hingewiesen hast. Das Programm funktioniert, aber leider kommen bei dem Memo-Feld für die Zahlen immer die gleichen Zahlen. Und wenn ich auf das Button für das Ordnen der Zahlen drücke, kommen unterschiedliche Zahlen heraus.


Code:
unit USelection;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    za: array [1..100] of integer;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,x,y,k:integer;
begin
  memo1.Clear; memo2.Clear;
  for I:=1 to 100 do za[i]:=i;
  for I:=1 to 100 do
  begin
    x:=Random(100-i)+1;
    y:=za[i];
    za[x]:=y;
    for k:=1 to 100 do
    memo1.Lines.Add(IntToStr(za[i]));
  end;

end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j,m,x:integer;
begin
  for I:=1 to 100 do
  begin
    x:=i;
    for j:=i+1 to 100 do
    if za[x] > za[j] then
    x:=j;
    begin
    m:=za[x];
    za[x]:=za[i];
    za[i]:=m;
    memo2.lines.Add(inttostr(za[i]));
    end;
  end;

end;

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

end.
Könnt ihr mir bitte helfen?:cry:

gammatester 4. Mär 2013 13:23

AW: Min-Sort Verfahren
 
Du mußt natürlich den bemängelten doppelten Index in der gesamten Schleife ersetzen, nicht nur in der for-Anweisung, also:
Delphi-Quellcode:
for k:=1 to 100 do
memo1.Lines.Add(IntToStr(za[k]));

cobi23 4. Mär 2013 14:19

AW: Min-Sort Verfahren
 
Meinst du so?

Code:
unit USelection;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    za: array [1..6] of integer;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,x,y,k:integer;
begin
  memo1.Clear; memo2.Clear;
  for I:=1 to 6 do za[k]:=i;
  for I:=1 to 6 do
  begin
    x:=IntToStr(Random(100)+1);
    y:=za[k];
    za[k]:=y;
    for k:=1 to 6 do
    memo1.Lines.Add(IntToStr(za[k]));
  end;

end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j,m,x:integer;
begin
  for I:=1 to 6 do
  begin
    x:=i;
    for j:=i+1 to 6 do
    if za[x] > za[j] then
    x:=j;
    begin
    m:=za[x];
    za[x]:=za[i];
    za[i]:=m;
    memo2.lines.Add(inttostr(za[i]));
    end;
  end;

end;

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

end.
das programm hat immer noch die selben probleme
auch wenn ich etwas ändere:(

p80286 4. Mär 2013 15:00

AW: Min-Sort Verfahren
 
Ich habe mir einmal erlaubt, Deinen Sourcecode ein wenig zu formatieren:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var i,j,m,x:integer;
begin
  for I:=1 to 6 do begin
    x:=i;
    for j:=i+1 to 6 do
      if za[x] > za[j] then
        x:=j;
    begin
      m:=za[x];
      za[x]:=za[i];
      za[i]:=m;
      memo2.lines.Add(inttostr(za[i]));
    end;
  end;

end;
Da frag ich mich schon was Du erreichen willst.
Übrigens ist Delphi natürlich selbstdokumentierend, aber Kommentare erleichtern die Fehlersuche meist ungemein, vor allem wenn darin steht warum etwas gemacht wird.

Gruß
K-H

cobi23 4. Mär 2013 16:37

AW: Min-Sort Verfahren
 
Ich möchte das so haben:
Mittels einen ersten Button soll im 1.Memo-Feld, die Zufallszahlen generiert werden und mittels einen 2.Button soll in einen 2.Memo diese Zufallszahlen mittels selectionsort geordnet werden.
Mein Problem ist, dass mein Programm beim ersten button-Klick im Memo die gleichen Zufallszahlen erscheinen unzwar alle 100. Im ersten Memo wird dabei in allen Arrays von 1 bis 100 hochgezählt bis es zur 100 angelangt.
Und wenn ich mit den 2.Button die Zahlen sortieren möchte kommt folgende Reihenfolge:

98
98
99
100
100

Und es kommt immer die gleichen zufallszahlen und die gleiche REihenfolge nacht selectionsort.

Das ist wirklich zum verzweifeln.:cry:

Hier noch mal der Quellcode

Code:
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    za: array [1..6] of integer;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,x,y,k:integer;
begin
  memo1.Clear; memo2.Clear;
  for I:=1 to 6 do za[k]:=i;
  for I:=1 to 6 do
  begin
    x:=IntToStr(Random(100)+1);
    y:=za[k];
    za[k]:=y;
    for k:=1 to 6 do
    memo1.Lines.Add(IntToStr(za[k]));
  end;

end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j,m,x:integer;
begin
  for I:=1 to 6 do
  begin
    x:=i;
    for j:=i+1 to 6 do
    if za[x] > za[j] then
    x:=j;
    begin
    m:=za[x];
    za[x]:=za[i];
    za[i]:=m;
    memo2.lines.Add(inttostr(za[i]));
    end;
  end;

end;

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

end.

Ach ja ich benutze Lazarus, ist das der Grund dafür?

DeddyH 4. Mär 2013 16:42

AW: Min-Sort Verfahren
 
Wenn man sich das mal in Ruhe anschaut:
Zitat:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i,x,y,k:integer;
begin
  memo1.Clear; memo2.Clear;
  for I:=1 to 6 do za[k]:=i; //??, wo liegt der Sinn?
  for I:=1 to 6 do
  begin
    x:=IntToStr(Random(100)+1); //IntToStr dürfte gar nicht funktionieren, x ist integer
    y:=za[k]; //Einmal hin...
    za[k]:=y; //und einmal her, was soll sich geändert haben?
    for k:=1 to 6 do
    memo1.Lines.Add(IntToStr(za[k]));
  end;

end;


p80286 4. Mär 2013 16:46

AW: Min-Sort Verfahren
 
Nach einem zweiten Blick auf Deinen Sourcecode
würde ich sagen, der compiliert noch nicht einmal:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
....,x,...:integer;
begin
  ...
    x:=IntToStr(Random(100)+1);
   ...
end;
Des weiteren könnte es Dir helfen wenn Du ein wenig Ordnung in Deinen Code bringst.
Dann sollte Dir aufffallen, daß Du den wert von x niemals in das Array bzw. das Memo bringst.

Also investiere einmal 10 Minuten, und dann sehen wir weiter.

Gruß
K-H

DeddyH 4. Mär 2013 16:48

AW: Min-Sort Verfahren
 
Meine Rede ;)

p80286 4. Mär 2013 22:35

AW: Min-Sort Verfahren
 
[OT] hab ich jetzt auch gemerkt, da fehlte wohl der rote Kasten [/OT]

Gruß
K-H

Jumpy 5. Mär 2013 07:34

AW: Min-Sort Verfahren
 
Ich weise nur mal darauf hin, dass das Problem scheinbar 2x bearbeitet wird:

http://www.delphipraxis.net/newreply...ime=1362468766

Sir Rufo 5. Mär 2013 10:11

AW: Min-Sort Verfahren
 
Also beim Programmieren kommt es auch darauf an, dass man die Arbeit strukturiert und sich diese damit wesentlich vereinfacht.
  • Ein Array mit Integer-Zahlen soll mit Zufallszahlen gefüllt werden
  • Ein Array mit Integer-Zahlen soll sortiert werden
  • Ein Array mit Integer-Zahlen soll in einem Memo ausgegeben werden
Das führt uns doch schon mal zu folgenden Rümpfen:
Delphi-Quellcode:
// Ein Integer-Array mit zufälligen Zahlen füllen

procedure FillArray( var AIntArray : array of Integer; Min, Max : Integer );
begin

end;

// Ein Integer-Array sortieren

procedure SortArray( var AIntArray : array of Integer );
begin
 
end;

// Ein Integer-Array in ein Memo ausgeben

procedure WriteArrayToMemo( const AIntArray : array of Integer; AMemo : TMemo );
begin

end;
Unsere Hauptaufgabe sieht damit schon sehr reduziert aus
Delphi-Quellcode:
// Mit Zahlen im Bereich 1 bis 100 füllen
FillArray( MeinArray, 1, 100 );
// Ausgabe im Memo1 
WriteArrayToMemo( MeinArray, Memo1 );
// Array Sortieren
SortArray( MeinArray );
// Ausgabe in Memo2
WriteArrayToMemo( MeinArray, Memo2 );
Im ganzen Satz und mit den programmierten Rümpfen (ausgenommen der Sortierung) sieht das dann so aus
(EDIT: ich habe das jetzt auch mal an den Aufgabentext angepasst ;))
Delphi-Quellcode:
unit Main_ViewU;

interface

uses
  SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
  TForm1 = class( TForm )
    Unsortiert_Memo : TMemo;
    Sortiert_Memo : TMemo;
    Erzeuge_Button : TButton;
    MaxSort_Button : TButton;
    procedure Erzeuge_ButtonClick( Sender : TObject );
    procedure MaxSort_ButtonClick( Sender : TObject );
  private

  public

  end;

var
  Form1 : TForm1;
  // Array mit den Zahlen
  MeinArray : array [1 .. 20] of integer;

implementation

{$R *.dfm}
// Ein Integer-Array mit zufälligen Zahlen füllen

procedure FillArray( var AIntArray : array of integer; Min, Max : integer );
var
  LIdx : integer;
begin
  for LIdx := Low( AIntArray ) to High( AIntArray ) do
    begin
      AIntArray[LIdx] := Random( Max - Min + 1 ) + Min;
    end;
end;

// Ein Integer-Array sortieren

procedure SortArray( var AIntArray : array of integer );
begin

end;

// Ein Integer-Array in ein Memo ausgeben

procedure WriteArrayToMemo( const AIntArray : array of integer; AMemo : TMemo );
var
  LIdx : integer;
begin
  AMemo.Lines.BeginUpdate;
  try

    AMemo.Clear;

    for LIdx := Low( AIntArray ) to High( AIntArray ) do
      begin
        AMemo.Lines.Add( IntToStr( AIntArray[LIdx] ) );
      end;

  finally
    AMemo.Lines.EndUpdate;
  end;
end;

procedure TForm1.Erzeuge_ButtonClick( Sender : TObject );
begin
  // Mit Zahlen im Bereich 1 bis 100 füllen
  FillArray( MeinArray, 1, 100 );

  // Ausgabe im Memo1
  WriteArrayToMemo( MeinArray, Unsortiert_Memo );
end;

procedure TForm1.MaxSort_ButtonClick( Sender : TObject );
begin
  // Array Sortieren
  SortArray( MeinArray );

  // Ausgabe in Memo2
  WriteArrayToMemo( MeinArray, Sortiert_Memo );
end;

end.

cobi23 5. Mär 2013 17:03

AW: Min-Sort Verfahren
 
Vielen Dank für dein Hilfe,

Jetzt hab ich dieses Problem, es zeigt
uselect.pas(20,15) Error: Forward declaration not solved "TForm1.SelectionsortClick(TObject);"
uselect.pas(21,15) Error: Forward declaration not solved "TForm1.ZufallszahlClick(TObject);"
uselect.pas(63,1) Fatal: There were 2 errors compiling module, stopping

Code:
unit Uselect;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Zufallszahl: TButton;
    Selectionsort: TButton;
    MemoZufallszahl: TMemo;
    MemoSelect: TMemo;
    procedure SelectionsortClick(Sender: TObject);
    procedure ZufallszahlClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

  A: array [1..20] of integer;
implementation

{$R *.lfm}

procedure AFuellen(var insArray: array of integer;Min, Max: integer);
var i:integer;
  begin
    for i:= Low(insArray) to High (insArray) do
    begin
      insArray[i]:= Random(Max-Min+1)+Min;
    end;
  end;

procedure ArraySortieren( var k:array of integer);
Var
    i, j    : LongInt;
    Temp, Min: LongInt;
Begin
    For i := Low(k) To High(k) Do
    Begin
        Min := i;
        For j := i+1 To High(k) Do
            If k[j] < k[Min] Then
                Min := j;
        Temp := k[Min];
        k[Min] := k[i];
        k[i] := Temp;
    End;
End;
end.

procedure InsMemo(const insArray: array of integer; AMemo:TMemo);
var
  x:integer;
  begin
    AMemo.Lines.BeginUpdate;
    try
      AMemo.Clear;
      for x:= Low(insArray) to High (insArray) do
      begin
        AMemo.Lines.Add(IntToStr(insArray[x]));

      end;
    finally
      AMemo.Lines.EndUpdate;
    end;
  end;

{ TForm1 }

procedure TForm1.ZufallszahlButtonClick(Sender: TObject);
begin
  AFuellen(A,1,100);
  InsMemo(A,MemoZufallszahl);
end;

procedure TForm1.SelectionsortClick(Sender: TObject);
begin
  SortArray(A);
  InsMemo(A,MemoSelect);
end;

end.
Ich verstehe nicht was von mir verlangt wird. Könnt ihr mal einen Blick drauf werfen und mir helfen.

DeddyH 5. Mär 2013 17:27

AW: Min-Sort Verfahren
 
Das sieht nach C&P aus, da zumindest im Fall von ZufallszahlClick keine Übereinstimmung im implementation-Abschnitt existiert. Wieso packst Du nicht einfach 2 Buttons auf das Formular, benennst sie entsprechend und schreibst dann den Code in deren OnClick-Handler?

[edit] P.S.: Benutze doch bitte Delphi-Tags, das ist die "Helm"-Schaltfläche im Beitragseditor, dann ist der Code gleich besser zu lesen samt Syntax-Highlighting. [/edit]

Sir Rufo 5. Mär 2013 17:30

AW: Min-Sort Verfahren
 
Lösche die beiden procedures mit
Delphi-Quellcode:
TForm1.*
aus dem implemention Teil und die beiden procedures aus der Klassendefinition.

Dann im Formulardesigner jeweils ein Doppelklick auf die beiden Buttons. Dann solltest du die korrekten Rümpfe haben ;)

cobi23 5. Mär 2013 17:47

AW: Min-Sort Verfahren
 
Delphi-Quellcode:
unit Uselect;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Zufallszahl: TButton;
    Selectionsort: TButton;
    MemoZufallszahl: TMemo;
    MemoSelect: TMemo;
    procedure SelectionsortClick(Sender: TObject);
    procedure ZufallszahlClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

  A: array [1..20] of integer;
implementation

{$R *.lfm}



  { TForm1 }



  procedure TForm1.ZufallszahlClick(Sender: TObject);
  begin
 AFuellen(A,1,100);
 InsMemo(A,MemoSelect);
  end;

procedure TForm1.SelectionsortClick(Sender: TObject);
begin
  ArraySortieren(A);
  InsMemo(A,MemoSelect);
end;

procedure AFuellen(var InsArray:array of integer;Min, Max: integer);
var i:integer;
 begin
   for i:= Low(InsArray) to High (InsArray) do
   begin
     InsArray[i]:= Random(Max-Min+1)+Min;
   end;
 end;


procedure ArraySortieren( var k:array of integer);
Var
    i, j    : LongInt;
    Temp, Min: LongInt;
Begin
    For i := Low(k) To High(k) Do
    Begin
        Min := i;
        For j := i+1 To High(k) Do
            If k[j] < k[Min] Then
                Min := j;
        Temp := k[Min];
        k[Min] := k[i];
        k[i] := Temp;
    End;
End;
end.

procedure InsMemo(const insArray: array of integer; AMemo:TMemo);
var
  x:integer;
  begin
    AMemo.Lines.BeginUpdate;
    try
      AMemo.Clear;
      for x:= Low(insArray) to High (insArray) do
      begin
        AMemo.Lines.Add(IntToStr(insArray[x]));

      end;
    finally
      AMemo.Lines.EndUpdate;
    end;
  end;
end.
Jetzt zeigt er : uselect.pas(44,10) Error: Identifier not found "AFuellen"
uselect.pas(45,9) Error: Identifier not found "InsMemo"
uselect.pas(50,17) Error: Identifier not found "ArraySortieren"
uselect.pas(51,10) Error: Identifier not found "InsMemo"
uselect.pas(82,1) Fatal: There were 4 errors compiling module, stopping

Und was soll ich jetzt machen?

Sir Rufo 5. Mär 2013 17:54

AW: Min-Sort Verfahren
 
Die anderen procedures (die mit ohne TForm1.*) musst du wieder nach oben kopieren ;)

cobi23 5. Mär 2013 18:35

AW: Min-Sort Verfahren
 
Nochmals danke. Jetzt kommen diese Fehlermeldungen:

uselect.pas(22,15) Error: Forward declaration not solved "TForm1.InsMemo(const Open Array Of LongInt,TMemo);"
uselect.pas(23,15) Error: Forward declaration not solved "TForm1.AFuellen(var Open Array Of LongInt,LongInt,LongInt);"
uselect.pas(24,15) Error: Forward declaration not solved "TForm1.ArraySortieren(var Open Array Of LongInt);"
uselect.pas(87,1) Fatal: There were 3 errors compiling module, stopping


Delphi-Quellcode:
unit Uselect;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Zufallszahl: TButton;
    Selectionsort: TButton;
    MemoZufallszahl: TMemo;
    MemoSelect: TMemo;
    procedure SelectionsortClick(Sender: TObject);
    procedure ZufallszahlClick(Sender: TObject);
    procedure InsMemo(const insArray: array of integer; AMemo:TMemo);
    procedure AFuellen(var InsArray:array of integer;Min, Max: integer);
    procedure ArraySortieren( var k:array of integer);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

  A: array [1..20] of integer;

implementation


{$R *.lfm}



  { TForm1 }



procedure TForm1.ZufallszahlClick(Sender: TObject);
  begin
 AFuellen(A,1,100);
 InsMemo(A,MemoSelect);
  end;

procedure TForm1.SelectionsortClick(Sender: TObject);
begin
  ArraySortieren(A);
  InsMemo(A,MemoSelect);
end;

procedure AFuellen(var InsArray:array of integer;Min, Max: integer);
var i:integer;
 begin
   for i:= Low(InsArray) to High (InsArray) do
   begin
     InsArray[i]:= Random(Max-Min+1)+Min;
   end;
 end;


procedure ArraySortieren( var k:array of integer);
Var
    i, j    : LongInt;
    Temp, Min: LongInt;
Begin
    For i := Low(k) To High(k) Do
    Begin
        Min := i;
        For j := i+1 To High(k) Do
            If k[j] < k[Min] Then
                Min := j;
        Temp := k[Min];
        k[Min] := k[i];
        k[i] := Temp;
    End;
End;
end.

procedure InsMemo(const insArray: array of integer; AMemo:TMemo);
var
  x:integer;
  begin
    AMemo.Lines.BeginUpdate;
    try
      AMemo.Clear;
      for x:= Low(insArray) to High (insArray) do
      begin
        AMemo.Lines.Add(IntToStr(insArray[x]));

      end;
    finally
      AMemo.Lines.EndUpdate;
    end;
  end;
end.

DeddyH 5. Mär 2013 18:49

AW: Min-Sort Verfahren
 
Kennst Du den Unterschied zwischen einer Methode und einer regulären Prozedur? Anscheinend nicht, hier scheint mir ein Grundlagenstudium zwingend angesagt.

cobi23 5. Mär 2013 19:08

AW: Min-Sort Verfahren
 
Hab den Fehler gefunden. Danke Leute das ihr mir geholfen habt.
Besonderen Dank an Sir Rufo. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 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