# Aufgabe eines Kopfrechentrainers



## BioxX (1. Mai 2020)

Guten Tag liebe Comm. 

Also, ich habe für heute eine Hausaufgabe, aber ich weiß nicht wie ich es lösen soll, da ich von Anfang an Probleme hatte, und wir jetzt so weit sind, dass ich gar nicht mehr mitkomme. Muss sowieso von Grund auf alles selber nachlernen, damit ich mit der Klasse im selben Niveau bin. Na ja... mal schauen wie ich das machen soll, habe zwar auf YouTube ein Java Tutorial gefunden, kann mir das aber nicht einprägen, da keine Übungen mit dabei sind. 

Kommen wir zu meiner Hausaufgabe. Ich habe einen Muster Quellcode von der vorherigen Hausaufgabe genommen, und wollte dann damit den Code erweitern, dass das Programm mir eine Aufgabe stellt. Im Internet habe ich schon etwas zu Zufallszahlen gefunden, weiß aber irgendwie nicht wie das so richtig funktionieren soll. 

Die Aufgabe:


Spoiler



Erweitere Deinen Taschenrechner oder eine der Musterlösungen zu einem Kopfrechnen-Trainingsprogramm: 

Das Programm erzeugt zwei Zufallszahlen zwischen -99 und 99.  
Mit den beiden Zahlen wird dem Benutzer eine Aufgabe gestellt.  
Die korrekte Lösung wird durch die Taschenrechner-Methoden berechnet und gespeichert. 
Der Benutzer gibt seine Lösung ein.  
Ist die Lösung richtig, wird ein Glückwunsch ausgegeben.  
Ist die Lösung falsch: 
Ausgabe leider falsch 
Ausgabe des richtigen Ergebnisses 

Mögliche Ausgaben für die Berechnung: 
Bitte berechne die folgende Aufgabe 4 + 54
58
Sehr gut gerechnet.

Bitte berechne die folgende Aufgabe 90 + 74
4
Das Ergebnis "4" ist leider falsch. Das richtige Ergebnis lautet: 164


Der Code:


Spoiler



package newpackage;

import java.util.Scanner;
import java.util.Random;

public class Kopfrechentrainer {

    public static void main(String[] args) {

        Scanner eingabe = new Scanner(System.in);
        randomdigit(-99, 99);
        int ergebnisaddiert;
        int ergebnissubtrahiert;
        int ergebnismultipliziert;
        int ergebnisdividiert;
        int ergebnismodulo;
        int zahl1 = 0;
        int zahl2 = 0;

        boolean repeat = true;
        boolean ergebnisr = true;
        boolean ergebnisf = false;

        // Auswahl der Rechenmethode 
        do {

            System.out.println("Bitte berechne die folgende Aufgabe ");

            System.out.println("Wählen Sie eine beliebige Rechenmethode aus:");

            System.out.println("Addiert         0");

            System.out.println("Subtrahiert     1");

            System.out.println("Multipliziert   2");

            System.out.println("Dividiert       3");

            System.out.println("Modulo          4");

            System.out.println("Geben Sie die Zahl der jeweiligen Rechenmethode an.");

            int eingabe_user = eingabe.nextInt();

            System.out.println("Geben Sie die erste Zahl an, die berechnet werden soll.");

            zahl1 = eingabe.nextInt();

            System.out.println("Geben Sie nun die zweite Zahl an.");

            zahl2 = eingabe.nextInt();

            System.out.println("");

            // Ausgabe der Berechnung
            switch (eingabe_user) {

                case 0:

                    ergebnisaddiert = addieren(zahl1, zahl2);

                    System.out.println("Ergebnis Addition: " + zahl1
                            + " + " + zahl2 + " = " + ergebnisaddiert);

                    System.out.println("");

                    break;

                case 1:

                    ergebnissubtrahiert = subtrahieren(zahl1, zahl2);

                    System.out.println("Ergebnis Subtraktion: " + zahl1
                            + " - " + zahl2 + " = " + ergebnissubtrahiert);

                    System.out.println("");

                    break;

                case 2:

                    ergebnismultipliziert = multipliziert(zahl1, zahl2);

                    System.out.println("Ergebnis Multiplikation: " + zahl1
                            + " * " + zahl2 + " = " + ergebnismultipliziert);

                    System.out.println("");

                    break;

                case 3:

                    ergebnisdividiert = dividiert(zahl1, zahl2);

                    System.out.println("Ergebnis Division: " + zahl1
                            + " / " + zahl2 + " = " + ergebnisdividiert);

                    System.out.println("");

                    break;

                case 4:

                    ergebnismodulo = modulo(zahl1, zahl2);

                    System.out.println("Ergebnis Modulo: " + zahl1
                            + " % " + zahl2 + " = " + ergebnismodulo);

                    System.out.println("");

                    break;

            }

        } while (repeat);

    }

// Hier werden die Zahlen, die verwendet wurden, ausgerechnet. 
    private static int addieren(int zahl1, int zahl2) {

        return zahl1 + zahl2;

    }

