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) ; }