Knobeleien

Komplexaufgaben

K1: Gehirn-Jogging

Created with Sketch.

In dieser Aufgabe sollst du ein kleines Lernprogramm entwickeln, mit dem man die Multiplikation (von zwei Zahlen) trainieren kann. 

(Hinweis: Das Programm, das du schreiben sollst, kennst du vielleicht als Teil von Dr. Kawashimas Gehirn- Jogging.)

Teil a: Mathe-Lernprogramm entwickeln

Das Programm soll dazu Aufgaben stellen, Ergebnisse dazu einlesen und überprüfen, ob diese richtig oder falsch sind. Die Anzahl der Fehler soll gezählt werden. Verwende bitte im Programm zwei Konstanten, eine für die Anzahl der Aufgaben, die gestellt werden (z.B. 10) und eine, die die Faktoren begrenzt (z.B. 20, um die Multiplikation bis 20*20 zu üben).


Die Ausgaben Ihres Programms könnten zum Beispiel so aussehen: 

   10 Aufgaben zur Multiplikation

      4 *  2 =  8

      9 *  3 = 27

      6 *  3 = 18

      4 *  1 =  4

      1 *  3 =  3

     10 *  7 = 70

      6 *  4 = 24

      4 *  4 = 16

      8 *  2 = 16

      8 *  9 = 72

 

    In deiner Berechnung waren 0 Fehler.  Toll!       

 

Zusatzinformation:  Wenn du das programmierst, benötigst du die Möglichkeit, eine Zufallszahl zu erzeugen. Dafür gibt es zwei Funktionen: 

 
- srand
: initialisiert eine Pseudo-Zufallszahl 

- rand erzeugt eine Pseudo-Zufallszahl zwischen 0 und der Konstanten RAND_MAX

Teil b:  Highscore-Liste speichern

Es soll der Name des Benutzers eingelesen werden und in einer Datei (highscore.dat) die erreichten Ergebnisse gespeichert werden. Es muss keine Sortierung erfolgen. Ein neuer Datensatz soll einfach ans Ende der Datei geschrieben werden.  Die Datei soll dabei so aufgebaut sein, dass in jeder Zeile folgendes steht:                        

Maria  1 

Thomas  0 

Alexandra 2 

 

Wenn ein Spieler mehrfach teilnimmt, dann sollen mehrere Ergebnisse in der Datei stehen.                

                                            

Zusatzaufgabe: Zeitmessungen integrieren

Werde kreativ und erweitere dein Programm jetzt um Zeitmessungen. Mit der Funktion time() aus der Bibliothek time.h können Zeiten (in Sekunden) gemessen werden, aus zwei gemessenen Zeiten lässt sich eine Zeitdifferenz ableiten. 

Diese Zeitdifferenz, also die Zeit, die der Benutzer zum Lösen der Aufgaben benötigt hat, soll dann auch mit in die Highscoreliste (zusätzlich zu den Namen und den Fehlern) gespeichert werden.

Erweitere bitte dein Programm dementsprechend. Danach kann getestet werden. 

Viel Spaß beim Programmieren! Wenn du jüngere Geschwister, Nichte/Neffen, Nachbarn hast, findest du vielleicht zusätzliche „Tester“ für dein Lernprogramm.

K2: ...

Created with Sketch.

Musterlösungen

L1: Gehirn-Jogging

Created with Sketch.

#include <iostream>

#include <iomanip>

#include <string>

#include <fstream>

#include <time.h>

using namespace std;

 

int main(){

 

    // Das Mathetrainingsprogramm soll eingesetzt werden, um das 1*1 zu ueben 

 

    const int anzahl_aufgaben = 10;

    const int max_faktor = 10;

    string name, ignore;

 

    time_t start_zeit, end_zeit, zeit;

 

    int i, x, y, eingelesenes_ergebnis, anzahl_fehler;

    fstream highscoreliste;

 

    // Auslesen der Highscore-Liste (sofern vorhanden)

 

    highscoreliste.open("highscore.dat", ios::in);

 

    if (highscoreliste) {

        cout << "Bisherige Ergebnisse: " << endl << endl;

        while (!highscoreliste.eof()) {

            highscoreliste >> name;

            highscoreliste >> anzahl_fehler;

            highscoreliste >> zeit; 

 

            cout << " Name: " << name << ", ";

            cout << " Fehler: " << anzahl_fehler << ", ";

            cout << " Zeit: " << zeit << endl;

        }

    }

    highscoreliste.close();

 

    cout << endl << endl << anzahl_aufgaben 

         << " Aufgaben zur Multiplikation "  << endl << endl;

    srand(time(NULL));

    anzahl_fehler = 0;

 

    // Anfangszeit speichern

    time(&start_zeit);

 

    for (i = 1; i <= anzahl_aufgaben; i++) {

 

        // x und y mit Zufallszahlen belegen und normieren

 

        x = rand() % max_faktor + 1;

        y = rand() % max_faktor + 1;

 

        // Aufgabe ausgeben, Ergebnis einlesen, vergleichen

 

        cout << endl << x << " * " << y << " = ";

        cin >> eingelesenes_ergebnis;

 

        if (eingelesenes_ergebnis != x*y) {

            anzahl_fehler++;

        }

    }

 

    time(&end_zeit);

 

    // Auswertung, Ausgabe der Fehler

 

    cout << endl << endl << endl

          << " In deiner Berechnung waren " << anzahl_fehler

          << "Fehler " << endl << endl; 

    if (anzahl_fehler == 0) {

        cout << "  Toll!" << endl;

    }

    else if (anzahl_fehler > anzahl_aufgaben / 2) {

        cout << "  Uebe doch am besten noch weiter! " << endl;

    }

 

    // Abspeichern der Highscore-Liste

 

    highscoreliste.open("highscore.dat", ios::app);

 

    fflush(stdin);

    cout << "  Gib bitte deinen Namen ein: ";

    getline(cin, name);

 

    if (!highscoreliste) {

        cout << "Fehler beim Speichern der Highscoreliste";

    }

    else {

        highscoreliste << " " << name;

        highscoreliste << " " << anzahl_fehler;

        highscoreliste << " " << end_zeit - start_zeit;

    }

 

    highscoreliste.close();

    cout << "  Bis zum naechsten Mal." << endl;

    return(0); 

}



L2: 

Created with Sketch.


Du hast eine Lösung? Dann schick sie uns!

Fragen, Anregungen?

Ist etwas unverständlich oder du hast Fragen zu einem Thema, Aufgabe oder einfach zur C++-Welt? 
Dann schreibe uns einfach eine Mail!