Programmentwicklung I für Hörer anderer Fachrichtungen -Wintersemester 2003/04- Abschlussklausur 20.02.2004 Name : Vorname : Matrikelnummer : Hauptfach : Nebenfach/Fachrichtung Hinweise : 1. Überprüfen Sie anhand der aufgedruckten Seitennummern 1-17 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 (allgemein) 5 2 Applikationen, Methoden 7 3 Methoden (einfache Variable) 8 4 Methoden, Felder 11 5 Rekursion 9 6 Basiswissen (Objektorientierung) 9 7 Klassen, Vererbung 11 60 1. Klausur Übung/Praktikum Summe - 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 Bei der mit for ( i = 1,...) beginnenden for-schleife muss i eine ganzzahlige Variable sein. Bei einem logischen Ausdruck der Form A B werden immer sowohl A als auch B ausgewertet. Der Aufruf einer Methode mit Ergebnistyp void muss innerhalb eines Ausdrucks geschehen. Eine Schleife wird mit continue verlassen. Ein Objekt ist die Erweiterung einer Klasse und erbt deren Eigenschaften. Klassenvariable werden durch das Schlüsselwort static gekennzeichnet. Eine Klasse muss Attribute enthalten. Die abstrakten Methoden eines Interface werden von einer Klasse implementiert, indem im Kopf der Klassendeklaration das Schlüsselwort extended gefolgt vom Namen des Interface angegeben wird. In einer abstrakten Klasse sind alle Methoden abstrakt. Innerhalb einer Klasse können weitere Klassen definiert werden. - 2 -
Aufgabe 2 ( 3 + 4 = 7 Punkte ) a) Schreiben Sie eine Java-Applikation A2a, die sowohl die Anzahl als auch die Gesamtlänge ihrer Kommandozeilenargumente ermittelt und auf dem Bildschirm ausgibt. Beispiel: java A2a Das ist ein Beispiel liefert Anzahl: 4 Gesamtlaenge: 17-3 -
Aufgabe 2 (Fortsetzung) b) (i) Schreiben Sie eine Java-Methode a2b entsprechend folgender Spezifikation, die exakt den durch nebenstehendes Flussdiagramm gegebenen Algorithmus realisiert. Name: a2b Parameter: ganze Zahl n Rückgabewert: - (ii) Welche Ausgabe wird für n = 24 und n = -100 erzeugt? start n n z 2 n > 1? ja n = 24 n = - 100 Ausgabe(n) ja z teilt n? nein n n / z Ausgabe(z) z z+1 solange n > 0 Hinweis: Es werden ausschließlich die Angaben in dieser Tabelle gewertet. stop - 4 -
Aufgabe 2 ( Fortsetzung) - 5 -
Aufgabe 3 ( 3 + 5 = 8 Punkte ) a) Schreiben Sie eine Java-Methode a3a, die für eine als Parameter übergebene ganze Zahl z die Anzahl der Dezimalziffern in der Dezimaldarstellung von z liefert. Beispiele: z = 12341234 a3a(z) = 8; z = -123 a3a(z) = 3-6 -
Aufgabe 3 ( Fortsetzung) b) Die Zahl S(k) ist (für k 1) definiert durch n 1 1 1 (-1) S(k) =1- + - +...= 3 5 7 (2n+1) 2k+1 2k+1 2k+1 2k+1 n=0 Entwerfen Sie eine Java-Methode entsprechend folgender Spezifikation: Name: a3b Parameter: k (int-zahl), e (double-zahl) Rückgabewert: eine Näherung für S(k), falls k 1. Für k <1 soll 0 zurückgereicht werden. Verfahren: Berechnen Sie einen Näherungswert für S(k) durch Aufsummieren genügend vieler Glieder obiger Reihe. Die Summation wird beendet, sobald der Betrag n (-1) des Summanden 2k+1 (2n+1) < e wird. Hinweise: 1. Sie können e > 0 beim Schreiben der Methode voraussetzen. 2. Die Standardfunktion Math.pow darf hier nicht verwendet werden. - 7 -
Aufgabe 4 (3 + 4 + 4 = 11 Punkte) a) 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[2]); feld[1] = 0; feld = matrix[1]; matrix[1] = matrix[2]; System.out.print("c : ");ausgeben(feld); System.out.print("d : ");ausgeben(matrix[1]); matrix[0] = feld; feld[0] = 99; matrix[2][1] = 88; 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: - 8 -
Aufgabe 4 (Fortsetzung ) b) Entwerfen Sie eine Java-Methode a4b, die bei Übergabe eines zweidimensionalen double- Feldes A den maximalen Eintrag in A ermittelt und als Ergebnis zurückreicht. Beachten Sie dabei, dass die Zeilenlängen unterschiedlich sein können. Sie können beim Entwurf dieser Methode ohne Überprüfung davon ausgehen, dass das Feld mindestens eine Komponente enthält. - 9 -
Aufgabe 4 (Fortsetzung ) c) Entwerfen Sie eine Java-Methode a4c, die bei Eingabe einer positiven ganzen Zahl n ein zweidimensionales ganzzahliges Feld in Dreiecksform mit n Zeilen erzeugt und zurückreicht. Für n 0 soll der null-zeiger zurückgereicht werden. Genauer: die k-te Zeile soll genau k Komponenten haben. In den Komponenten sollen beginnend mit 1 fortlaufend die natürlichen Zahlen eingetragen werden. 1 2 3 Beispiel: a4c ( 4 ) erzeugt nebenstehendes Feld: 4 5 6 7 8 9 10-10 -
Aufgabe 5 ( 4 + 5 = 9 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(b(aa/2)); case 1: return b(aa/3+1); case 2: return c(aa-2); 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; 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+3)); return 0; Was wird beim Aufruf a(23) ausgegeben? - 11 -
Aufgabe 5 ( Fortsetzung) b) Ist die (stetige) Funktion f auf dem Intervall [a,b] definiert und hat sie an den Intervallenden unterschiedliches Vorzeichen, so besitzt sie in diesem Intervall (mindestens) eine Nullstelle. Diese Nullstelle kann durch folgendes Bisektionsverfahren beliebig genau berechnet werden: - bestimme die Mitte mitte des Intervalls [a,b] - ist f(mitte)= 0, so ist mitte die gesuchte Nullstelle - ist f(mitte) 0, so sind entweder die Vorzeichen von f(mitte)und f(a) oder von f(mitte) und f(b) unterschiedlich. Das Verfahren wird jetzt rekursiv auf das a mitte b entsprechende Teilintervall angewendet, bis die Intervalllänge klein genug ist. Die Mitte des zuletzt bestimmten Intervalls ist die gesuchte Näherung.. Gegeben sei eine Java-Methode double fkt(double x) zur Berechnung einer Funktion. Entwerfen Sie unter dieser Voraussetzungeine rekursive Java-Methode bisektion zur Realisierung des oben beschriebenen Verfahrens. Genauer: Name: bisektion Parameter: a, b, eps ( double-zahlen) Rückgabewert: double-zahl (die berechnete Näherung für die Nullstelle) Wirkung: Hinweis: Zuerst wird getestet, ob fkt(a) und fkt(b) unterschiedliche Vorzeichen haben. Ist dies nicht der Fall, so wird eine entsprechende Meldung ausgegeben und 0 zurückgereicht. Ansonsten wird die Mitte mitte des Intervalls bestimmt. Ist fkt(mitte)= 0 oder ist die Länge des Intervalls eps, so ist mitte die gesuchte Näherung. Andernfalls wird das Verfahren erneut auf die passende Intervallhälfte angewendet. Beim Entwurf dieser Methode können Sie ohne weitere Überprüfung von a < b und eps > 0 ausgehen. f(x) - 12 -
Aufgabe 6 (4 + 5 = 9 Punkte ) a) Gehen Sie von folgenden Klassendeklarationen aus: public class A6a { public int a; private int b; private C c1; protected C c2; class C { private int d; void setze(int c) { b = c; // (1) public void setze(int c) { b = c; // (2) c1.d = 2; // (3) class B { void test1() { A6a A = new A6a();// (4) A.a = 1; // (5) A.b = 1; // (6) A.setze(1); // (7) A.c1.setze(1); // (8) class X extends A6a { void test2() { A6 B = new A6a(); // (10) B.a = 1; // (11) B.b = 1; // (12) a = 1; // (13) b = 1; // (14) setze(1); // (15) c2.setze(1); // (16) Geben Sie (mit kurzer Begründung) an, welche der mit //(..) markierten Anweisungen fehlerhaft sind. Achtung! Falschangaben führen zu Punktabzügen!!! Markierung Begründung - 13 -
Aufgabe 6 (Fortsetzung) b) Gegeben seien folgende Java-Klassen: (die erste Spalte gehört nicht zum Programm und dient nur der Nummerierung der Zeilen): 1. class K1 { 2. int i; 3. static int j=0; 4. public int f() 5. { return i; 6. 7. class K2 { 8. int j; 9. K1 k; 10. 11. public class K3 extends K1 { 12. K3 (int j) { 13. this.j += 1; 14. i = j+1; 15. 16. public int f(int j) 17. { return this.j+j; 18. public static void main (String args[]) { 19. K3 k = new K3(2); 20. System.out.println(k.f()); 21. System.out.println(k.f(3)); 22. k = new K3(2); 23. System.out.println(k.f()); 24. System.out.println(k.f(3)); 25. 26. (i) Welche Zahlen druckt das Programm nach Aufruf von java K3 aus? (ii) Kreuzen Sie bei den folgenden Aussagen die jeweils korrekte Vervollständigung an. Achtung!!! Falsche Kreuze geben Punktabzug. K3 ist eine Unterklasse von Der Bezeichner j in Zeile 3 ist Der Bezeichner K3 in Zeile 22 ist Der Bezeichner k in Zeile 9 ist Die Klasse K3 hat keine(n) K1 K2 nichts davon Klassenvariable Instanzvariable Parameter Klasse Parameter Konstruktor Attribut Klasse Attribut nichts davon Unterklasse Klassenvariable Instanzvariable Klassenvariablen sind j in Zeile 8 k in Zeile 22 keine davon - 14 -
Aufgabe 7 (6 + 5 = 11 Punkte ) a) Entwerfen Sie eine abstrakte Klasse Konto entsprechend folgender Spezifikation: Attribute: Konstruktor: Methoden: Kontonummer (int-zahl) Inhaber (String) Kontostand (double) erhält die Kontonummer und den Inhaber als Parameter; der Kontostand wird mit 0 initialisiert. Zur Vereinfachung ist keine Überprüfung erforderlich, ob die Kontonummer > 0 ist. void einzahlen (double wieviel) Ist wieviel 0, so wird der Kontostand entsprechend angepasst. Ist wieviel < 0, so wird nichts getan. void zeigen () Diese Methode gibt die Daten auf dem Bildschirm aus boolean abheben (double wieviel) Diese Methode ist abstrakt Auf die Attribute Kontonummer und Inhaber darf nur mit Methoden der Klasse, auf den Kontostand darf nur mit den Methoden dieser und eventueller abgeleiteter Klassen zugegriffen werden. Auf die Methoden darf von überall her zugegriffen werden. - 15 -
Aufgabe 7 (Fortsetzung ) b) Entwerfen Sie Subklassen Girokonto und Sparkonto von Konto entsprechend folgenden Spezifikationen: (i) Girokonto: Attribute: wie bei Konto, zusätzlich dispokredit (double-zahl), Konstruktor: wie bei Konto; zusätzlich wird der Dispokredit als Parameter übergeben und gesetzt. Zur Vereinfachung ist keine Überprüfung erforderlich, ob der Dispokredit 0 ist. Methoden: abheben Ist wieviel < 0 oder sind Kontostand + dispokredit < wieviel, so wird nichts getan. Ansonsten wird der gewünschte Betrag abgehoben (d.h. der Kontostand wird entsprechend verringert). Der Rückgabewert zeigt an, ob tatsächlich ausgezahlt wurde. zeigen Alle Daten werden auf dem Bildschirm ausgegeben. (ii) Sparkonto: Attribute: wie bei Konto, zusätzlich Zinssatz (double-zahl), Konstruktor: wie bei Konto; zusätzlich wird der Zinssatz als Parameter übergeben und gesetzt. Zur Vereinfachung ist keine Überprüfung erforderlich, ob der Zinssatz > 0 ist. Methoden: abheben Ist wieviel < 0 oder ist derkontostand < wieviel, so wird nichts getan. Ansonsten wird der gewünschte Betrag abgehoben (d.h. der Kontostand wird entsprechend verringert). Der Rückgabewert zeigt an, ob tatsächlich ausgezahlt wurde. zeigen Alle Daten werden auf dem Bildschirm ausgegeben. - 16 -
Zusatzblatt - 17 -