Wieder was die Welt nicht braucht :)
-
Bin noch neu und auch noch nicht besonders gut in c++. Hab folgendes geschrieben und hab ein paar fragen...
#include <iostream> #include <time.h> #include <conio.h> using namespace std; void addition(); void subtraktion(); void division(); void multiplikation(); void klammer(); int main() { char Auswahl; do { cout << "\t\tRechenuebungen\n" << endl; cout << "\t(A)ddition"<< endl; cout << "\t(S)ubtraktion"<< endl; cout << "\t(D)ivision"<< endl; cout << "\t(M)ultiplikation"<< endl; cout << "\t(K)lammerrechnung"<< endl; cout << "\t(B)eenden"<< endl; cin >> Auswahl; switch (Auswahl) { case'a': case'A': addition(); break; case's': case'S': subtraktion(); break; case'D': case'd': division(); break; case'M': case'm': multiplikation(); break; case'k': case'K': klammer(); break; case 'b': case 'B': cout << "Beendet" << endl; break; default: cout << "Falsche Eingabe" << endl; } getch(); system ("cls"); }while (Auswahl !='b' && Auswahl !='B'); return 0; } void klammer() { int Zahl1,Zahl2, Zahl3, Zahl4, Zahl5; int Ergebnis; for (int i=0;i<10;i++) { srand(time(NULL)); // Zufallszahl Zahl1=(rand()) %50+1; Zahl2=(rand()) %20+1; Zahl3=(rand()) %30+1; Zahl4=(rand()) %10+1; Zahl5=(rand()) %10+1; cout << "("<<Zahl1<<"*"<<Zahl2<<"-"<<Zahl3<<")+("<<Zahl4<<"-"<<Zahl5<<")="; // Rechnungsausgabe cin >>Ergebnis; if ((Zahl1*Zahl2-Zahl3)+(Zahl4-Zahl5) == Ergebnis) //Rechnung cout << "Richtig"<<endl; else cout << "Falsch"<<endl; } } void multiplikation() { int Zahl1,Zahl2, Zahl3, Zahl4, Zahl5; int Ergebnis; for (int i=0;i<10;i++) { srand(time(NULL)); // Zufallszahl Zahl1=(rand()) %10+1; Zahl2=(rand()) %20+1; Zahl3=(rand()) %30+1; Zahl4=(rand()) %10+1; Zahl5=(rand()) %10+1; cout << ""<<Zahl1<<"*"<<Zahl2<<"*"<<Zahl3<<"*"<<Zahl4<<"*"<<Zahl5<<"="; // Rechnungsausgabe cin >>Ergebnis; if ((Zahl1*Zahl2*Zahl3*Zahl4*Zahl5) == Ergebnis) //Rechnung cout << "Richtig"<<endl; else cout << "Falsch"<<endl; } } void division() { int Zahl1,Zahl2; float Ergebnis; for (int i=0;i<10;i++) { srand(time(NULL)); // Zufallszahl Zahl1=(rand()) %100+1; Zahl2=(rand()) %20+1; cout << ""<<Zahl1<<"/"<<Zahl2<<"="; // Rechnungsausgabe cin >>Ergebnis; if ((Zahl1/Zahl2) == Ergebnis) //Rechnung cout << "Richtig"<<endl; else cout << "Falsch"<<endl; } } void addition() { int Zahl1,Zahl2, Zahl3, Zahl4, Zahl5; int Ergebnis; for (int i=0;i<10;i++) { srand(time(NULL)); Zahl1=(rand()) %20+1; Zahl2=(rand()) %10+1; Zahl3=(rand()) %20+1; Zahl4=(rand()) %50+1; Zahl5=(rand()) %80+1; cout << "("<<Zahl1<<"+"<<Zahl2<<"+"<<Zahl3<<")+("<<Zahl4<<"+"<<Zahl5<<")="; cin >>Ergebnis; if ((Zahl1+Zahl2+Zahl3+Zahl4+Zahl5) == Ergebnis) cout << "Richtig"<<endl; else cout << "Falsch"<<endl; } } void subtraktion() { int Zahl1,Zahl2, Zahl3, Zahl4, Zahl5; int Ergebnis; for (int i=0;i<10;i++) { srand(time(NULL)); // Zufallszahl Zahl1=(rand()) %100+1; Zahl2=(rand()) %20+1; Zahl3=(rand()) %30+1; Zahl4=(rand()) %10+1; Zahl5=(rand()) %10+1; cout << ""<<Zahl1<<"-"<<Zahl2<<"-"<<Zahl3<<"-"<<Zahl4<<"-"<<Zahl5<<"="; // Rechnungsausgabe cin >>Ergebnis; if ((Zahl1-Zahl2-Zahl3-Zahl4-Zahl5) == Ergebnis) //Rechnung cout << "Richtig"<<endl; else cout << "Falsch"<<endl; } }1-Warum komm ich in eine endlos schleife wenn ich statt einer Zahl ein buchstabe eingebe als Ergebnis und wie kann ich das beheben.
2.- Muss ich die Zufallszahlen immer wieder neu erstellen oder könnte man die mit einer Funktion erstellen und einbinden
3.- Kann man den Operator bei den Klammerrechnungen auch per zufall erstellen lassen?Danke schonmal an die Leute die sich die mühe machen mir zu antworten
-
1. Weil operator >> die Zeichen nicht aus dem Eingabestrom nimmt, wenn du etwas eingibst was nicht zum Typ passt.
if (!cin.good()) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ignoriert eine Zeile }2. Ich verstehe offen gesagt nicht ganz was du vor hast, aber das geht bestimmt. Erklär das mal genauer.
3. Nein, du kannst keinen Code zur Laufzeit generieren. Du kannst aber natürlich den Operator auf Basis einer Zufallszahl auswählen.
4. Du solltest [ cpp ] statt [ code ] Tags nutzen, dann wird dein Code schön bunt.
-
<title>C/C++ Forum :: Wieder was die Welt nicht braucht :)</title>
z.B. einen thread mit einem Titel, der nix mit der Sache zu tun hat.
-
Hey
Mir war mal wieder langweilig.
Schon schlimm.#include <iostream> #include <ctime> #include <cstdlib> enum Operator { plus, minus, mal, geteilt }; void gebe_aufgabe_aus(int zahl1, int zahl2, Operator operat) { char op = ' '; switch(operat) { case plus: op = '+'; break; case minus: op = '-'; break; case mal: op = '*'; break; case geteilt: op = '/'; break; } std::cout << zahl1 << op << zahl2 << " = "; } int errechne_ergebnis(int zahl1, int zahl2, Operator op) { switch(op) { case plus: return zahl1+zahl2; break; case minus: return zahl1-zahl2; break; case mal: return zahl1*zahl2; break; case geteilt: return zahl1/zahl2; break; } return 0; } void weise_angeglichene_werte_zu(int& zahl1, int& zahl2, Operator op) { switch(op) { case plus: case minus: zahl1 = std::rand() % 300; zahl2 = std::rand() % 300; break; case mal: zahl1 = std::rand() % 100; zahl2 = std::rand() % 30; break; case geteilt: while(true) { zahl1 = std::rand() % 800; zahl2 = std::rand() % 800; if(zahl1 != 0 && (zahl1 % zahl2) == 0 && zahl1 != zahl2) break; } break; } } int main() { std::srand(std::time(0)); int punkte = 0; for(int i = 0; i < 10; ++i) { std::cout << "\nAufgabe Nr. " << i+1 << " von 10.\n\n"; Operator op = Operator(std::rand() % 4); int zahl1, zahl2; weise_angeglichene_werte_zu(zahl1, zahl2, op); gebe_aufgabe_aus(zahl1, zahl2, op); int richtig = errechne_ergebnis(zahl1, zahl2, op), eingabe; while(!(std::cin >> eingabe)) { std::cin.clear(); std::cin.ignore(1000, '\n'); } if(eingabe == richtig) { std::cout << "Richtig!\n"; ++punkte; } else std::cout << "Falsch!\n"; } std::cout << "Richtig: " << punkte << " von 10.\n"; std::cin.ignore(1000, '\n'); std::cin.get(); }Viel Spaß damit.
-
Danke!
Hab wieder was gelernt
-
*Hust* x modulo 0 *Hust*
case geteilt: while(true) { zahl1 = std::rand() % 800; zahl2 = std::rand() % 800; if(zahl1 != 0 && (zahl1 % zahl2) == 0 && zahl1 != zahl2) break; }
-
Ja, da stand vorher tatsächlich auch ne Überprüfung, ob auch zahl2 0 ist.
Aber da das auf meinem gcc keinen Unterschied macht, dachte ich, man kanns auch weglassen und habs wegeditiert.
Hab aber auch grad gelesen, ist undefiniertes Verhalten.
Wieder was gelernt, denn ich hätte irgendwie eine Teilung durch 0 und damit nen Programmabsturz erwartet, das sieht der GCC aber anscheinend nicht so.