fakult¨at f¨ur informatik

Werbung
TECHNISCHE UNIVERSITÄT MÜNCHEN
FAKULTÄT FÜR INFORMATIK
Lehrstuhl für Sprachen und Beschreibungsstrukturen
Einführung in die Informatik I
Prof. Dr. Helmut Seidl, A. Lehmann, A. Herz, Dr. M. Petter
SS 2011
Übungsblatt 2
12.05.11
Abgabe: 22.05.11 (vor 12 Uhr)
Aufgabe 2.1 (P) Syntaxbaum
Zeichnen Sie für das folgende MiniJava-Programm den Syntaxbaum. Dazu steht Ihnen die
Grammatik von MiniJava aus der Vorlesung zur Verfügung.
int a , b ;
a = read ( ) ;
i f ( a < 0) {
while ( a < 0 ) {
b = read ( ) ;
a = a + b;
write (a) ;
}
} else {
while ( a < 4 2 ) {
a = a ∗ a;
}
}
write (a) ;
Aufgabe 2.2 (P) Syntaxbaum
Zeichnen Sie für das folgende MiniJava-Programm den Syntaxbaum. Dazu steht Ihnen die
Grammatik von MiniJava aus der Vorlesung zur Verfügung.
int x , r , n ;
r = 1;
n = 1;
x = read ( ) ;
while ( n < x ) {
i f ( r % 1 == 0 )
r = r ∗ n;
else
r = r ∗ (−n ) ;
n = n + 1;
write ( r ) ;
}
Aufgabe 2.3 (P) Primfaktorzerlegung
Jede natürliche Zahl n > 1 ist entweder selbst eine Primzahl oder lässt sich als ein Produkt
von Primzahlen darstellen. Zur Berechnung der Primfaktorzerlegung einer Zahl n sollen Sie
der Reihe nach durch alle Zahlen ab der 2 teilen. Wenn ein Teiler t gefunden wurde, so wird
t ausgegeben. Falls Rest (n/t) groesser ist als 1, so wird dieser auch in seine Primfaktoren
zerlegt.
Schreiben Sie ein MiniJava-Programm, das eine natürliche Zahl n > 1 einliest und in Primfakoren zerlegt. Ihr Programm soll alle Primfaktoren der Zahl n am Bildschirm ausgeben.
Zum Beispiel ergibt sich für die Zahl 84 folgende Zerlegung: 2 2 3 7.
2
Aufgabe 2.4 (P) Karnickelpopulation
Auf einer einsamen Insel wird ein Paar geschlechtsreifer Kaninchen ausgesetzt, um herauszufinden, wie viele Kaninchen innerhalb eines Jahres geboren werden. Hierbei wird angenommen, dass jedes geschlechtsreife Paar jeden Monat ein neues Kaninchenpaar zur Welt
bringt. Jedes Kaninchenpaar ist bereits im ersten Monat seiner Lebenszeit geschlechtsreif
und jedes Kaninchen hat eine Lebenszeit von 3 Monaten.
a) Schreiben Sie ein MiniJava-Programm, welches die Zahl n einliest, die den n-ten Monat bezeichnet. Ihr Programm soll die Anzahl der Kaninchenpaare, die im n-ten Monat
geschlechtsreif sind, ausgeben. Als Beispiel der Kaninchenpopulation dient folgende
Tabelle:
Monat 1. Generation 2. Generation 3. Generation
1
1
2
1
1
3
2
1
1
4
2
1
4
5
7
4
2
b) Gehen Sie nun davon aus, dass die Kaninchenpaare, die sich im zweiten Monat ihrer
Geschlechtsreife befinden, 3 Kaninchenpaare zu Welt bringen.
Schreiben Sie ein MiniJava-Programm, welches wiederum die Zahl n einliest, die den
n-ten Monat bezeichnet. Ihr Programm soll die Anzahl der Kaninchenpaare ausgeben,
die im n-ten Monat die 1., 2. und 3. Generation darstellen.
Aufgabe 2.5 [2 Punkte] (H) GGT-Tabelle
Implementieren Sie ein MiniJava-Programm namens GGTTable.java, das eine Tabelle der
ggTs für alle Kombinationen von Zahlen zwischen 1 und x ausgibt (für positive x). Dabei
soll x vom Benutzer eingegeben werden. Für x = 10 ist die Ausgabe folgende:
1
1
1
1
1
1
1
1
1
1
1
2
1
2
1
2
1
2
1
2
1
1
3
1
1
3
1
1
3
1
1
2
1
4
1
2
1
4
1
2
1
1
1
1
5
1
1
1
1
5
1
2
3
2
1
6
1
2
3
2
1
1
1
1
1
1
7
1
1
1
1
2
1
4
1
2
1
8
1
2
1
1
3
1
1
3
1
1
9
1
1
2
1
2
5
2
1
2
1
10
Hinweis: Verwenden Sie zur Ausgabe der Tabellen die Funktionen System.out.print()
und System.out.println().
• System.out.print(’\t’); erzeugt einen Tabulator,
• System.out.print(i); gibt die Zahl i am Bildschirm aus und
• System.out.println(); erzeugt einen Zeilenvorschub.
Aufgabe 2.6 [5 Punkte] (H) Schlangenspiel
In dieser Aufgabe sollen Sie das Schlangenspiel für zwei Spieler programmieren. Erstellen Sie
dazu ein Programm namens Schlangenspiel.java. Die Grundidee des Spiels ist folgende:
•
•
•
•
Das Spiel hat die Felder 0 bis 35.
Jeder Spieler besitzt einen Spielstein.
Beide Spielsteine starten auf Feld 0.
Im Wechsel wird gewürfelt. Der Spielstein des entsprechenden Spielers wird um die
3
•
•
•
•
•
•
•
entsprechende Augenzahl vorgerückt.
Wer zuerst das Feld 35 erreicht oder überschreitet, gewinnt das Spiel.
Von allen Feldern, die durch 5 teilbar sind, führt eine Leiter nach oben. Wer ein solches
Feld erreicht, kommt sofort 3 Felder weiter.
Aber Vorsicht vor den Schlangen! Erreicht man ein Schlangenfeld (jedes Feld, das
durch 7 teilbar ist), rutscht man automatisch um 4 Felder zurück.
Die Felder 0 und 35 sind weder Leiter- noch Schlangenfelder.
Leitern und Schlangen treten in Aktion, wenn ein Spielstein dieses Feld erreicht. Es
ist daher möglich, Ketten von Schlangen und/oder Leitern zu benutzen.
Es dürfen zwei Spielsteine gleichzeitig auf einem Feld stehen.
Am Ende wird der Sieger ausgegeben.
Geben Sie jeweils das Würfelergebnis und das neue Spielfeld aus.
Implementieren Sie ihre Lösung Schritt für Schritt, so weit Sie kommen:
a) Beschränken Sie sich zuerst auf einen Spieler und ein leeres Spielfeld. Das Spiel besteht
am Anfang nur aus Würfeln bis die 35 überschritten wird.
b) Beachten Sie nun Leitern und Schlangen – nach dem Würfeln prüfen Sie ob das Zielfeld
leer ist.
c) Beachten Sie nun auch Ketten von Leitern und Schlangen – bewegen Sie einen Spielstein nach dem Würfeln so lange, bis er weder auf einer Schlange noch einer Leiter
landet.
d) Erweitern Sie ihr Spiel nun um den zweiten Spieler.
Versehen Sie Ihr (sauber formatiertes) Programm mit sinnvollen Kommentaren – Sie müssen
nur die endgültige Version ihres Programms abgeben!
Hinweis: Damit Sie bei der Programmierung besser den Überblick behalten, wo sich
Ihre Spielsteine gerade befinden, können Sie von der Vorlesungshomepage die Datei Spielfeld.java herunterladen. Fügen Sie diese Datei zu Ihrem Netbeans-Projekt hinzu und
ersetzen Sie extends MiniJava durch extends Spielfeld .
Nun steht Ihnen der Aufruf paintField(stein1,stein2); zur Verfügung, mit dem Sie sich
ein Spielfeld mit den beiden Spielsteinen auf den Feldern mit den Nummern stein1 und
stein2 anzeigen lassen können. Solange Sie nur einen Spielstein verwalten können sie für
den zweiten die Position 0 verwenden.
Aufgabe 2.7 [3 Punkte] (H) Syntaxbaum
Zeichnen Sie für das folgende MiniJava-Programm den Syntaxbaum. Dazu steht Ihnen die
Grammatik von MiniJava aus der Vorlesung zur Verfügung.
int prod , x , n ;
x = read ( ) ;
i f (0 < x ) {
prod = 1 ;
n = 0;
while ( prod <= x ) {
n = n + 1;
prod = prod ∗ (−n ) ;
}
w r i t e ( prod ) ;
} else {
write (n) ;
}
Herunterladen