Programm zum Kopfrechnen üben (Borland, aber Compilerunabhängige Fragen)
-
Da meine Mutter Volksschullehrerin ist und ich ihr ein Programm versprochen habe mit dem ihre Schüler üben können habe ich mich mal an den PC gehockt und programmiert.
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Rechnen.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int Radiobuttonspeicher; int voneingabe; int biseingabe; int zahlsucheeins; int zahlsuchezwei; int Kontrolle; int zaehler; int richtig=1; int falsch=1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::RechenartenClick(TObject *Sender) { Label2->Caption=zaehler++; biseingabe = StrToInt(bis->Text); Label8->Caption= zaehler - (richtig + falsch); meldung->Caption="Richtig oder Falsch?"; meldung->Color=clBtnFace; Anfang2: randomize(); zahlsucheeins = random(biseingabe); zahlsuchezwei = random(biseingabe); if((zahlsucheeins < zahlsuchezwei) ) goto Anfang2; Zahl1->Caption = zahlsucheeins; Zahl2->Caption = zahlsuchezwei; switch(Rechenarten->ItemIndex) { case 0: Radiobuttonspeicher = 0; Rechenart->Caption="+"; break; case 1: Radiobuttonspeicher = 1; Rechenart->Caption="-"; break; case 2: Radiobuttonspeicher = 2; Rechenart->Caption="."; break; case 3: Radiobuttonspeicher = 3; Rechenart->Caption=":"; break; } } //--------------------------------------------------------------------------- void __fastcall TForm1::bisChange(TObject *Sender) { Label2->Caption=zaehler++; biseingabe = StrToInt(bis->Text); Label8->Caption= zaehler - (richtig + falsch); meldung->Caption="Richtig oder Falsch?"; meldung->Color=clBtnFace; Anfang1: randomize(); zahlsucheeins = random(biseingabe); zahlsuchezwei = random(biseingabe); if(zahlsucheeins < zahlsuchezwei) goto Anfang1; Zahl1->Caption = zahlsucheeins; Zahl2->Caption = zahlsuchezwei; //Design einstellungen!!! Rechenart->Left=224+Zahl1->Width; Zahl2->Left=224+Zahl1->Width+2+Rechenart->Width; istgleich->Left = 224 + Zahl1->Width + 5 + Rechenart->Width + 5 + Zahl2->Width; Ergebnis->Left = 224 + Zahl1->Width + 5 + Rechenart->Width + 5 + Zahl2->Width + 5 + istgleich->Width; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Label2->Caption=zaehler++; meldung->Caption="Richtig oder Falsch?"; meldung->Color=clBtnFace; Ergebnis->Text=""; Label8->Caption= zaehler - (richtig + falsch); Anfang: randomize(); zahlsucheeins = random(biseingabe); zahlsuchezwei = random(biseingabe); if(zahlsucheeins < zahlsuchezwei) goto Anfang; Zahl1->Caption = zahlsucheeins; Zahl2->Caption = zahlsuchezwei; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if(Rechenarten->ItemIndex == 0) { Kontrolle = zahlsucheeins + zahlsuchezwei; if(StrToInt(Ergebnis->Text) == Kontrolle) { if(meldung->Caption == "Richtig oder Falsch?") { Label5->Caption=richtig++; } meldung->Caption = "RICHTIG!!!!"; meldung->Color =clGreen; } else { if(meldung->Caption == "Richtig oder Falsch?") { Label6->Caption=falsch++; } meldung->Caption = "FALSCH :("; meldung->Color=clRed; } } if(Rechenarten->ItemIndex == 1) { Kontrolle = zahlsucheeins - zahlsuchezwei; if(StrToInt(Ergebnis->Text) == Kontrolle) { if(meldung->Caption == "Richtig oder Falsch?") { Label5->Caption=richtig++; } meldung->Caption = "RICHTIG!!!!"; meldung->Color =clGreen; } else { if(meldung->Caption == "Richtig oder Falsch?") { Label6->Caption=falsch++; } meldung->Caption = "FALSCH :("; meldung->Color=clRed; } } if(Rechenarten->ItemIndex == 2) { Kontrolle = zahlsucheeins * zahlsuchezwei; if(StrToInt(Ergebnis->Text) == Kontrolle) { if(meldung->Caption == "Richtig oder Falsch?") { Label5->Caption=richtig++; } meldung->Caption = "RICHTIG!!!!"; meldung->Color =clGreen; } else { if(meldung->Caption == "Richtig oder Falsch?") { Label6->Caption=falsch++; } meldung->Caption = "FALSCH :("; meldung->Color=clRed; } } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { if(Rechenarten->ItemIndex==0) Rechenart->Caption="+"; } //---------------------------------------------------------------------------Mein Problem: die Volkschüler in der 1. Klasse rechnen nicht über den 10ner darüber also keine Rechnungen wie 5+6 oder 3*5 etc. sonder 5+4 oder 3*3
ich habe das ganze mit iner if- schleife gelöst
if(Kontrolle > 10)
goto schleifeneu1 // schleifeneu1 gibt es natürlich nicht mehrJedoch ist das Problem dass der computer zu lange sucht und das Programm nur noch sehr langsam funktioniert.
Zu meiner Frage: Hat jemand eine andere lösung also die if-schleife die ewig dauert?
DANKE IM VORAUS
PS: neuling im Forum und in C++ mehr oder weniger auch
So sieht das Programm aus:
http://dulzky.du.funpic.de/CPP/programmansicht.PNG
-
Ahh, das erschlägt einen ja geradezu. Das ist so lang, das lese ich nicht durch. Aufgrund deiner Frage vermute ich, dass du Zufallszahlen in einem bestimmten Bereich suchst. Der modulo-Operator hilft:
int zufallszahl = offset + (rand() % reichweite);Das gibt dir eine Zufallszahl im Bereich [offset, offset + reichweite).
-
also die if-schleife die ewig dauert?
btw:
GUI Design solltest du auch noch ein wenig überarbeiten.
Ansonsten denke ich auch, dass die genannte Lösung das Problem beheben sollte.
-
Danke für die schnellen Antworten.
int zufallszahl = offset + (rand() % reichweite);habe ich schon mal gehabt, das problem wenn die Reichweite auf 10 gesetzt wird sind zahlen bis zehn möglich, da ich zufallszahl1+zufallszahl2 rechne geht es wieder über den "10er".
Natürlich kann ich die reichweite auf 5 setzen, jedoch ist die rechnung 6+3 (z.B) dadurch unmöglich.DANKE
-
Dann ziehe für die Addition z.B. die erste Zufallszahl aus den Zahlen von 0 bis 10 und die zweite Zufallszahl aus den Zahlen von 0 bis 10-zufallszahl1.
Wobei dann die gültigen Aufgabenstellung nicht alle gleichwahrscheinlich gewählt werden würden. Um das auch noch zu gewährleisten, könntest du z.B. alle gültigen Aufgaben erzeugen lassen, sie in einen Vektor packen, und dann einfach jeweils eine Aufgabe aus dem Vektor zufällig ziehen.
-
@life: danke habe gerade eine ähnliche Lösung gefunden

