Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Inspecta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Mi 10.12.03 19:54 
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:
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Inspecta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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)

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Inspecta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Inspecta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".