![]() |
Werte tauschen
Also bis jetzt hab ich folgendes:
Delphi-Quellcode:
und das
procedure Swapvalues(var x,y: integer);
var dummy: integer; begin dummy:=x; x:=y; y:= dummy; end;
Delphi-Quellcode:
Nur irgendwie werden die Werte nur beim ersten mal auf Button1 sortiert. danach sind sie nich mehr sortiert. Woran liegt das?
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; [edit=SirThornberry]Titel geändert - Mfg, SirThornberry[/edit] |
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! |
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; |
Re: Und noch einmal... Werte tauschen
Eine Sache verstehe ich an deinem Code nicht, und zwar diese Zeile:
Delphi-Quellcode:
was bewirkt die genau?
For i := 0 To Length(a) - 2 do
|
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ß |
Re: Und noch einmal... Werte tauschen
Hallo,
tauscht man Werte nicht mit XOR? |
Re: Und noch einmal... Werte tauschen
Zitat:
|
Re: Und noch einmal... Werte tauschen
Zitat:
Habe mir nicht den gesamten Thread durchgelesen, sondern nur nach Titel geantwortet; sorry. |
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:
Damit kippst Du alle Bits von a (Du 'tauschst' quasi alle 1er mit 0ern und umgekehrt).
var
a: Byte; begin a:=134; a:=a XOR 11111111b; end; |
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.
|
Re: Werte tauschen
Ich komm einfach nicht drauf. Was fehlt in meiner Prozedur, damit es funzt?
|
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:
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)
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; Gruß :hi: |
Re: Werte tauschen
Welche Sortierprozedur verwendest du denn jetzt?
|
Re: Werte tauschen
Nach wie vor die vom Anfang. Die Geschwindigkeit ist bei mir nicht so wichtig. Ich habe eh nur 6 Werte.
|
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!
|
Re: Werte tauschen
Zitat:
Delphi-Quellcode:
Meintest Du das?
procedure SwapValues(var a,b: integer);
begin a := a xor b; b := b xor a; a := a xor b; end; |
Re: Werte tauschen
Ich habs jetzt wirklich GENAU so übernommen.
Delphi-Quellcode:
Es klappt trotzdem nicht immer. Warum??
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; 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 |
Re: Werte tauschen
Warum wird denn von length(Zahl1) der Wert 6 subtrahiert? Es soll doch nur -2 sein ...
|
Re: Werte tauschen
:wall: :wall:
scheiß Tippfehler :wall: :wall: |
Re: Werte tauschen
Und, geht' s jetzt?
|
Re: Werte tauschen
ja, jetzt funzt alle. Lag scheinbar nur an der 6 die eine 2 hätte sein mpssen.
|
Re: Werte tauschen
Klingt logisch
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz