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..6of 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 //Diese For-Schelife müsstest du anpassen
    begin
      if testsort[i] > testsort [i + 1then //Testsort ist ein Array of Integer
      begin
        zw := testsort[i];
        testsort[i] := testsort[i + 1];
        testsort[i + 1] := zw;
        ok := False;                        
      end;
    end;
    //DoShow;  Irrelevant, da ich das nur zum anzeigen verwendet habe
  until ok = True;
  //DoShow; s.o.
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;
//  So heisst die Prozedur. Sie gehört in diesem Fall zu Form1.
//  Sie aber auch genausogut als procedure dosort; deklariert werden,
//  dann müsste man dies in einer eigenen ablegen und zur uses
//  Liste hinzufügen.


var 
  i, zw: Integer; 
  ok: Boolean;   // hier fehlte das Semilokon ;-)

//  Hier werden die Laufvariable i, der Zwischenspeicher zw und der
//  Status des zu sortierenden arrays deklariert.


begin 
  repeat 
//  Es wird mit etwas begonnen und solange wiedrholt bis eine
//  Abbruchbedingung erfüllt ist. Geeigenterweise ist dies in diesem Fall:
//  Ein Durchgang bei dem nichts mehr sortiert werden kann -> Das
//  array ist sortiert.

    ok := True;  // Als Initialwert steht das array auf "sortiert".



    for i := 0 to 19 do
//  hier wird in einer Schleife das Sortieren durchgeführt. 19 ist in
//  diesem Fall die Anzahl der Elemente die sortiert werden sollen.
// mit testsort.length, bzw. testsort.items.count oder so (bin mir da
//  jetzt gerade nicht ganz sicher), sollte man das aber auch allgemeiner
//  lösen können ?!


    begin 


      if testsort[i] > testsort [i + 1then
//  Testsort ist ein Array of Integer.
//  Hier wird sortiert. Es werden zwei Elemente betrachtet und jeweils
//  in die richtige Reihenfolge zueinander gebracht....



      begin 
        zw := testsort[i]; 
        testsort[i] := testsort[i + 1]; 
        testsort[i + 1] := zw; 
//  ... und zwar genau hier. Wie das geht sollte trivial sein ;-)



        ok := False;                         
//  und da sortiert werden musste, ist ok natürlich false.


      end
    end
    
  until ok = True; 
//  hier ist eine Schwäche des Bubblesort. Da beim letzten nötigen Sortiervorgang OK auf false gesetzt wurde, wird, obwohl das array bereits sortiert ist ein weiterer Vergleich durchgeführt(bei dem ok dann logischerweise auf true bleibt).

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;
// Deklaration.


function sortieren(chaos : array [1..6of 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 + 1then 
      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];

//  Hier wird das Sortierte Array auf das Resulatat-array übertragen..
//  ACHTUNG: Bei array funktioniert eine Zuweisung nch dem Schema
//  x := y; nicht !!! es wird nur von beiden arrayvariablen nun auf ein und
//  dasselbe array verwiesen. (Ändert sich x, ändert sich auch y. Das
//  array ist nur einmal im Speicher).
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-Quelltext
1:
chaos.sortieren;                    

Delphi lässt einem da vieeele Möglichkeiten..


Catweasel

Moderiert von user profile iconTino: 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Tipp,Zahl : Array[1..6of 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 + 1then
      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 user profile iconTino: 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Tipp,Zahl : Array[1..6of 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 + 1then
      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 user profile iconPeter 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 + 1then
      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 user profile iconPeter 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.