und so gelöst:
randomize(); Anfang: zahleins= random(biseingabe); zahlzwei= random(biseingabe); if(zahleins>zahlzwei) goto Anfang; ergebnis=zahlzwei-zahleins; Label1->Caption=ergebnis; Label2->Caption=zahleins; //---------------------------------------------- Eingabe=StrToInt(Edit1->Text); if(Eingabe==zahlzwei) { Label3->Caption="Richtig"; } else { Label3->Caption="Falsch"; }NOCHMALS HERZLICHEN DANK AN ALL EURE ANTWORTEN
-
Das goto Konstrukt ist fürchterlich, dafür gibt es entweder do-while oder while-do Schleifen. Ansonsten finde ich lifes Ansatz sehr gut, wenn du einfach zwei Zahlen addieren möchtest, deren Summe unter 10 liegt kannst du die Schleife komplett wegoptimieren:
1. Zufallszahl zwischen 1 und 8:
Da ich davon ausgehe, dass noch nicht mit 0 gerechnet wird ist 1 also der kleinste mögliche Summand #1. 8 ist der grösste Summand #2, da zu 9 nur noch 0 addiert werden kann, damit die Summe unter 10 bleibt, aber mit 0 noch nicht gerechnet wird.2. Zufallszahl zwischen 1 und (9 - Summand #1):
Damit stellst du sicher, dass die Summe immer unter 10 bleibt.
-
habe die goto Schleife jetzt ausgebessert.
Sieht echt nicht schön aus
danke