Informatik I WS2003/2004 Informatik I WS2003/2004 Ausgegeben am: 4.12.2003 Prof. Dr. W. May Übungsblatt 6 Dipl.-Inform. Kerstin Richter Abgabe bis: 16.12.2003 (Theorie) 18.12.2003 (Praktisch) Dipl.-Inform. Oliver Fritzen Java: Speicherorganisation, Sichtbarkeit, Rekursion Die theoretischen Übungen sind bis zum 16.12.2003, 12. 55 Uhr in die Info-I-Briefkästen im Erdgeschoss der NAM einzuwerfen. Sämtliche praktischen Übungen sind bis zum 18.12.2003 in Ihrer Tutorengruppe zu testieren. Aufgabe 1 (Praktisch - 20 Punkte): Erweitern der Lottozahlen-Klasse Aus der Vorlesung sind die Klassen "Lotto" und "LottoTest" bekannt (beide zu finden unter http://user.informatik.uni-goettingen.de/~info1/java.html ). Erweitern Sie die Klasse Lotto um eine Methode public int vergleiche(int[] getippte_zahlen) { . . . }, die eine Folge von n getippten Zahlen mit der Folge von n Lottozahlen vergleicht und zurück gibt, wieviele Zahlen aus beiden Folgen übereinstimmen. Die Zahlen sind innerhalb der Folgen nicht sortiert. Zahlen können in einer Folge mehrmals vorkommen. Duplikate bei den Lottozahlen sind erlaubt; es soll gezählt werden, wieviele der Lottozahlen von der eigenen Auswahl "abgedeckt" wurden (siehe Beispiel) Die Lottozahlen (1,4,9,16,16,25) und der eigene Tipp (1,4,9,16,32,25) soll 6 Übereinstimmungen liefern, da mit dem eigenen Tipp alle 6 Lottozahlen abgedeckt wurden. Die eigene 16 hat zwei der Lottozahlen - die beiden 16en - abgedeckt. Anmerkung: Duplikate beim eigenen Tipp sind zwar erlaubt, aber sinnlos, da man damit eine Abdeckmöglichkeit verschenkt. Aufgabe 2 (Theorie - 20 Punkte): Sichtbarkeit in Java Gegeben seien die Klassen "Person": public class Person { private String name; private String vorname; public Person() { } public Person(String n) { name = n; // MARKE 3 } public Person(String thename) {name=thename;} public void setName(String thename){ name = thename; } public String getName() {return name;} public void printName(){ System.out.println(name); } } und die Testklasse "TwoPersons": public class TwoPersons{ public static void main (String[] args){ // MARKE 1 Person p1 = new Person("Meier"); 1 of 2 Informatik I WS2003/2004 p1.printName(); // MARKE 2 Person p2 = new Person("Mueller"); p2.printName(); } } Beide Klassen sind aus der Vorlesung bekannt. Beide Klassen existieren in der selben Laufzeitumgebung. Geben sie jeweils an, welche Aufrufparameter, lokale Variablen, Klassen, Objekte, Klassenvariablen, Instanzvariablen, Klassenmethoden und Instanzmethoden jeweils an den Punkten MARKE 1, MARKE 2 und MARKE 3 sichtbar sind. Aufgabe 3 (Theorie - 25 Punkte): Fakultät rekursiv berechnen Gegeben seien die Klassen "FakultaetRek" und "FakultaetRekTest" (beide zu finden unterhttp://user.informatik.uni-goettingen.de/~info1/java.html ). 1. Vollziehen Sie den Aufruf von "FakultaetRek.berechnen(3);" und von "FakultaetRek.berechnen(8)" von Hand nach. 2. Vollziehen sie den Inhalt des Aufrufstacks für diese beiden Berechnungen nach. Aufgabe 4 (Theorie - 20 Punkte): Rekursion: Fibonacci In der Vorlesung wurden die Fibonacci-Zahlen besprochen und eine Java-Klasse vorgestellt, die die Fibonacci-Zahlen berechnet. { public static long berechneRekursiv(int n) { if ((n==0) | (n==1)) return 1; else return(berechneRekursiv(n-1) + berechneRekursiv(n-2)); } } public class FibonacciTest { public static void main(String args[]) { int i = KeyBoard.readInteger ("Geben Sie eine natuerliche Zahl ein: "); System.out.println(Fibonacci.berechneRekursiv(i)); } } Beschreiben Sie den Aufrufstack für i=4. Hinweis "Inhalt der Aufruf-Datenblätter" in Kapitel 3.6. Aufgabe 5 (Praktisch - 15 Punkte): Rekursion - ggT (Vorlesungsskript) Implementieren Sie den Euklidischen Algorithmus und vervollständigen Sie damit die "Rational"-Klasse (zu finden in "Rational.java" auf der Java-Seite unter http://user.informatik.uni-goettingen.de/~info1/java.html). Lassen Sie ihre Lösung in ihrer Tutorengruppe testieren. 2 of 2