i

Übungen

Aufgaben zu Superbrain

Aufgabe 1 - Zufälliger Operator

  • Passe die Methode rateEinmal so an, dass zufällig einer der Operatoren +, - oder * ausgewählt wird. Der Zahlenbereich bei der Multiplikation sollte kleiner als bei der Addition und Subtraktion sein.
  • Ergänze außerdem die Division.

  • int operatorNummer = zufallszahl(4);
  • int zahl1;
  • int zahl2;
  • int loesung;
  • String operator;
  • if(operatorNummer == 0) {
  • zahl1 = zufallszahl(100) + 100;
  • zahl2 = zufallszahl(100) + 100;
  • loesung = zahl1 + zahl2;
  • operator = "+";
  • }
  • else if(operatorNummer == 1) {
  • zahl1 = zufallszahl(100) + 100;
  • zahl2 = zufallszahl(100) + 100;
  • loesung = zahl1 - zahl2;
  • operator = "-";
  • }
  • else if(operatorNummer == 2) {
  • zahl1 = zufallszahl(15) + 1;
  • zahl2 = zufallszahl(15) + 1;
  • loesung = zahl1 * zahl2;
  • operator = "*";
  • }
  • else {
  • loesung = zufallszahl(10);
  • zahl2 = zufallszahl(9)+1; // 0 darf hier nicht vorkommen.
  • zahl1 = zahl2 * loesung;
  • operator = "/";
  • }
  • System.out.println("Wie viel ist " + zahl1 + operator + zahl2 + "?");

Aufgabe 2 - Zeitmessung

Bis jetzt hat das Spiel den Nachteil, dass man sich beliebig lange Zeit lassen kann für die Antworten. Deshalb sollen die Spielregeln geändert werden:

Es werden so lange Runden gespielt bis einer der Spieler mindestens 30 Sekunden Rechenzeit verbraucht hat. Der Spieler, der insgesamt schneller gerechnet hat, gewinnt. Ein Beispiel für den Ablauf des Spiels kannst Du im Video sehen.

In Java kann man mit dem Ausdruck System.currentTimeMillis() die vergangene Zeit seit dem 1.1.1970 in Millisekunden berechnen. Da es sich dabei um eine Zahl handelt, die zu groß für den Datentyp int ist, wird als Rückgabetyp der Datentyp long genutzt. Um die Zeit in Sekunden vom Datentyp int zu erhalten, kannst Du den Ausdruck (int)(System.currentTimeMillis() / 1000) benutzen. Die Zeitspanne für eine bestimmte Aktion kannst Du dann nach folgendem Muster bestimmen:

int start = (int)(System.currentTimeMillis() / 1000);
// ... tue, was Du so zu tun hast ...
int ende = (int)(System.currentTimeMillis() / 1000);
int dauer = ende - start;

Passe Dein Projekt entsprechend an. (Tipp: Wahrscheinlich lohnt es sich eine Kopie Deines Projektes zu erstellen, da Du hier einige Änderungen am Projekt durchführen wirst.)

Aufgabe 3 - Eigene Erweiterungen

Bestimmt fallen Dir interessante Erweiterungen oder Varianten des Spiels ein. Ideen könnten z.B. sein:

  • Die Spieler geben zu Beginn des Spiels ihren Namen ein, um die Mitteilungen persönlicher gestalten zu können.
  • Die Spieler müssen ihr Alter eingeben. Jüngere Spieler bekommen leichtere Aufgaben.
  • Man bekommt Punkte in Abhängigkeit von der Schwierigkeit der Aufgabe. Wer zuerst eine bestimmte Punktzahl erreicht, gewinnt.
  • Die Schwierigkeit der Aufgaben wächst an. Wer zuerst einen Fehler macht, oder länger als 10 Sekunden zur Berechnung braucht, verliert.
  • ... sei kreativ !!!

Aufgabe 4 - Fehlermeldung

Der Compiler meldet beim Versuch den folgenden Code zu übersetzen einen Fehler. Begründe.

boolean rateEinmal(String name)
{
	// ... restlichen Code ausgelassen ...
	// antwort und loesung seien zwei gültige lokale Variablen
	if(loesung == antwort)
	{
	    System.out.println("Super");
	    return true;
	}
	else
	{
	    System.out.println("Leider falsch. Richtig war: " + loesung);
	    return false;
	}
	System.out.println("Auf zur nächsten Runde");
}

Auch das Fragment zur differenzierten Begrüßung lässt sich nicht compilieren. Begründe.

if(zufallszahl(2) == 0) {
	String s = "Hallo, Lust auf ein Spielchen?";
}
else {
	String s = "Neues Spiel, neues Glück!";
}
System.out.println(s);

Aufgabe 5 - Typische Fehler

Im unten dargestellten Code wird versucht einen Konstruktor zu schreiben, bei dem die zu spielenden Runden beim Erzeugen des Spiels angegeben werden müssen. Leider funktioniert keiner der dargestellten Fälle. Beschreibe und erkläre die Fehler.

Fehler 1:

class Spiel
{
	int runden;
	Spiel(int runden) {
		runden = runden;
	}
	// ... restlicher Code ...
}

Fehler 2:

class Spiel
{
	int runden;
	Spiel(int r) {
		r= runden;
	}
	// ... restlicher Code ...
}

Fehler 3:

class Spiel
{
	int runden;
	Spiel(int r) {
		int runden = r;
	}
	// ... restlicher Code ...
}

Weitere Aufgaben

Aufgabe 6 - Lokal vs. Attribut

Beispiel 1 lässt sich kompilieren, Beispiel 2 nicht. Erkläre.

class Beispiel1
{
    int x;
    void tuWas() {
        if(x == 0)
            System.out.println("x ist 0");
    }
}
class Beispiel2
{
    void tuWas() {
        int x;
        if(x == 0)
            System.out.println("x ist 0");
    }
}

Aufgabe 7 - Logische Ausdrücke

Gehe von folgender Variablenbelegung aus und ordne die Ausdrücke zu.

Variablenbelegung für Quiz

Aufgabe 8 - Maximum-Funktion

Eine Maximum-Funktion gibt die größere von zwei Zahlen zurück. Teste und beurteile die dargestellten Varianten.

    int max1(int a, int b)
    {
        if(a > b)
            return a;
        else
            return b;
    }

    int max2(int a, int b)
    {
        if(a > b)
            return a;
        return b;
    }

    int max3(int a, int b)
    {
        if(a > b)
            return a;
        if(b >= a)
            return b;
    }

Aufgabe 9 - Bruch-Klasse

Grundlage für diese Aufgabe ist die Bearbeitung der Aufgabe 3 im Kapitel Teddy-Übungen. Die dort erstellte Bruch-Klasse lässt zu, dass Brüche gekürzt werden, die eigentlich nicht mehr kürzbar sind.

Ergänze die Klasse um eine Methode boolean kürzbarMit(int k), die genau dann true zurück gibt, wenn Zähler und Nenner durch k teilbar sind. Passe die Methode kürzen so an, dass nur kürzbare Brüche gekürzt werden.

Hinweis: Experimentiere in der Direkteingabe von BlueJ mit dem sogenannten Modulo-Operator %.

Zusatzaufgabe: Wie viele sinnvolle Implementierungen findest Du für die Methode boolean kürzbarMit(int k)? Ideen dazu findest Du bei Aufgabe 8.

Suche

v
7.1.2.1.5
dev.inf-schule.de/oop/java/implementierung/superbrain/uebungen
dev.inf-schule.de/7.1.2.1.5
dev.inf-schule.de/@/page/VBGEqZuDYhtvKWSG

Rückmeldung geben