Autor Beitrag
christian87
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: Sa 20.01.07 14:28 
Hallo,

Ich habe irgendwie grad nen kleinen Blackout. Ich möchte einfach 4 Zahlen, die ich zufällig in einem array gespeichert habe sortieren. Irgendwie mach ich grad nur Müll. Guckt euch mal den Quelltext an. Also ich will die erste Zahl mit der 2. Vergleich ist die erste größer tausche ich diese usw...

ausblenden volle Höhe Delphi-Quelltext
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:
33:
34:
procedure TForm1.Button1Click(Sender: TObject);
var i,n,zahlmin,Vergleich:integer;
feld: array[1..4of integer;

begin
i:=0;

for i:=1 to  4 do
begin
  randomize;
  feld[i]:=random(4);
  listbox1.items.add(inttostr(feld[i]));
end;

vergleich:=1;
n:=1;

While vergleich < 4 do
while n < 4 do;
n:=n+1;
begin
  If feld[vergleich] > feld[n] then
  begin
    feld[vergleich]:=feld[n];
    feld[n]:=feld[vergleich];
    listbox2.Items.Add(inttostr(feld[vergleich]));
  end;
  vergleich:=vergleich+1;
end;

end;


end.


Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 20.01.07 14:36 
erst mal empfielt es sich, den quellcode einzurücken, dann sieht man auch, was passiert...

ausblenden volle Höhe Delphi-Quelltext
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:
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
 i, n, zahlmin, Vergleich: INTEGER;
 feld: ARRAY[1..4OF INTEGER;

BEGIN
 i := 0;

 FOR i := 1 TO 4 DO
 BEGIN
  randomize;
  feld[i] := random(4);
  listbox1.items.add(IntToStr(feld[i]));
 END;

 vergleich := 1;
 n := 1//ausserdem: innere schleife ist ungleich äussere

 WHILE vergleich < 4 DO
  WHILE n < 4 DO ; //NULL anweisung
 n := n + 1;
 BEGIN //sequentieller block, keine interation
  IF feld[vergleich] > feld[n] THEN
  BEGIN //wo würd hier die sicherung bleiben? immer
   feld[vergleich] := feld[n]; //t := a; a := b; b:= t;
   feld[n] := feld[vergleich];
   listbox2.Items.Add(IntToStr(feld[vergleich]));
  END;
  vergleich := vergleich + 1;
 END;
END;

<HTH>


Zuletzt bearbeitet von Grenzgaenger am Sa 20.01.07 15:05, insgesamt 1-mal bearbeitet
christian87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: Sa 20.01.07 14:51 
Sorry für die Form.
Aber das hilft mir jetzt irgendwie nicht weiter. Ich bin noch Anfänger sorry.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Sa 20.01.07 14:55 
Guck dir doch mal die Kommentare an, die Grenzgaenger in deinen Code geschrieben hat. :wink:

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
christian87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: Sa 20.01.07 15:10 
Irgendwie komm ich jetzt völlig durcheinander. Also von der Überlegung ist das doch richtig oder?
1 2 3 4
Ich habe 4 Zahlen: 0 3 1 2 diese will ich sortieren.

Soll ich jetzt die erste mit allen Vergleichen und immer tauschen? Ich glaub ich hab einfach einen Denkfehler.
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 20.01.07 15:48 
@christian87, also die einrückungen im code, helfen vor allem dir, um strukturprobleme sofort zu erkennen um damit nicht stundenlang vor dem debugger zu sitzen.

ausserdem noch ein tipp, mach keine monsterfunktionen, sondern teile sie auf, in kleinere funktionen. so könnte also deine funktion TForm1.Button1Click(Sender: TObject); aus einem aufruf der funktionen generiere_array und sortiere_array bestehen. dein sortiere_array könnte wiederum aus den funktionen vergleiche_werte und tausche_werte bestehen. damit reduzierst du die komplexität und kannst verschiedene komponenten weiterverwenden.



user profile iconchristian87 hat folgendes geschrieben:
Soll ich jetzt die erste mit allen Vergleichen und immer tauschen? Ich glaub ich hab einfach einen Denkfehler.

das kommt auf deinen algo drauf an, wenn du die werte immer tauschen möchtest, wenn die bedingung zutriffst, hast den bubblesort, wenn du erst das element finden möchtest um es zum schluss zu tauschen, dann hättest du den selectionsort. beides funktioniert. ich an deiner stelle würd jetzt erst mal versuchen, die funktion so einfach wie möglich hinzubekommen und erst ein einem späteren schritt optimierungen anzugehen. <HTH>

kurzer nachtrag, den folgenden code solltest dir nicht ansehen, sondern selbst die lösung finden.

ausblenden volle Höhe Delphi-Quelltext
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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
procedure TForm1.add_to_box(lb: tListbox; a: array of integer);
var
 i: integer;
begin
 for i := low(a) to high(a) do
  lb.Items.add(inttostr(a[i]));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 a: array [1..10of integer;
begin
 qb.Clear;
 zb.clear;

 generiere_array (a);
 add_to_box(qb, a);
 sortiere_array(a);
 add_to_box(zb, a);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 qb.Clear;
 zb.clear;
 randomize;
end;

procedure TForm1.generiere_array(var a: array of integer);
var
 i: integer;
begin
 for i := low(a) to high(a) do
  a[i] := random(100);
end;

procedure TForm1.sortiere_array(var a: array of integer);
 procedure tausch(var a, b: integer);
 var
  t: integer;
 begin
  t := a;
  a := b;
  b := t;
 end;
 function IfToSort(a, b: integer): boolean;
 begin
  if a < b then
   result := true
  else
   result := false;
 end;

var
 i, j: integer;
begin
 for i := low(a) to high(a)  do
  for j := low(a) to high(a) do
   if ifToSort(a[i], a[j]) then
    tausch(a[i], a[j]);
end;
christian87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45



BeitragVerfasst: So 21.01.07 12:09 
Vielen Dank für die ausführliche Hilfe und für die Tipps. Du hast mir sehr geholfen.

Hab das jetzt so gemacht und es funktioniert.

ausblenden volle Höhe Delphi-Quelltext
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:
33:
34:
35:
36:
37:
38:
39:
procedure TForm1.Button1Click(Sender: TObject);
var i,n,x,zahlmin,MAX:integer;


begin
 for i:=1 to  10 do
  begin
  randomize;
  feld[i]:=random(11);
  listbox1.items.add(inttostr(feld[i]));
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var i,n,max,x : integer;
begin
for i:=low(feld) to high(feld) do
  begin
   for n:=low(feld) to high(feld) do
    begin
    if feld[i] > feld[n] then
     begin
      MAX:=feld[i];
      feld[i]:=feld[n];
      feld[n]:=MAX;

     end;
  end;
end;

for i:=1 to  10 do
  begin

  listbox2.items.add(inttostr(feld[i]));
  end;

end;
end.