Programmentwicklung I für Hörer anderer Fachrichtungen -Wintersemester 2003/0422.04.2004 Name : Vorname : Matrikelnummer : Hauptfach : Nebenfach/Fachrichtung Hinweise : 1. Überprüfen Sie anhand der aufgedruckten Seitennummern 1 - 19 die Vollständigkeit Ihres Klausurtextes. 2. Hilfsmittel: bis zu 4 Seiten DIN A4 mit Notizen nach Wahl. Aufgabe Thema maximale Punktzahl erreichte Punktzahl 1 Basiswissen 5 2 Ausdrücke 9 3 Kontrollstrukturen 10 4 Syntaxdiagramme 6 5 Methoden; einfache Variable 16 6 Felder 21 7 Rekursion 12 8 Klassen, Vererbung 14 93 -1- Aufgabe 1 (5 Punkte ) Kennzeichnen Sie die folgenden Aussagen durch Ankreuzen als „wahr“ oder „falsch“. Bewertung: keine Antwort: 0 Punkte richtige Antwort: +0.5 Punkte falsche Antwort: -0.5 Punkte Minimal können 0 Punkte erreicht werden. wahr falsch Jedes Attribut muss mindestens einen der Modifizierer private, public oder protected besitzen. Im Rumpf der mit for (int i = 0; i < 10; i++) beginnenden Schleife darf die Schleifenvariable i nicht geändert werden. Eine switch-Anweisung wird mit der Anweisung continue verlassen. Überladene Methoden müssen sich in der Parameterliste unterscheiden. Die Methode void beispielmethode(...) darf kein return enthalten. Eine Objektmethode darf nicht auf statische Attribute zugreifen. Von jeder Klasse kann zur Laufzeit nur jeweils höchstens ein Objekt angelegt werden. Jede Klasse besitzt mindestens einen Konstruktor. Für jede Klasse kann man beliebig viele Konstruktoren implementieren. Als protected deklarierte Methoden einer Klasse sind nur innerhalb dieser Klasse benutzbar. -2- Aufgabe 2 ( 5 + 4 = 9 Punkte ) a) Gehen Sie für jede der folgenden Anweisungen jeweils neu von den folgenden Deklarationen aus: int n = 10, m = 5, i; double x = 2.4, y = 3.0; boolean b = true; Geben Sie in der folgenden Tabelle die Werte der Variablen nach der Ausführung der jeweiligen Anweisungen an, sofern sie sich geändert haben. Anweisung m n i x y b i = n % 4 + --m % 2; x *= 2.0 + m / n; i = (x++ > y) ? --m : --n; b = !(x < y | --n < 2 & m++ == 3); b = x++ > y && m-- < 5; b) Geben Sie die beiden folgenden in mathematischer Notation gegebenen Ausdrücke in JavaNotation an. Gehen Sie dabei von der Deklaration double x, y; aus 1 2y sin(2π x) 1 3 * + 2 2 − 5 2 + e-x x +y +1 2 x3 + (i) x 2 + y3 x - 2 |y-x| + 5 (x + 2) 3xy 4 (ii) -3- Aufgabe 3 a) Betrachten Sie nebenstehende for-Schleife. ( Dabei sind die Methoden f und g wie folgt spezifiziert: ) boolean f () void g () ( 6 + 4 = 10 Punkte ) boolean b; int unten, oben; // Anweisungen zum Einlesen // von unten und oben .... for (int i = unten; i < oben; i++) { b = f(); if (b) break; g(); } Ersetzen Sie die for-Schleife durch äquivalente Programmfragmente unter Verwendung (i) einer while-Schleife (ii) einer do-while-Schleife. -4- Aufgabe 3 (Fortsetzung) b) Schreiben Sie unter Benutzung der folgenden Deklarationen int a, b, n; eine switch-Anweisung, die die in folgender Tabelle beschriebenen Aktionen durchführt: n 1, 2 3 Aktion(en) b = a * b ; n = n+1 n=b+a 0, 5 b=2 sonst n=0 -5- Aufgabe 4 (3 + 3 = 6 Punkte) Prüfen Sie anhand der folgenden Syntaxdiagramme, ob folgende Zeichenfolgen Ausdrücke im Sinne dieser Syntaxdiagramme sind. Falls die Zeichenfolge ein Ausdruck im Sinne dieser Syntaxdiagramme ist, geben Sie eine Ableitung an. Andernfalls begründen Sie geeignet, weshalb die Zeichenfolge kein Ausdruck ist. Beachten Sie dabei: eine nicht erfolgreiche Ableitung ist keine ausreichende Begründung ! Verwenden Sie bei Ableitungen die Anfangsbuchstaben der jeweiligen syntaktischen Strukturen als Kürzel. Faktor Variable a Term b Faktor c Variable ( Ausdruck ) [ Ausdruck ] Ausdruck Term * + + / - - a) b * ( a – b / c * (a + b ) ) b) – a – b * ( - c + b / a – c ) -6- Aufgabe 5 a) ( 6 + 5 + 5 = 16 Punkte ) Schreiben Sie eine Java-Methode zur Berechnung des ganzzahligen Anteils von und n ≥ 0) entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: Hinweis: k n (für k ≥2 kWurzel 2 ganze Zahlen n und k eine ganze Zahl Ist n < 0 oder k < 2, so soll –1 als Ergebnis geliefert werden. Andernfalls ist das Ergebnis [ k n ]; d.h. die größte ganze Zahl z mit zk ≤ n. Mathematische Standardfunktionen dürfen in dieser Teilaufgabe nicht benutzt werden. -7- Aufgabe 5 b) Die durch ( Fortsetzung) x0 = beliebige ganze Zahl > 0 1 x n gerade x n+1 = 2 x n 3x n +1 x n ungerade für n ≥ 0 definierte Folge natürlicher Zahlen endet nach einer nicht vorhersehbaren Zahl von Schritten immer bei 1 (glaubt man wenigstens!). Beispiel: x0 = 3 ⇒ erzeugte Folge: 3, 10, 5, 16, 8, 4, 2, 1 ( 8 Folgenglieder bis zum Erreichen der 1) Schreiben Sie eine Java-Methode entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: a5b eine ganze Zahl eine ganze Zahl Ist der Parameter ≤ 1, so wird als Ergebnis 0 zurückgereicht. Ist der Parameter > 1, so werden der Reihe nach die obigen Folgenglieder bis zum erstmaligen Erreichen der 1 berechnet und auf dem Bildschirm ausgegeben. Als Funktionswert wird die Anzahl der Glieder dieser Folge zurückgereicht. -8- Aufgabe 5 ( Fortsetzung) 2i+1 ∞ x3 x5 x 7 i x + − + .... = ∑ (-1) für |x| < 1 c) Es ist arctg x =x 3 5 7 2i+1 i=0 Schreiben Sie eine Java-Methode myarctan entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: Hinweis: myarctan x (reelle Zahl) reelle Zahl Für |x| < 1 werden so viele Summanden dieser Reihe aufsummiert, bis sich aufgrund der Rechengenauigkeit die Partialsumme nicht mehr ändert. Diese soll dann als Ergebnis zurückgegeben werden. Für x ≥ 1 soll π/2 und für x ≤ -1 soll – π/2 als Ergebnis zurückgegeben werden. In dieser Aufgabe darf aus der Standard-Mathematikbibliothek Math lediglich die Konstante Math.PI benutzt werden. -9- Aufgabe 6 (Felder) a) ( 6 + 8 + 7 = 21 Punkte) Gehen Sie davon aus, dass die (hier nicht weiter spezifizierte) Methode ausgeben bei Übergabe eines eindimensionalen Feldes die Komponenten der Reihe nach ausgibt. Was wird unter dieser Voraussetzung bei folgendem Programmstück ausgegeben? int[] feld = {1,2,3,4}; int[][] matrix = {{5,6},{7,8,9},{10,11,12,13}}; System.out.print("a : ");ausgeben(feld); System.out.print("b : ");ausgeben(matrix[1]); feld = matrix[0]; feld[1] = 99; System.out.print("c : ");ausgeben(feld); System.out.print("d : ");ausgeben(matrix[0]); for (int i = 1; i < matrix.length; i++) matrix[i-1] = matrix[i]; matrix[matrix.length-1] = feld; System.out.print("e : ");ausgeben(matrix[0]); System.out.print("f : ");ausgeben(matrix[1]); System.out.print("g : ");ausgeben(matrix[2]); a: 1 2 3 4 b: c: d: e: f: g: - 10 - Aufgabe 6 (Fortsetzung) b) Schreiben Sie eine Java-Methode zum Mischen zweier aufsteigend sortierter Felder ganzer Zahlen entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: Beispiel: Hinweis: mischen f1, f2 (Felder ganzer Zahlen) ein Feld ganzer Zahlen Sind f1 und f2 beide aufsteigend sortiert, so werden die Einträge in f1 und f2 zu einem aufsteigend sortierten Feld zusammengemischt, das dann als Ergebnis zurückgereicht wird. Ist eines der Felder f1 bzw. f2 nicht aufsteigend sortiert, so wird null zurückgereicht. f1 = {1, 4, 7, 8}, f2 = {3, 6} ⇒ Ergebnis: {1, 3, 4, 6, 7, 8} Sie können beim Schreiben dieser Methode davon ausgehen, dass eine Methode boolean istsortiert(int[] f) zur Verfügung steht, die für das ganzzahlige Feld f feststellt, ob f aufsteigend sortiert ist. - 11 - Aufgabe 6 c) (Fortsetzung) Schreiben Sie eine Java-Methode entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: Beispiel: Hinweis: mittelwert matrix (zweidimensionales Feld ganzer Zahlen) ein eindimensionales Feld reeller Zahlen Die Methode ermittelt für jede Zeile der übergebenen Matrix getrennt den Mittelwert der Einträge und speichert diesen in der entsprechenden Komponente des Rückgabefeldes. Weiterhin wird der Mittelwert aller Komponenten von matrix bestimmt und als letzte Komponente im Rückgabefeld eingetragen. 1 2 3 matrix = 4 0 2 4 ⇒ Ergebnis: ( 2, 2.5, 1, 2 ) 1 1 Sie können beim Schreiben dieser Methode davon ausgehen, dass das übergebene Feld mindestens eine Zeile und in jeder Zeile mindestens einen Eintrag hat. - 12 - Aufgabe 7 (4+ 4 + 4 = 12 Punkte ) a) Betrachten Sie folgende Java-Methoden: int a(int aa) { System.out.println("in a: "+aa); if (aa==0) return 0; switch ( aa % 3) { case 0: return a(c(aa/2)); case 1: return b(aa/3+1); case 2: return c(aa-4); } return 0; } int b(int bb) { System.out.println("in b: "+bb); if (bb==0) return 0; switch ( bb % 2) { case 0: return b(a(bb/2)); case 1: return c(bb/2+1); } return 0; } Was wird beim Aufruf a(11) ausgegeben? - 13 - int c(int cc) { System.out.println("in c: "+cc); if (cc==0) return 0; switch ( cc % 3) { case 0: return b(a(cc/2)); case 1: return c(cc/2); case 2: return a(b(cc+4)); } return 0; } Aufgabe 7 (Fortsetzung) () () ( )( ) b) Die Binomialkoeffizienten n sind für 0 ≤ k ≤ n rekursiv definiert durch: k n = n = 1; n = n-1 + n-1 für n ≥ 1 und 1 ≤ k ≤ n-1 0 n k k-1 k () () () Schreiben Sie eine rekursive Java-Methode zum Berechnen der Binomialkoeffizienten n nach k diesem Schema. Ist für die Parameter n und k die Bedingung 0 ≤ k ≤ n nicht erfüllt, so soll 0 als Funktionswert zurückgereicht werden. - 14 - Aufgabe 7 (Fortsetzung) c) Ein Palindrom ist eine Zeichenkette, die von vorn und hinten gelesen gleich ist (Beispiel: lagerregal). Offensichtlich gilt: - Zeichenketten der Länge 0 oder 1 sind Palindrome. - Eine Zeichenkette s der Länge ≥ 2 ist ein Palindrom, falls der erste und der letzte Buchstabe übereinstimmen und der Rest ein Palindrom ist. (lagerregal à l agerrega l ) Schreiben Sie eine rekursive Java-Methode entsprechend folgender Spezifikation, die unter Benutzung dieser Eigenschaft feststellt, ob der übergebene String ein Palindrom ist. Name: Parameter: Rückgabewert: Wirkung: palindrom s (String) true / false Ist s ein Palindrom, so wird true zurückgegeben Hinweis: In der Klasse String stehen folgende Methoden zur Verfügung, die hier benutzt werden können ( die Indizierung in Strings entspricht der Indizierung von Feldern): int length() liefert die Länge eines Strings (Beispiel: "hallo".length() = 5) substring(int beginIndex, int endIndex) liefert den Teilstring ab einschließlich beginIndex bis ausschließlich endIndex. (Beispiel: "hallo".substring(1,4) = "all" ) char charAt(int index) liefert das Zeichen an der genannten Position (Beispiel: "hallo".charAt(1) = 'a') - 15 - Aufgabe 8 (3 + 5 + 6 = 14 Punkte) Gehen Sie in dieser Aufgabe davon aus, dass ein Klasse Adresse zur Verfügung steht, die u.a. folgende Methoden enthält: • • String toString() Adresse copy() liefert einen String mit den Adressangaben liefert eine Kopie der aktuellen Adresse a) Entwerfen Sie eine Klasse Gebaeude entsprechend folgender Spezifikation: Attribute: adr (Adresse) besitzer (String) Konstruktor: Der Konstruktor erhält die Adresse und den Besitzer als Parameter und setzt die Attribute entsprechend. Für die Adresse wird eine Kopie des entsprechenden Parameters angelegt. Methode: String toString () liefert einen String mit dem Besitzer und den Adressangaben. Auf die Attribute darf nur mit Methoden der Klasse, auf die Methode darf von überall her zugegriffen werden. - 16 - Aufgabe 8 (Fortsetzung) b) Entwerfen Sie eine Klasse Wohnung entsprechend folgender Spezifikation: Attribute: flaeche, miete (double) mieter (String) vermietet (boolean) Konstruktor: Der Konstruktor erhält als Parameter die Fläche. Das Attribut flaeche wird entsprechend dem Parameter gesetzt ( eine Überprüfung auf Fläche > 0 ist nicht erforderlich). miete wird mit 0, vermietet wird mit false und mieter wird mit dem leeren String vorbesetzt. Methoden: String toString () liefert einen String mit allen Angaben zur Wohnung double miete () liefert die Miete boolean istVermietet() liefert die Angabe, ob die Wohnung vermietet ist void vermieten (String neuerMieter) falls die Wohnung nicht vermietet ist, wird sie an den neuen Mieter vermietet (d.h. die Attribute werden entsprechend gesetzt). Ist sie bereits vermietet, so wird lediglich eine entsprechende Meldung ausgegeben. Auf die Attribute darf nur mit Methoden der Klasse, auf die Methoden darf von überall her zugegriffen werden. - 17 - Aufgabe 8 c) (Fortsetzung) Erweitern Sie die Klasse Gebaeude zu einer Klasse Miethaus entsprechend folgender Spezifikation: zusätzliches Attribut: wohnungen (Feld von Wohnungen; siehe Teil b)) Konstruktor: Der Konstruktor erhält die Parameter wie der Konstruktor von Gebaeude und zusätzlich ein Feld von Wohnungen und setzt die Attribute entsprechend. Methoden: double miete () liefert die Gesamtmiete aller aktuell vermieteten Wohnungen String toString () liefert einen String, der die Angaben zum Gebäude und zu allen Wohnungen enthält Auf die Attribute darf nur mit Methoden der Klasse, auf die Methoden darf von überall her zugegriffen werden. - 18 - Zusatzblatt - 19 -