    private static int subtrahieren(int zahl1, int zahl2) {

        return zahl1 - zahl2;

    }

    private static int multipliziert(int zahl1, int zahl2) {

        return zahl1 * zahl2;

    }

    private static int dividiert(int zahl1, int zahl2) {

        return zahl1 / zahl2;

    }

    private static int modulo(int zahl1, int zahl2) {

        return zahl1 % zahl2;

    }

    static void randomdigit(int untereGrenze, int obereGrenze) {
        Random zufall = new Random(); // neues Objekte der Random Klasse
        int zufallZahl = zufall.nextInt(obereGrenze); // next Int Methode mit Argument

        while (zufallZahl < untereGrenze) { // Beding. zufallsZahl muss kleiner als Argument sein
            zufallZahl = zufall.nextInt(obereGrenze); // finde nächste Zahl


        }
        System.out.println(zufallZahl); // Gib Zufallszahl aus
    }
}


Vielen Dank im Voraus für eure Hilfe!


----------



## krgewb (1. Mai 2020)

Bitte immer in Code-Tags posten.

```
package newpackage;

import java.util.Scanner;
import java.util.Random;

public class Kopfrechentrainer {

    public static void main(String[] args) {

        Scanner eingabe = new Scanner(System.in);
        randomdigit(-99, 99);
        int ergebnisaddiert;
        int ergebnissubtrahiert;
        int ergebnismultipliziert;
        int ergebnisdividiert;
        int ergebnismodulo;
        int zahl1 = 0;
        int zahl2 = 0;

        boolean repeat = true;
        boolean ergebnisr = true;
        boolean ergebnisf = false;

        // Auswahl der Rechenmethode
        do {
            System.out.println("Bitte berechne die folgende Aufgabe ");
            System.out.println("Wählen Sie eine beliebige Rechenmethode aus:");
            System.out.println("Addiert 0");
            System.out.println("Subtrahiert 1");
            System.out.println("Multipliziert 2");
            System.out.println("Dividiert 3");
            System.out.println("Modulo 4");
            System.out.println("Geben Sie die Zahl der jeweiligen Rechenmethode an.");
            int eingabe_user = eingabe.nextInt();
            System.out.println("Geben Sie die erste Zahl an, die berechnet werden soll.");
            zahl1 = eingabe.nextInt();
            System.out.println("Geben Sie nun die zweite Zahl an.");
            zahl2 = eingabe.nextInt();
            System.out.println("");
            // Ausgabe der Berechnung
            switch (eingabe_user) {
            case 0:
                ergebnisaddiert = addieren(zahl1, zahl2);
                System.out.println("Ergebnis Addition: " + zahl1 + " + " + zahl2 + " = " + ergebnisaddiert);
                System.out.println("");
                break;
            case 1:
                ergebnissubtrahiert = subtrahieren(zahl1, zahl2);
                System.out.println("Ergebnis Subtraktion: " + zahl1 + " - " + zahl2 + " = " + ergebnissubtrahiert);
                System.out.println("");
                break;
            case 2:
                ergebnismultipliziert = multipliziert(zahl1, zahl2);
                System.out.println("Ergebnis Multiplikation: " + zahl1 + " * " + zahl2 + " = " + ergebnismultipliziert);
                System.out.println("");
                break;
            case 3:
                ergebnisdividiert = dividiert(zahl1, zahl2);
                System.out.println("Ergebnis Division: " + zahl1 + " / " + zahl2 + " = " + ergebnisdividiert);
                System.out.println("");
                break;
            case 4:
                ergebnismodulo = modulo(zahl1, zahl2);
                System.out.println("Ergebnis Modulo: " + zahl1 + " % " + zahl2 + " = " + ergebnismodulo);
                System.out.println("");
                break;
            }
        } while (repeat);
    }
    // Hier werden die Zahlen, die verwendet wurden, ausgerechnet.
    private static int addieren(int zahl1, int zahl2) {
        return zahl1 + zahl2;
    }
    private static int subtrahieren(int zahl1, int zahl2) {
        return zahl1 - zahl2;
    }
    private static int multipliziert(int zahl1, int zahl2) {
        return zahl1 * zahl2;
    }
    private static int dividiert(int zahl1, int zahl2) {
        return zahl1 / zahl2;
    }
    private static int modulo(int zahl1, int zahl2) {
        return zahl1 % zahl2;
    }
    static void randomdigit(int untereGrenze, int obereGrenze) {
        Random zufall = new Random(); // neues Objekte der Random Klasse
        int zufallZahl = zufall.nextInt(obereGrenze); // next Int Methode mit Argument
        while (zufallZahl < untereGrenze) { // Beding. zufallsZahl muss kleiner als Argument sein
            zufallZahl = zufall.nextInt(obereGrenze); // finde nächste Zahl
        }
        System.out.println(zufallZahl); // Gib Zufallszahl aus
    }
}
```


