| Autor |
Beitrag |
A_Checker
Hält's aus hier
Beiträge: 14
|
Verfasst: 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..
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 21.03.10 13:23
Und wenn Delphi keine Fehlermeldung anzeigt, was heißt dann "funktioniert nicht"?
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 14
|
Verfasst: So 21.03.10 13: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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 21.03.10 15:23
Jakob_Ullmann hat folgendes geschrieben : | | Zufallszahlen haben da nichts zu suchen. |
Und wie erreicht man dann eine zufällige Auswahl  ? 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 21.03.10 15:38
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: So 21.03.10 16: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?  |
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.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 21.03.10 16:15
|
|
|