Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Werte tauschen (https://www.delphipraxis.net/100051-werte-tauschen.html)

P4CM4N 21. Sep 2007 14:33


Werte tauschen
 
Also bis jetzt hab ich folgendes:
Delphi-Quellcode:
procedure Swapvalues(var x,y: integer);
var
dummy: integer;
begin
dummy:=x;
x:=y;
y:= dummy;
end;
und das
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var zahl1:tzahl;
var c,super1:integer;
begin
Lotto(zahl1,super1);                                      //Ausgabe
c:=1;
repeat
if zahl1[c]>zahl1[c+1] then SwapValues(zahl1[c],zahl1[c+1]);
Stringgrid1.Cells[c,0]:=IntToStr(zahl1[c]);
c:=c+1;
until c=7;
Nur irgendwie werden die Werte nur beim ersten mal auf Button1 sortiert. danach sind sie nich mehr sortiert. Woran liegt das?

[edit=SirThornberry]Titel geändert - Mfg, SirThornberry[/edit]

sirius 21. Sep 2007 15:06

Re: Und noch einmal... Werte tauschen
 
Der Sortieralgo ist unvollständig (wahrscheinlich hattest du beim ersten Mal Glück).
Da solltest du nochmal drüberschauen!

Cyberbob 21. Sep 2007 15:18

Re: Und noch einmal... Werte tauschen
 
Meine sieht so aus:

Delphi-Quellcode:
var
  Changed : Boolean;
  i : Integer;
  Speicher : Integer;

Repeat
  Changed := False;
  For i := 0 To Length(a) - 2 do
  begin
    if a[i] > a[i+1] then
    begin
      Speicher := a[i];
      a[i] := a[i+1];
      a[i+1] := Speicher;
      Changed := True;
    end;
  end;
Until Changed = False;

P4CM4N 21. Sep 2007 15:38

Re: Und noch einmal... Werte tauschen
 
Eine Sache verstehe ich an deinem Code nicht, und zwar diese Zeile:
Delphi-Quellcode:
  For i := 0 To Length(a) - 2 do
was bewirkt die genau?

pstruh 21. Sep 2007 15:57

Re: Und noch einmal... Werte tauschen
 
Hallo!
Das Array hat den Namen "a", der höchste Index des Arrays ist Length(a)-1 (Basis 0, erstes Element hat den Index 0). Da innerhalb der Schleife auf a[i+1] zugegriffen wird, darf die Schleife eben nur bis zum vorletzten Element "hochzählen"
Gruß

s-off 21. Sep 2007 15:59

Re: Und noch einmal... Werte tauschen
 
Hallo,

tauscht man Werte nicht mit XOR?

sirius 21. Sep 2007 16:00

Re: Und noch einmal... Werte tauschen
 
Zitat:

Zitat von s-off
Hallo,

tauscht man Werte nicht mit XOR?

:gruebel: Bits kannst du damit tasuchen, oder an was hast du gedacht?

s-off 21. Sep 2007 16:03

Re: Und noch einmal... Werte tauschen
 
Zitat:

Zitat von sirius
Zitat:

Zitat von s-off
Hallo,

tauscht man Werte nicht mit XOR?

:gruebel: Bits kannst du damit tasuchen, oder an was hast du gedacht?

Ja, daran dachte ich.
Habe mir nicht den gesamten Thread durchgelesen, sondern nur nach Titel geantwortet; sorry.

Sidorion 21. Sep 2007 16:04

Re: Werte tauschen
 
Hä? XOr ist der Ausdruck für 'entweder a oder b' da wird nix getauscht. Das einzige, was an 'tauschen' auch nur im Ansatz rankommt wäre:
Delphi-Quellcode:
var
  a: Byte;
begin
  a:=134;
  a:=a XOR 11111111b;
end;
Damit kippst Du alle Bits von a (Du 'tauschst' quasi alle 1er mit 0ern und umgekehrt).

Cyberbob 21. Sep 2007 16:09

Re: Werte tauschen
 
Achso, die äußere Repaet-Shleife ist dafür da, weil immer nur 2 Einträge miteniander vertauscht werden. Wenn un ein element am ende der Liste ganz nach vorne muss, muss die Tauschfunktion auch entsprechend oft durchlaufen werden, damit das funktioniert. Wenn nichts mehr getauscht wurde, ist alles an seinem Platz und bei Until wird die Schleife verlassen.

P4CM4N 21. Sep 2007 16:33

Re: Werte tauschen
 
Ich komm einfach nicht drauf. Was fehlt in meiner Prozedur, damit es funzt?

pstruh 21. Sep 2007 16:42

Re: Werte tauschen
 
Joo, so isses mit dem repeat-until!

Zudem sei angemerkt, dass dieser Sortieralgorithmus recht langsam ist (was natürlich nur bei größeren Datenmengen ins Gewicht fällt). Ich möchte an dieser Stelle eine allgemeine SwapProcedur beisteuern:

Delphi-Quellcode:
procedure SwapVars(var a,b;nByte:Integer);
var Sou : Array[1..maxInt]of Byte absolute a;
    Des : Array[1..maxInt]of Byte absolute b;
    i  : Integer;
    t  : Byte;
begin
  for i:=1 to nByte do begin
   t    :=Sou[i];
   Sou[i]:=Des[i];
   Des[i]:=t;
   end;
end;
Hiermit können Variablen beliebigen Typs vertauscht werden (vielleicht findet sich an dieser Stelle ein hilfreicher Geist, der diese Prozedur etwas in der Geschwindigkeit verbessern kann)

Gruß :hi:

pstruh 21. Sep 2007 16:43

Re: Werte tauschen
 
Welche Sortierprozedur verwendest du denn jetzt?

P4CM4N 21. Sep 2007 16:45

Re: Werte tauschen
 
Nach wie vor die vom Anfang. Die Geschwindigkeit ist bei mir nicht so wichtig. Ich habe eh nur 6 Werte.

pstruh 21. Sep 2007 16:51

Re: Werte tauschen
 
Tja, das ist klar, dass die nicht immer funktioniert! Die repeat-until Schleife darf nicht durch einen Zähler gesteuert werden. Das KANN mal passen, ist aber vermutlich MEIST falsch. Cyberbob hat dir ein Beispiel gegeben: Die Schleife darf erst beendet werden, wenn nicht mehr getauscht wurde!

DeddyH 21. Sep 2007 17:01

Re: Werte tauschen
 
Zitat:

Zitat von s-off
Hallo,

tauscht man Werte nicht mit XOR?

Bei ganzzahligen Variablen mach ich das auch so:
Delphi-Quellcode:
procedure SwapValues(var a,b: integer);
begin
  a := a xor b;
  b := b xor a;
  a := a xor b;
end;
Meintest Du das?

P4CM4N 21. Sep 2007 17:07

Re: Werte tauschen
 
Ich habs jetzt wirklich GENAU so übernommen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var zahl1:tzahl;
var c,super1,speicher,d:integer;
var changed:boolean;

begin
Lotto(zahl1,super1);                                      //Ausgabe

Repeat
  Changed := False;
  For d := 0 To Length(zahl1) - 6 do
  begin
    if zahl1[d] > zahl1[d+1] then
    begin
      Speicher := zahl1[d];
      zahl1[d] := zahl1[d+1];
      zahl1[d+1] := Speicher;
      Changed := True;
    end;
  end;
Until Changed = False;
     
for c:=1 to 7 do
Stringgrid1.Cells[c,0]:=IntToStr(zahl1[c]);

label1.Caption:=IntToStr(super1);
end;
Es klappt trotzdem nicht immer. Warum??
Erst hab ich die Zahlen geordent, dann sogar noch in einer extra Schleife die Sache wieder ausgegeben. Trotzdem sind die Zahlen, zumindest nicht immer, geordnet

pstruh 21. Sep 2007 17:23

Re: Werte tauschen
 
Warum wird denn von length(Zahl1) der Wert 6 subtrahiert? Es soll doch nur -2 sein ...

P4CM4N 21. Sep 2007 20:14

Re: Werte tauschen
 
:wall: :wall:
scheiß Tippfehler
:wall: :wall:

DeddyH 21. Sep 2007 20:16

Re: Werte tauschen
 
Und, geht' s jetzt?

P4CM4N 21. Sep 2007 20:59

Re: Werte tauschen
 
ja, jetzt funzt alle. Lag scheinbar nur an der 6 die eine 2 hätte sein mpssen.

DeddyH 21. Sep 2007 21:04

Re: Werte tauschen
 
Klingt logisch


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