Ü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.
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 angeben 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.
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 bisher 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.