----------



## MoxxiManagarm (1. Mai 2020)

BioxX hat gesagt.:


> Im Internet habe ich schon etwas zu Zufallszahlen gefunden, weiß aber irgendwie nicht wie das so richtig funktionieren soll.


Es ist echt schwer draus eine Frage herauszulesen. Was genau verstehst du nicht?



> Ich habe einen Muster Quellcode von der vorherigen Hausaufgabe genommen


Mein Herz blutet wenn man den obigen Quellcode als Mustercode bezeichnet


----------



## BioxX (1. Mai 2020)

> Es ist echt schwer draus eine Frage herauszulesen. Was genau verstehst du nicht?


Wie ich jetzt die Aufgabe löse, also, dass das Programm mir eine zufällige Zahl gibt, ich es ausrechnen soll und es dann im Programm eingebe. Das Programm soll dann prüfen, ob es richtig oder falsch ist. Wenn es falsch ist, wird das richtige Ergebnis ausgegeben, und wenn es richtig ist, wird mir gratuliert, dass ich es richtig gelöst habe.



> Mein Herz blutet wenn man den obigen Quellcode als Mustercode bezeichnet


Mein Herz auch. :'D


----------



## AndiE (1. Mai 2020)

Du musst dich erstmal entscheiden, was du willst: Im Zahlenbereich von 1 bis 10, ergeben sich:

17-9=8
3*7=21
3+8=11
72:8=9

Das kann man noch im Kopf rechnen. 

2048:64=32 u.Ä. dürfte da schon kompliziert werden. Das mag mit Taschenrechner gehen, aber nicht im Kopf. Du müsstest dich da also einschränken. Meinst du nur Strichrechnung?


----------



## MoxxiManagarm (1. Mai 2020)

> Wie ich jetzt die Aufgabe löse, also, dass das Programm mir eine zufällige Zahl gibt, ich es ausrechnen soll und es dann im Programm eingebe. Das Programm soll dann prüfen, ob es richtig oder falsch ist. Wenn es falsch ist, wird das richtige Ergebnis ausgegeben, und wenn es richtig ist, wird mir gratuliert, dass ich es richtig gelöst habe.



Dazu empfehle ich dir das sogenannte EVA Prinzip - Eingabe, Verarbeitung, Ausgabe. Überleg dir gut, was du anfänglich brauchst, welche Daten du zwischenspeichern musst und wie du sie verarbeitet. Wie das Programm eine Zufallszahl gibt, zeigt dir der "mustercode" innerhalb der randomdigit methode


----------



## MoxxiManagarm (1. Mai 2020)

Ich muss nochmal fragen, wer sagt dass das ein Mustercode ist? Ich hoffe nicht dein Prof


----------



## temi (2. Mai 2020)

AndiE hat gesagt.:


> Du müsstest dich da also einschränken. Meinst du nur Strichrechnung?


Das steht doch alles in der Aufgabe, oder?


----------



## BioxX (2. Mai 2020)

@AndiE - Eigentlich ist alles oben schon beschrieben, und eine Mustercode für eine Kopfrechenaufgabe habe ich auch schon im Internet gefunden (ist im Quellcode verzeichnet mit "randomdigit(-99, 99);"). Nur mein Problem ist, wie soll ich es machen, dass das Programm mir eine zufällige Aufgabe zwischen -99 und 99 stellt?
@MoxxiManagarm - Das mit dem "randomdigit" habe ich selber unbenannt, da ich die Methode im Internet gefunden habe, der restliche Code ist alt ein Muster von einem anderen Schüler.


----------



## MoxxiManagarm (2. Mai 2020)

Ich weiß nicht was ich dir noch sagen soll. Dir scheint total fundimentales Wissen zu fehlen. Damit meine ich Zuweisungen, Methoden, Rückgabewerte etc.

Du brauchst 3 Zufallswerte. 2 davon sind die operanten im Bereich [-99,99]. Der dritte im Bereich [1,4] steht für die Operation. Dann berechnest du das Ergebnis und speicherst es abermals. Anschließend lässt du den Nutzer eine Zahl eingeben und vergleichst die eingegebene Zahl mit dem berechneten Ergebnis. Alles mit entsprechenden Konsolenausgaben.


----------



## temi (3. Mai 2020)

