Autor Beitrag
A_Checker
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 21.03.10 13:20 
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..

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:
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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 21.03.10 13:23 
Und wenn Delphi keine Fehlermeldung anzeigt, was heißt dann "funktioniert nicht"?
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 21.03.10 13: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

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 21.03.10 13:32 
Kann ja auch rein logisch nicht funktionieren. Es ist ganz einfach unpraktisch, z1 bis z4 zu definieren. Ein Ergebnis reicht. Übrigens:

ausblenden 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 21.03.10 13:37 
z1-z4 hab ich schon global angegeben:

ausblenden 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 21.03.10 13: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 21.03.10 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 21.03.10 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: So 21.03.10 16: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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 21.03.10 16: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.