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
 1if (checkbox1.checked = true) then zugelassen := true;
 2if (checkbox2.checked = true) then zugelassen := true;
 3if (checkbox3.checked = true) then zugelassen := true;
 4if (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 user profile iconChristian 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
 1if (checkbox1.checked = true) then zugelassen := true;
 2if (checkbox2.checked = true) then zugelassen := true;
 3if (checkbox3.checked = true) then zugelassen := true;
 4if (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

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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.

@user profile iconA_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

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:

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 + .


@user profile iconA_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      // dieses Ergebnis wird nur dargestellt
[...]

Wie schon von anderen geschrieben, solltest du z1-z4 durch eine einzige Variable Ergebnis ersetzen.


Jakob_Ullmann - So 21.03.10 17:15

user profile iconSvenAbeln hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:

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 + .


Das hatte ich nicht bedacht. Hab irgendwie beim Lesen an RadioButtons und nicht an CheckBoxen gedacht. Wenn man's so nimmt, ist das natürlich richtig so.