In der aktuellen Musterlösung gibt es drei Eingaben, die der Benutzer über die Methode nextInt() vornimmt. Im Prinzip sollen diese Eingaben nicht mehr durch den Benutzer, sondern per Zufall erfolgen. Du benötigst also z.B. eine Methode randomdigit() oder getRandomDigit(), welche die nextInt() ersetzt. Für getRandomDigit() ist das bereist von @MoxxiManagarm genannte Stichwort "Rückgabewert".


----------



## MoxxiManagarm (3. Mai 2020)

Ich komme dir etwas entgegen. Schmeiß deine randomdigit Methode, so wie sie aktuell ist, weg und ersetze sie durch diese:


```
static int randomdigit(int untereGrenze, int obereGrenze) {
  return new Random().nextInt((obereGrenze - untereGrenze) + 1) + untereGrenze;
}
```

Diese Methode hat keinen void return type mehr, sondern gibt einen int zurück. Diesen Wert kannst du einer Variable zuweisen, z.B. so:

```
int leftOperant = randomDigit(-99, 99);
```

Auf die gleiche Weise tust du das mit den anderen Zufallswerten.

Hier nochmal die Bitte, eigne dir unbedingt grundsätzliche Sprachmittel an, sonst können die Leute im Forum dir auch nur sehr eingeschränkt helfen.


----------



## White_Fox (3. Mai 2020)

Da ich irgendwie keine Lust habe, an meinem eigenen Programm zu arbeiten, bin ich mal so frei und liefere einen Lösungsvorschlag. Als Eigenleistung darfst du diesen Code erstmal debuggen. Nicht daß ich absichtlich Fehler eingebaut hätte, aber ich habe schon ewig nicht mehr mit Scanner gearbeitet und keine Lust gehabt das rauszusuchen. Ich hab den Code nichtmal in der IDE geschrieben, daher kann es sein das die ein oder andere Methode anders heißt. Auch das darfst du korrigieren.
Und außerdem darfst du noch die drei anderen Grundrechenarten implementieren.


```
public abstract class Exercise{
    public abstract String getNextExercise();
    public abstract boolean correctSolution(int result);
}

public class AdditionExercise{
    private int lowerBound;
    private int upperBound;
    private int firstSummand;
    private int seccondSummand;
   
    public AddistionExercise(int lowerBound, int upperBound){
        this.lowerBound = lowerBound;
        this.upperBound = upperBound;
    }
   
    public String getNextExercise(){
        firstSummand = getFirstSummand();
        seccondSummand = getSeccondSummand();
        return firstSummand + " + " seccondSummand + " = ";
    }
   
    public boolean correctSolution(int result){
        return result == firstSummand + seccondSummand;
    }
   
    private int getfirstSummand(){
        int range = upperBound - lowerBound;
        Random rnd = new Random();
        return rnd.nextInt(range) + lowerBound;
    }
   
    private int getSeccondSummand(){
        int range = upperBound - firstSummand;
        Random rnd = new Random();
        return rnd.nextInt(range);
    }
}

public static void main(String args[]){
    Scanner sc = new Scanner();
    String selection;
    Exercise exercise;
    int cnt = 10
    int cntSuccess = 0;
   
    System.out.println("Welche Aufgaben willst du üben?");
    System.out.println("A Addition");
    selection = sc.getNext();
    selection = selection.toUpperCase();
   
    switch(selection){
        case "A":
            exercise = new AdditionExercise(0, 100);
            break;
    }
   
    while(cntSuccess < cnt){
        int result;
        print(exercise.getNextExercise());
        result = sc.nextInt();
        if(exercise.correctSolution(result)){
            println(" - Richtig");
            cntSuccess =- 1;
        }
        else{
            println(" - Falsch");
        }
    }
    println("Übung beendet. Du hast " + cnt + " Aufgaben richtig gelöst.");
}
```

Edit:
Und du darfst noch so nette kleine Details implementieren, daß der Benutzer z.B. andere Zahlenbereiche wählen kann.


----------



## BioxX (4. Mai 2020)

Oha! Erst einmal vielen lieben Dank für Eure Hilfe!!!


> Ich weiß nicht was ich dir noch sagen soll. Dir scheint total fundimentales Wissen zu fehlen. Damit meine ich Zuweisungen, Methoden, Rückgabewerte etc.


 Da hast du absolut Recht @MoxxiManagarm! Ich kann mir den Aufbau schon im Kopf irgendwie darstellen, aber die Umsetzung, "dank" meiner Unwissenheit in dem Gebiet, ist nicht möglich.
@temi & @White_Fox - Auch Euch noch einmal ein extra großes Dankeschön! Ich werde mir den Code mal anschauen, und mal sehen, was ich daraus lerne und damit machen kann. 

Euch noch einen angenehmen Tag!


----------

