| Autor |
Beitrag |
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 25
|
Verfasst: Mi 10.12.03 19:54
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 25
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 25
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 25
|
Verfasst: 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 
      
Beiträge: 25
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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".
|
|