JAVA für Nichtinformatiker - Probeklausur - Die folgenden Aufgaben sollten in 150 Minuten bearbeitet werden. Aufgabe 1: Erläutere kurz die Bedeutung der folgenden Java-Schlüsselwörter und gib Sie jeweils ein Beispiel für ihre Verwendung an. (a) int Lösung: int ist die Bezeichnung des Datentyps Integer, der ganze Zahlen repräsentiert. Beispiel: Der Befehl int n = 5; deklariert eine Variable n vom Typ int und initialisiert sie auf den Wert 5. (b) return _ (c) void _ (d) extends _ Aufgabe 2: Betrachte den folgenden Ausschnitt eines Java-Programms. int a = 2 , b = 5; boolean g = false ; g = g || ( - - a * b == b ); if ( g ) b += a + 3; a = b; b = a; Std . out . print ( " a = " + a + " , b = " + b + " , g = " + g ); Wie lautet die Ausgabe? a = ,b= ,g= Aufgabe 3: Betrachte den folgenden Ausschnitt eines Java-Programms. int [] vec = {1 ,2 ,3 ,4 ,5}; for ( int i = 3; i < 7; i ++) { if ( i %2 == 0) continue ; vec [i -2] *= vec [i -3]; } Welche Werte enthält der Array vec am Ende der Ausführung? v[0] = , v[1] = , v[2] = , v[3] = , v[4] = Aufgabe 4: public int quadrate () { Std . out . print ( " Bitte eine Zahl n >0 eingeben : n = " ); int n = Std . in . readInt () Std . out . print ( " Die ersten " n " Quadratzahlen : " ); for ( i = 0; i < n ; i ++); Std . out . print ( i * i + " " ); } Die obige Java-Methode soll eine positive ganze Zahl n von der Tastatur einlesen und anschließend die Quadratzahlen 12 , . . . , n2 auf dem Bildschirm ausgeben. Die Ausgabe soll wie folgt aussehen: Bitte eine Zahl n>0 eingeben: n=5 Die ersten 5 Quadratzahlen: 1 4 9 16 25 Allerdings haben sich im obigen Quelltext einige Fehler eingeschlichen. (a) Unterstreiche alle Fehler im Quelltext. (b) Gib eine korrigierte Fassung der Methode an. Page 2 _ Aufgabe 5: Die folgende Methode erhält eine positive ganze Zahl n als Parameter und gibt die Zahlen von 1 bis n auf dem Bildschirm aus. public void zahlen_for ( int n ) { for ( int i = 1; i <= n ; i ++) Std . out . println ( i ); } (a) Implementiere eine dazu äquivalente Methode public void zahlen while(int n), die mit einer while-Schleife anstelle eine for-Schleife operiert. public int zahlen_while ( int n ) { } (b) Implementiere eine weitere dazu äquivalente Methode public void zahlen rek(int n), die rekursiv arbeitet (die Methode soll also keine Schleife enthalten). public int zahlen_rek ( int n ) { } Aufgabe 6: Die Fibonacci-Zahlen f0 , f1 , f2 , f3 , . . . sind durch die Rekursionsvorschrift f0 = 0 f1 = 1 fn = fn−1 + fn−2 für n ≥ 2 gegeben. (a) Berechne f6 . Lösung: (b) Schreibe Sie eine Java-Methode public int fib rek(int n), die zu einer gegebenen Zahl n ≥ 0 die Fibonacci-Zahl fn rekursiv berechnet und zurückgibt. Page 3 public int fib_rek ( int n ) { } (c) Schreibe eine Java-Methode public int fib it(int n), die zu einer gegebenen Zahl n ≥ 0 die Fibonacci-Zahl fn iterativ (d.h. ohne Rekursion) berechnet und zurückgibt. public int fib_it ( int n ) { } Aufgabe 7: Die Quersumme einer natürlichen Zahl ist die Summe ihrer Ziffern. (Beispiel: Die Quersumme von 2634 ist 2+6+3+4 = 15). Schreibe eine Java-Methode public int quersumme(int n), die zu einer gegebenen Zahl n ≥ 0 die Quersumme berechnet und zurückgibt. public int quersumme ( int n ) { } Page 4 Aufgabe 8: Betrachte die folgenden vier Java-Klassen: import eip .*; public class A { public int x ; public A ( int x ) { this . x = x ; Std . out . println ( " Erzeuge A - Objekt " ); } public void foo ( int n ) { for ( int i = 0; i < n ; i ++) for ( int j = 0; j < n ; j ++) x ++; Std . out . println ( x ); } } import eip .*; public class B extends A { public B ( int x ) { super ( x ); Std . out . println ( " Erzeuge B - Objekt " ); } public void increment ( int y ) { y ++; } } import eip .*; public class C extends B { public C ( int x ) { super ( x ); Std . out . println ( " Erzeuge C - Objekt " ); } Page 5 public void foo ( int n ) { while (( n > 0) && (x - - >= 0)) ; Std . out . println ( x ); } } import eip .*; public class TestABC { public static void main ( String [] args ) { A a = new A (1); B b = new B (0); C c = new C (5); b . foo (50); c . foo (50); int y = 5; b . increment ( y ); Std . out . println ( y ); } } (a) Welche Bildschirmausgabe produziert die Ausführung der Klasse TestABC? _ (b) Welche der in den Klassen A, B und C vorkommenden Methoden kann man mit dem Schlüsselwort static versehen, ohne einen Compilerfehler zu erzeugen? (Antwort begründen!) _ Page 6 Aufgabe 9: Die folgende Java-Klasse Circle soll einen Kreis repräsentieren. Implementiere die Methoden perimeter(), diameter(), overlap(), distance() und draw(). import eip .*; public class Circle { private double x , y ; private double r ; // Koordinaten des Mittelpunktes // Radius // Konstruktor public Circle ( double x , double y , double r ) { this . x = x ; this . y = y ; this . r = r ; } public double area () // berechnet den Flächeninhalt { return Math . PI * r * r ; } public double perimeter () // berechnet den Umfang { } public double diameter () // berechnet den Durchmesser { } /* gibt genau dann true zurück , wenn sich die Kreise this und that überlappen */ public boolean overlap ( Circle that ) { } Page 7 // berechnet den Abstand zwischen this und that public double distance ( Circle that ) { } /* zeichnet den Kreis auf dem Bildschirm unter Verwendung der Turtle t */ public void draw ( Turtle t ) { } } Hinweise: Sei K ein Kreis mit Mittelpunkt (x, y) und Radius r. Der Flächeninhalt von K ist πr2 . Der Umfang von K ist 2πr. Der Durchmesser von K ist 2r. Sie K 0 ein zweiter Kreis mit Mittelpunkt (x0 , y 0 ) und Radius r0 . Die Kreise K und K 0 p überlappen sich genau dann, wenn (x − x0 )2 + (y − y 0 )2 ≤ r + r0 ist. Der Abstand von K und K 0 ist 0, falls die beiden Kreise sich überlappen, und andep renfalls (x − x0 )2 + (y − y 0 )2 − r − r0 . Zeichne den Kreis in der Methode draw(...) als n-Eck mit großer Eckenzahl n (z.B. n=360). Aufgabe 10: Nun soll die Klasse Circle aus Aufgabe 8 mittels Vererbung zu einer Klasse ColoredCircle erweitert werden, die einen gefärbten Kreis repräsentiert. import java . awt .*; import eip .*; public class ColoredCircle extends Circle { private Color c ; Page 8 // Konstruktor public ColoredCircle ( double x , double y , double r , Color c ) { } /* zeichnet den farbigen Kreis auf dem Bildschirm unter Verwendung der Turtle t */ public void draw ( Turtle t ) { } } Implementiere den obigen Konstruktor public ColoredCircle(...) sowie die Methode public void draw(...). Dabei soll draw(...) auf die gleichnamige Methode der Superklasse zurückgreifen. Aufgabe 11: In dieser Aufgabe soll eine Turtle über Tastatureingaben durch den Benutzer gesteuert werden. Die beiden zulässigen Befehle sind: D: Zeichne ein gleichseitiges Dreieck der Seitenlänge 50 und gehe 50 Schritte nach rechts. Q: Zeichne ein Quadrat der Seitenlänge 50 und gehe 50 Schritte nach rechts. Die einzelnen Befehle werden dabei durch ein ; abgeschlossen - beispielsweise soll die Eingabe Q;D;D;Q;D; zu der Ausgabe führen. Fehlerhafte und unzulässige Eingaben soll das Programm überspringen, bis das nächste ; gelesen wird. Das gewünschte Verhalten wird durch den folgenden endlichen Automaten formal beschrieben: Page 9 q1 D ; default ; [zeichne Dreieck] default start q0 q3 ; default Q default ; [zeichne Quadrat] q2 Implementiere diesen Automaten durch Vervollständigung der Methode public static void verarbeiteZeichen(char inputChar) im folgenden Java-Programm. import eip .*; public class Aufgabe11 { static TurtleScreen ts = new TurtleScreen (); static Turtle t = new Turtle ( ts ); static int q ; // Zustand des Automaten public static void ve rarbei teZeic hen ( char inputChar ) { Page 10 } public static void main ( String [] args ) { q = 0; // Startzustand ist 0 char inputChar ; t . pd (); do { inputChar = Std . in . readChar (); vera rbeite Zeiche n ( inputChar ); } while ( inputChar != ’x ’ ); Std . out . println ( " FERTIG " ); } } Page 11