Entwickler-Ecke
Sonstiges (Delphi) - rechenspiel!
A_Checker - So 21.03.10 14:20
Titel: rechenspiel!
Hey,
ich soll für informatik ein programm programmieren, wo man ein wenig kopfrechnen übt. man kann zwischen allen 4 rechenarten wählen(checkboxes). dann hab ich 2 button, einmal mit nächster aufgabe und auswertung. das mit den aufgaben das funktioniert und leider die auswertung nicht. delphi zeigt mir leider auch keine fehlermeldung an :s..
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:
| procedure TForm1.Button1Click(Sender: TObject); begin label2.Caption:= ' '; randomize; repeat z := random(4)+1; zugelassen := false;
case z of 1: if (checkbox1.checked = true) then zugelassen := true; 2: if (checkbox2.checked = true) then zugelassen := true; 3: if (checkbox3.checked = true) then zugelassen := true; 4: if (checkbox4.checked = true) then zugelassen := true; end; until zugelassen = true ;
if z = 1 then begin a := random(500) + 1; b := random(500) + 1; z1 := a+b; label1.caption := inttostr(a) + ' + ' + inttostr(b); end;
if z = 2 then begin a := random(500) + 1; b := random(500) + 1; z2 := a-b; label1.caption := inttostr(a) + ' - ' + inttostr(b); end;
if z = 3 then begin a := random(500) + 1; b := random(500) + 1; z3 := a*b; label1.caption := inttostr(a) + ' x ' + inttostr(b); end;
if z = 4 then begin a := random(500) + 1; b := random(500) + 1; z4 := a/b; label1.caption := inttostr(a) + ' : ' + inttostr(b); end;
end;
procedure TForm1.Button2Click(Sender: TObject); begin
n:= strtoint(edit1.text);
if n=z1 then begin label2.caption := 'RICHTIG! Sehr gut!' end else begin label2.caption := 'FALSCH!' + 'Richtig wäre ' + floattostr(z1)+'!'; end;
if n=z2 then begin label2.caption := 'richtig! Sehr gut!' end else begin label2.caption := 'falsch!' + 'Richtig wäre ' + floattostr(z2)+'!'; end;
if n=z3 then begin label2.caption := 'richtig! Sehr gut!' end else begin label2.caption := 'falsch!' + 'Richtig wäre ' + floattostr(z3)+'!'; end;
if n=z4 then begin label2.caption := 'richtig! Sehr gut!' end else begin label2.caption := 'falsch!' + 'Richtig wäre ' + floattostr(z4)+'!'; end;
end;
end. |
Moderiert von
Christian S.: Topic aus Off Topic verschoben am So 21.03.2010 um 13:26
Delete - So 21.03.10 14:23
Und wenn Delphi keine Fehlermeldung anzeigt, was heißt dann "funktioniert nicht"?
ALF - So 21.03.10 14:31
Hi, darf ich fragen wo in der procedure TForm1.Button2Click(Sender: TObject) die Variablen z1-z4 gesetzt werden?
Wenn Du sie vergleichen willst von Deiner 1.Procedure musst Du sie Public machen (global), damit Du sie auch in der 2.Procedure vergleichen kannst!
Gruss ALf
Jakob_Ullmann - So 21.03.10 14:32
Kann ja auch rein logisch nicht funktionieren. Es ist ganz einfach unpraktisch, z1 bis z4 zu definieren. Ein Ergebnis reicht. Übrigens:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| case z of 1: if (checkbox1.checked = true) then zugelassen := true; 2: if (checkbox2.checked = true) then zugelassen := true; 3: if (checkbox3.checked = true) then zugelassen := true; 4: if (checkbox4.checked = true) then zugelassen := true; end; |
ist aus mehreren Gründen schlecht, zum einen wegen Vergleich auf true und zum anderen auch wegen der Übersichtlichkeit. Zufallszahlen haben da nichts zu suchen. Besser wäre:
Delphi-Quelltext
1: 2: 3: 4: 5:
| z := 0; repeat inc(z); zugelassen := TCheckBox(FindComponent('CheckBox' + IntToStr(z))).Checked; until zugelassen; |
Zur Auswertung: Guck dir einfach noch mal an, was du dort geschrieben hast.
A_Checker - So 21.03.10 14:37
z1-z4 hab ich schon global angegeben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var Form1: TForm1; var zugelassen: boolean; var z, a, b: integer; var n, z1, z2, z3, z4: real;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin label2.Caption:= ' '; |
mein problem ist, das er immer als lösung sagt: Falsch! Richtig wäre 0!
@ Jakob_Ullmann:
ohje, so weit sind wir noch nicht. programmiere mit delphi erst seit februar. das mit den rechenarten funktioniert ja. nur wie schon gesagt, wenn man auf auswerten klickt, gibt er nicht die richtige antwort aus.
Delete - So 21.03.10 14:43
Du vergleichst eine Fließkommazahl mit einer Ganzzahl. Ich glaube, das kann nicht funktionieren, da die Fließkommazahl immer noch Nachkommastellen hat und somit nie gleich der Ganzzahl sein kann. Und selbst, wenn du zwei Fließkommazahlen vergleichst werden dir interne Rundungsfehler einen Strich durch die Rechnung machen.
Kha - So 21.03.10 16:23
Jakob_Ullmann hat folgendes geschrieben : |
| Zufallszahlen haben da nichts zu suchen. |
Und wie erreicht man dann eine zufällige Auswahl :nixweiss: ? Man
könnte natürlich noch Fisher-Yates einwerfen, aber von der Logik her ist am bisherigen Code nichts auszusetzen.
@
A_Checker: Wie Jakob vorgeschlagen hat, solltest du statt z1 bis z4 eine einzige Variable
ergebnis o.Ä. nutzen. Und zwar als Integer, um die von Luckie angesprochenen Rundungsfehler zu umgehen. Bei der Division musst du dann zwar dafür sorgen, dass a durch b teilbar ist, aber das ist wahrscheinlich sowieso besser so. Oder was soll der User bei der Aufgabe "1:3" eingeben ;) ?
Jakob_Ullmann - So 21.03.10 16:38
Kha hat folgendes geschrieben : |
Jakob_Ullmann hat folgendes geschrieben : | | Zufallszahlen haben da nichts zu suchen. | Und wie erreicht man dann eine zufällige Auswahl :nixweiss: ? Man könnte natürlich noch Fisher-Yates einwerfen, aber von der Logik her ist am bisherigen Code nichts auszusetzen. |
Ich glaube, du hast mich falsch verstanden, aber ich bezog das lediglich auf den zitierten Code. Da wird offenbar das hier versucht:
- probiere so lange, eine Zufallszahl zu generieren, bis du feststellst, dass die entsprechende CheckBox gecheckt wurde.
Dabei ist z wie es ausschaut aber auch die Rechenoperation. Meinst du nicht auch, es wäre hier einfacher und auch logisch korrekter, einfach z von 1 bis 4 laufen zu lassen? :nixweiss:
SvenAbeln - So 21.03.10 17:09
Jakob_Ullmann hat folgendes geschrieben : |
Dabei ist z wie es ausschaut aber auch die Rechenoperation. Meinst du nicht auch, es wäre hier einfacher und auch logisch korrekter, einfach z von 1 bis 4 laufen zu lassen? :nixweiss: |
Da Z für die Rechenarten steht hat das Random schon seinen Sinn, es wird dadurch eine Zufällige Aufgabe gewählt.
Sind z.B. alle Checkboxen gewählt ergibt sich halt zufällig eine Aufgabe mit +, -, *, / .
Wenn z aber von 1-4 durchläuft, bis die erste Checkbox gefunden ist, ergibt sich
immer eine Aufgabe mit + .
@
A_Checker:
Deine Auswertung liefert immer Falsche Ergebnisse, da du dabei nicht berücksichtigst welche Rechenart verwendet werden soll. Du überprüfst einfach alle Varianten und das letzte Ergebnis wird ausgegeben
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.Button2Click(Sender: TObject); begin n:= strtoint(edit1.text);
if n=z1 then [...] if n=z2 then [...] if n=z3 then [...] if n=z4 then [...] |
Wie schon von anderen geschrieben, solltest du z1-z4 durch eine einzige Variable Ergebnis ersetzen.
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!