Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Lotto zahlen sortieren
Inspecta - So 07.12.03 04:41
Titel: Lotto zahlen sortieren
wie schaffe ich es das die zahlen sortiert ausgegeben werden?
irgendwie muss es ganz einfach sein mit bubble oder quicksort aber ich rall es nich! irgendwie komm ich da nich weiter!
wäre nett wenn ihr mir helfen würdet! ob mit einer lösung oder mit ansätzen! vielleicht liegt es auch an der uhrzeit!?
danke
das is mein programm:
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: 62: 63: 64: 65: 66: 67: 68: 69: 70:
| Tipp,Zahl : Array[1..6] of Integer; AnzRichtig:Integer;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.text:='1'; Edit2.text:='2'; Edit3.text:='3'; Edit4.text:='4'; Edit5.text:='5'; Edit6.text:='6'; Edit7.text:='0'; label7.Caption:=''; label2.Caption:=''; label3.Caption:=''; label4.Caption:=''; label5.Caption:=''; label6.Caption:=''; end;
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; doppelt:boolean;
begin randomize; Tipp[1]:=StrToInt(Edit1.text); Tipp[2]:=StrToInt(Edit2.text); Tipp[3]:=StrToInt(Edit3.text); Tipp[4]:=StrToInt(Edit4.text); Tipp[5]:=StrToInt(Edit5.text); Tipp[6]:=StrToInt(Edit6.text); Zahl[1]:=Random(49)+1; for i:=1 to 6 do begin repeat Zahl[i]:=Random(49)+1; doppelt:=false; for j:=1 to i-1 do begin if Zahl[i]=Zahl[j] then doppelt := true; end; Until not doppelt; end;
AnzRichtig:= 0; for i:=1 to 6 do begin for j:=1 to 6 do begin if Zahl[i]=Tipp[j] then AnzRichtig:=AnzRichtig + 1; edit7.text:=inttostr(AnzRichtig); end; label2.Caption:='Zahl 1 ='+floattostr(zahl[1]); label3.Caption:='Zahl 2 ='+floattostr(zahl[2]); label4.Caption:='Zahl 3 ='+floattostr(zahl[3]); label5.Caption:='Zahl 4 ='+floattostr(zahl[4]); label6.Caption:='Zahl 5 ='+floattostr(zahl[5]); label7.Caption:='Zahl 6 ='+floattostr(zahl[6]);
end; |
DeCodeGuru - So 07.12.03 11:17
Hi, sorry, aber ich habe mir deinen Code nicht genau angeschaut, weil der irgendwie unformatiert ist und ich zu so früher stunde keine Lust habe, den für mich zu ordnen. Was du brauchst ist BubbleSort, denn für 6 läpische Zahlen wäre Quicksort nen bisschen Overkill. :wink:
Ich habe dir im nachfolgenden mal ne Bubble-Sort-Algo gepostet. Schau ihn dir mal an.
P.S.: Der arbeitet auch mit nem Array of Integer, also müsstest du das nur anpassen bzw. den Algo so verwenden, ach was weiss ich :mrgreen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.DoSort; var i, zw: Integer; ok: Boolean begin repeat ok := True; for i := 0 to 19 do begin if testsort[i] > testsort [i + 1] then begin zw := testsort[i]; testsort[i] := testsort[i + 1]; testsort[i + 1] := zw; ok := False; end; end; until ok = True; end; |
Wenn was nit klapp, frag. Ach ja, den Code da oben habe ich nur aus meinem Ordner rausgekramt, daher übernehme ich keinerlei Verantwortung für irgendwelche Fehler :wink:
Inspecta - So 07.12.03 13:35
krieg das nich gebacken!
nehm ich das am besten als procedure oder einfach nur einfügen?
könntet ihr mir das genauer zeigen bzw (be)schreiben?
catweasel - So 07.12.03 14:51
Hi,
nachdem ich in diesem Forum auch schon viele Hilfe bekommen habe, will ich jetzt mal weiterhelfen :
Hatte diese Geschichten mit Sortieralgorhytmen nämlich auch nie so ganz gerafft... (Rekursion bereiet mir immernoch Kopfschmerzen ;-)
Aber ich hab dir den Code vom CodeGuru mal durchkommentiert.......
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: 62: 63:
| procedure TForm1.DoSort;
var i, zw: Integer; ok: Boolean;
begin repeat
ok := True;
for i := 0 to 19 do
begin
if testsort[i] > testsort [i + 1] then
begin zw := testsort[i]; testsort[i] := testsort[i + 1]; testsort[i + 1] := zw;
ok := False;
end; end; until ok = True;
end; |
Ein kleiner Tipp von mir:
| Zitat: |
krieg das nich gebacken!
nehm ich das am besten als procedure oder einfach nur einfügen?
könntet ihr mir das genauer zeigen bzw (be)schreiben? |
Das mit der Przedur ist garnicht so schlecht, aber noch wesentlich elegnater ist es das als Funktion zu deklarieren, der du ein array übergibst, und ein array zurückliefert (sortiert selbstverständlich ;-)
, etwa so:
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:
| function zahlensort(chaos : array of integer): order : array of integer;
function sortieren(chaos : array [1..6] of integer): order : array [1..6 ]of integer;
var i, zw: Integer; ok: Boolean begin repeat ok := True; for i := 0 to 6 do begin if chaos[i] > chaos [i + 1] then begin zw := chaos[i]; chaos[i] := chaos[i + 1]; chaos[i + 1] := zw; ok := False; end; end; until ok = True; end;
for i := 0 to 6 do Result[i] := chaos[i];
end; |
:wink:
Du könntest aber auch eine eigene Klasse erstellen mit einem array und die Sortierprozedur als Methode implementieren......
Der Aufruf wäre dann etwa:
Delphi lässt einem da vieeele Möglichkeiten..
Catweasel
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
DeCodeGuru - So 07.12.03 15:01
jo, als Funktion ist das wesentlich schnicker. Was ich noch sagen wollte: Das fehlende Semikolon tut mir leid :oops: und umd das "höchste" Element eines Arrays herauszubekommen kannste High, für das Niedrigste Low verwenden.
Inspecta - So 07.12.03 15:29
wie füge ich das zu uses ein?
die procedure!
catweasel - So 07.12.03 15:43
High und low.. soso . So lernt sogar der Antworter was . :D
Hab ja erwähnt das mir das Thema Rekurion Kopfzerbrechen bereitet...
Vielleicht kannst du mir mal einen Sortieralgorhytmus erklären, der auf rekursion basiert ?? *bittebitte*
Mal bezüglich dazu ne allgemeine Frage:
Wenn ich herausbekommen möchte welcher Algo am performantesten ist gibts doch so eine Abhängigkeit von Elementen und Sortiervorgängen, wobei von einer maximalen Unordnung ausgegangen wird.
Beispiel Bubblesort:
Maximale Unordnung hier: ein absteigend Sortierets Array soll aufsteigend sortiert werden.
Um ein eine Menge mit n Elementen per Bubblesort zu sortieren, benötige ich n *n +1 "Züge", oder ?
Das array wird für jedes Element einmal komplett durchgegangen plus einmal am ende der "Leerdurchgang"......
Vielleicht verpwil ich da aber auch was :?:
Aber wie bekomme ich das für kompliziertere Algos (Quicksort,Shellsort, Bucketsort,Fractsort) raus ?
Bitte bring mal jemand für mich List ins Dunkel :-)
Catweasel
catweasel - So 07.12.03 15:47
| Zitat: |
wie füge ich das zu uses ein?
die procedure |
!
Datei -> neue unit erstellen
in der ersten Unit oben bei
Quelltext
1: 2:
| uses windows, system, graphics...., stdctrls; |
unit2 einfügen...
Quelltext
1: 2:
| uses windows, system, graphics...., stdctrls, unit2; |
Sieht komisch aus. Ist aber so :lol:
in der zweiten Unit übernimmst du den ganzen Uses Schmodder aus unit1 per copy&paste (du brauchst nich alle aber ich weiss im moment nich genau welche)
und im implementation teil der zweiten unit schreibst du die prozedur rein.........
Catweasel
Inspecta - So 07.12.03 16:18
so weit so gut! hab die procedure jetzt fertig. wenn ich sie aber einsetzen will sagt er nicht genügend wirkliche parameter
wat soll das jetzt?
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: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Button1: TButton; BitBtn1: TBitBtn; Label1: TLabel; Edit7: TEdit; Button2: TButton; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure DoSort(Sender: TObject); private public Tipp,Zahl : Array[1..6] of Integer; AnzRichtig:Integer;
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.text:='1'; Edit2.text:='2'; Edit3.text:='3'; Edit4.text:='4'; Edit5.text:='5'; Edit6.text:='6'; Edit7.text:='0'; label7.Caption:=''; label2.Caption:=''; label3.Caption:=''; label4.Caption:=''; label5.Caption:=''; label6.Caption:=''; end;
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; doppelt:boolean;
begin randomize; Tipp[1]:=StrToInt(Edit1.text); Tipp[2]:=StrToInt(Edit2.text); Tipp[3]:=StrToInt(Edit3.text); Tipp[4]:=StrToInt(Edit4.text); Tipp[5]:=StrToInt(Edit5.text); Tipp[6]:=StrToInt(Edit6.text); Zahl[1]:=Random(49)+1; for i:=1 to 6 do begin repeat Zahl[i]:=Random(49)+1; doppelt:=false; for j:=1 to i-1 do begin if Zahl[i]=Zahl[j] then doppelt := true; end; Until not doppelt; end;
AnzRichtig:= 0; for i:=1 to 6 do begin for j:=1 to 6 do begin if Zahl[i]=Tipp[j] then AnzRichtig:=AnzRichtig + 1; edit7.text:=inttostr(AnzRichtig); end; dosort; label2.Caption:='Zahl 1 ='+floattostr(zahl[1]); label3.Caption:='Zahl 2 ='+floattostr(zahl[2]); label4.Caption:='Zahl 3 ='+floattostr(zahl[3]); label5.Caption:='Zahl 4 ='+floattostr(zahl[4]); label6.Caption:='Zahl 5 ='+floattostr(zahl[5]); label7.Caption:='Zahl 6 ='+floattostr(zahl[6]);
end;
end;
procedure TForm1.DoSort; var i, zw: Integer; ok: Boolean; begin repeat ok:=True; for i:=0 to 6 do begin if zahl[i]>zahl [i + 1] then begin zw:=Zahl[i]; Zahl[i]:=Zahl[i + 1]; Zahl[i + 1]:=zw; ok:=False; end; end; until ok=True; end;
procedure TForm1.Button2Click(Sender: TObject); begin formcreate(sender); end;
end. |
Moderiert von
Tino: Delphi-Tags hinzugefügt.
Inspecta - So 07.12.03 23:33
kann mir denn da keiner weiterhelfen?
Tino - Mo 08.12.03 10:46
| Inspecta hat folgendes geschrieben: |
| wenn ich sie aber einsetzen will sagt er nicht genügend wirkliche parameter |
Und bei welcher Zeile im Sourcecode meldet das der Compiler?
Gruß
Tino
Inspecta - Mo 08.12.03 14:37
und zwar wenn ich die procedure starten will!
....
dosort;
....
Tino - Mo 08.12.03 15:18
Hallo,
im Interface-Teil wird die Procedure wie folgt definiert:
Delphi-Quelltext
1:
| procedure DoSort(Sender: TObject); |
Die Implementiertung (Implementation-Teil) sieht allerdings etwas anders aus:
Delphi-Quelltext
1:
| procedure TForm1.DoSort; |
Entweder fügst du hier noch den Parameter hinzu oder, falls dieser nicht benötigt wird, entferst du den Parameter oben im Interface-Teil.
Gruß
Tino
Inspecta - Mo 08.12.03 15:41
das war es nich!
wie du ein paar felder weiter oben siehst(nich ganz oben), steht da mein code.
aber wenn ich die procedure nach dem filtern der zahlen starten will, damit sie sortiert werden,geht es nich!
ich rall das net mehr. :cry:
Tino - Di 09.12.03 10:09
Hallo!
| Inspecta hat folgendes geschrieben: |
| das war es nich! |
Warum nicht? Was passiert?
| Inspecta hat folgendes geschrieben: |
| wie du ein paar felder weiter oben siehst(nich ganz oben), steht da mein code. |
Da steht dein Code... :roll: schön.
| Inspecta hat folgendes geschrieben: |
| aber wenn ich die procedure nach dem filtern der zahlen starten will, damit sie sortiert werden,geht es nich! |
Was geht denn nicht? Das Compilieren, wird die Funktion nicht ausgeführt, wird die Funktion ausgeführt und es erscheint ein Fehler, ...
Wenn du das Programm starten kannst dann versuch es mal zu debuggen (F8 & F7, etc).
Gruß
Tino
Inspecta - Di 09.12.03 14:02
kA ob ich zu blöd bin das zu erklären,kann ich es eventuell jemandem schicken?
ich probiers noch mal:
wenn ich den letzten code den ich gepostet habe, starten will, verweist er sofort darauf "Nicht genügend wirkliche Parameter"!(er startet also nix!)
Liegt das daran das ne procedure anders aufgerufen wird oder kann das alles einfach so nich laufen?
Ich will ja einfach nur, dass die procedure dosort gestartet wird,nachdem die zahlen gezogen wurden,und diese procedure sie sortiert!
Inspecta - Di 09.12.03 23:16
wäre jemand so nett und würde sich bereit erklären mein program mal zu testen?
keine angst vor viren!
Christian S. - Di 09.12.03 23:32
Hallo!
Um das mal mit den Worten des Orakels von Matrix (nicht von Delphi) zu sagen: Du kennst die Antwort schon! Tino hat Dir geschrieben, was falsch läuft: Du sagst im Interface-Teil Deines Programmes (genauer gesagt in dem Teil mit "type TForm1 ..." dort einige Zeilen weit unten), dass DoSort einen Paramter bekommt: Sender.
Wenn Du aber schließlich im implementation-Teil die Prozedur schreibst, also den Quelltext dafür, dann steht dort dieser Parameter nicht mehr im Kopf der Prozedur. Die beiden stimmen also nicht überein, was sie aber müssen.
Eines der beiden musst Du ändern, welches von beiden musst Du Dir selbst überlegen. ;-)
MfG
Peter
P.S.: Hoffe, das war verständlich.
Inspecta - Mi 10.12.03 16:26
nun gut, soweit läuft das Programm(danke :roll: ).
Hatte die Woche volles Klausuren Programm, deshalb konnte ich mich erst wieda jetzt damit beschäftigen!
Programm läuft, aber es treten Fehler auf die da wären:
-Bei der Zahlen Ausgabe tauchen zwar immer alle Zahlen sortiert auf,
aber ab und zu sind zahlen doppelt(immer nur zahlen von 1-6,glaub ich)
-Die Anzeige der richtigen Zahlen zeigt nur noch Zahlen über 30 an
teste schon die ganze Zeit aber finde keine Lösung!
Habt ihr ne Idee
ps:Nochmal danke
Inspecta - Mi 10.12.03 19:26
wäre super wenn ihr mir auch da nochmal helfen könntet!
Christian S. - Mi 10.12.03 19:35
Hallo!
(1) Bitte keine Schiebepostings!
(2) Bitte poste nochmal Deinen gesamten Code. Besonders, damit er richtig formatiert (eingerückt) ist. Außerdem hat er sich ja wahrscheinlich etwas geändert.
MfG
Peter
Inspecta - Mi 10.12.03 19:54
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: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Button1: TButton; BitBtn1: TBitBtn; Label1: TLabel; Edit7: TEdit; Button2: TButton; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label2: TLabel; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure DoSort; private public Tipp,Zahl : Array[1..6] of Integer; AnzRichtig:Integer; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Edit1.text:='1'; Edit2.text:='2'; Edit3.text:='3'; Edit4.text:='4'; Edit5.text:='5'; Edit6.text:='6'; Edit7.text:='0'; label7.Caption:=''; label2.Caption:=''; label3.Caption:=''; label4.Caption:=''; label5.Caption:=''; label6.Caption:=''; end;
procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; doppelt:boolean;
begin randomize; Tipp[1]:=StrToInt(Edit1.text); Tipp[2]:=StrToInt(Edit2.text); Tipp[3]:=StrToInt(Edit3.text); Tipp[4]:=StrToInt(Edit4.text); Tipp[5]:=StrToInt(Edit5.text); Tipp[6]:=StrToInt(Edit6.text); Zahl[1]:=Random(49)+1; for i:=1 to 6 do begin repeat Zahl[i]:=Random(49)+1; doppelt:=false; for j:=1 to i-1 do begin if Zahl[i]=Zahl[j] then doppelt := true; end; Until not doppelt; end; AnzRichtig:= 0; for i:=1 to 6 do begin for j:=1 to 6 do begin if Zahl[i]=Tipp[j] then AnzRichtig:=AnzRichtig + 1; edit7.text:=inttostr(AnzRichtig); end; dosort; label2.Caption:='Zahl 1 ='+floattostr(zahl[1]); label3.Caption:='Zahl 2 ='+floattostr(zahl[2]); label4.Caption:='Zahl 3 ='+floattostr(zahl[3]); label5.Caption:='Zahl 4 ='+floattostr(zahl[4]); label6.Caption:='Zahl 5 ='+floattostr(zahl[5]); label7.Caption:='Zahl 6 ='+floattostr(zahl[6]); end; end;
procedure TForm1.DoSort; var i,zw: Integer; ok: Boolean;
begin repeat ok:=True; for i:=0 to 6 do begin if zahl[i]>zahl [i + 1] then begin zw:=Zahl[i]; Zahl[i]:=Zahl[i + 1]; Zahl[i + 1]:=zw; ok:=False; end; end; until ok=True; end;
procedure TForm1.Button2Click(Sender: TObject); begin formcreate(sender); end;
end. |
So, hoffe das passt!
Probleme sind:
-Anzahl der Richtigen Zahlen wird falsch ausgegeben
-Ab und zu werden die Lotto-Zahlen vom Pc doppelt ausgegeben(1-6 nur, glaub ich)
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
Christian S. - Mi 10.12.03 20:14
Hallo!
Es wundert mich, dass das Programm überhaupt läuft. Die Schleife beim Sortieren geht von 0 bis 6. Im Quelltext werden in der Zeile "if zahl[i]>zahl [i + 1] then" folglich die Elemente 0 bis 7 des Arrays zahl aufgerufen. Zahl ist jedoch als Array mit Indizes 1 bis 6 definiert. Das passt nicht.
Sonst fällt mir nicht wirklich was auf ... :?
MfG
Peter
Inspecta - Mi 10.12.03 21:22
stimmt!
danke, damit hast du mir schon sehr geholfen und daraufhin is mir aufgefallen, dass die bedingte Anweisung in der Sortier Procedure nur anfängt zu arbeiten wenn der erste Wert größer als der zweite Wert ist.
Ansonsten wird sie sofort verlassen(rest bleibt unsortiert)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| begin repeat ok:=True; for i:=1 to 5 do begin if zahl[i]>zahl [i + 1] then begin zw:=Zahl[i]; Zahl[i]:=Zahl[i + 1]; Zahl[i + 1]:=zw; ok:=False; end; end; until ok=True; end; |
habe schon überlegt was ich da machen könnte, dachte mir:
repeat-->
until ok=true or i=5
geht aber nicht!
Ideen?
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt
Christian S. - Mi 10.12.03 21:30
Hallo!
eines vorweg: bitte gewöhne es Dir an, Delphi- statt Code-Tags zu verwenden. So langsam wird es langweilig, das immer zu ändern. ;-)
Die Sortierfunktion ist schon richtig. Die bedingte Anweisung tauscht ja zwei Werte. Und das soll ja nur gemacht werden, wenn es der erste größer als der zweite ist. Sonst muss man die ja nicht tauschen, ist ja schon die richtige Reihenfolge.
Oder meintest Du etwas anderes?
Inspecta - Mi 10.12.03 21:41
ich versteh zwar nich was du damit meinst!
"Delphi- statt Code-Tags zu verwenden"???
Stimmt schon aber nur dann wird ok auf false gesetzt!
Wenn es auf true bleibt, wird die schleife doch verlassen.
täusche ich mich da?! ich komme jetzt voll durcheinander.
passt das nun mit dem ok und der austrittsbedinggung?
Wenn ja wo kann das Problem sein?
Christian S. - Mi 10.12.03 21:53
Erst einmal zu den Tags:
Du hast Deinen Quelltext bisher so in Deine Postings eingebunden:
[code*]
//Irgendwas
[/code*]
Dann gibt es aber kein Syntax-Highlighting. Besser ist es, das so zu machen:
[delphi*]
//Irgendwas
[/delphi*]
(jeweils natürlich ohne den *)
Wenn Du es nicht tippen willst: die Schaltfläche dafür ist rechts neben der für die Code-Tags.
Okay, nun zu Deiner Frage:
Der Quellcode stimmt so:
Du hast die Repeat-Schleife ganz außen. Diese Schleife wird dann verlassen, wenn die ok = true ist. Dies bedeutet, dass keine Vertauschung vorgenommen wurde, denn dann wäre der Befehl ok:=False ausgeführt worden. Wenn keine Vertauschung vorgenommen wurde, sind die Zahlen sortiert.
In der Schleife wird erst einmal davon ausgegangen, dass die Zahlen sortieret sind ("ok:=true"). Dies wird dann mittels der For-Do-Schleife überprüft. Ist ein Element größer als ein Nachfolger ("if zahl[i ]>zahl [i + 1] then"), müssen diese beiden Zahlen getauscht werden und ok wird auf false gesetzt, weil die Schleife ja noch nicht sortiert war. Somit wird er am Ende nicht aus der Repeat-Schleife springen.
So, ich hoffe, jetzt ist es etwas klarer geworden, was dort passiert.
Lass doch einfach mal die 6 Zahlen an verschiedenen Stellen im Quelltext ausgeben, um herauszufinden, wo es schief geht. So kannst Du den Fehler eingrenzen.
Ach ja, mir ist nochwas aufgefallen: Randomize sollte nicht bei jedem ButtonClick aufgerufen werden, sondern nur beim Programmstart.
Inspecta - Mi 10.12.03 22:14
das mit randomize hat geholfen,nun werden die zahlen nicht mehr doppelt angezeigt(hab ziechmal getestet)!
Aber die anzahl der übereinstimmungen ist immer noch falsch!
wie kann ich das noch lösen?
irgendein ansatz?
Inspecta - Mi 10.12.03 22:20
Yuhu,alles klar!
Hab es selber geschaft!
Vielen Dank!
Hoffe das war es erstmal, und vielen Dank für die Hilfe und Geduld!
Arbeite jetzt noch an kleinigkeiten bei der Eingabe und hoffe das ich es alleine schaffe.
Christian S. - Mi 10.12.03 22:25
Also, erst einmal ein paar andere Anmerkungen:
Sowohl "dosort" als auch die Ausgabe in die Labels werden in der Schleife "for i:=1 ..." aufgerufen. Das heißt, das wird 6mal gemacht. Einmal reicht. Genauso "edit7.,text := ...". Das wird auch mehrmals gemacht.
Tja, ansonsten scheine ich heute nicht sehr gut im Fehlersuchen zu sein.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!