Programmentwicklung I für Hörer anderer Fachrichtungen -Sommersemester 2003Abschlussklausur 05.08.2003 Name : Vorname : Matrikelnummer : Hauptfach : Nebenfach/Fachrichtung Hinweise : 1. Überprüfen Sie anhand der aufgedruckten Seitennummern 1 - 18 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 6 3 Methoden (einfache Variable) 11 4 Methoden, Felder 9 5 Rekursion 8 6 Basiswissen (Objektorientierung) 5 7 Klassen, Vererbung 16 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 Eine Methode kann sich selbst aufrufen. Eine Methode kann nur überladen werden, wenn sie als public deklariert ist. Einer int-Variable kann auch ohne cast ein double-Wert zugewiesen werden, wenn der double-Wert nicht zu groß ist. Der Aufruf einer Methode muss in Quelltext hinter (bzw. unter) den Kopf dieser Methode stehen. Blöcke werden mit { und } gruppiert. Zu einer Klasse gibt es immer auch Objekte. Ein Objekt ist die Erweiterung einer Klasse und erbt deren Eigenschaften. Eine Unterklasse erbt die Attribute und Methoden der Oberklasse. Es können jedoch weitere Daten und Methoden hinzugefügt werden. Eine Konstante erkennt man an dem Schlüsselwort static. Schlüsselwörter müssen mit ; voneinander getrennt werden. -2- Aufgabe 2 ( 3 + 3 = 6 Punkte ) a) Schreiben Sie eine Java-Applikation, die folgende Aufgabe erledigt: Zuerst sollen alle Kommandozeilenparameter mit geradem Index in normaler Reihenfolge und anschließend die übrigen Parameter in umgekehrter Reihenfolge ausgegeben werden. -3- Aufgabe 2 (Fortsetzung) b) Das nebenstehende Flussdiagramm beschreibt den Primzahltest nach dem Verfahren "Sieb des Eratosthenes". Schreiben Sie eine Java-Methode, die dieses Verfahren entsprechend dem Flussdiagramm realisiert. Hinweise: 1. Die Methode soll die ganze Zahl n als Eingabeparameter haben; n ≥ 2 können Sie ohne weitere Prüfung voraussetzen. 2. Das Feld a muss in der Methode erzeugt werden. Start ao = false a1 = false i=2 i≤n a = true i = i+1 i=2 ai = false ja nein k=2 k*i ≤ n ak*i = false k = k+1 i = i+1 i≤n Rückgabe (a) Stopp -4- Aufgabe 3 ( 4 + 3 + 4 = 11 Punkte ) 2i ∞ x2 x4 x6 i x a) Es ist cos x =1 − + − + .... = ∑ (-1) 2! 4! 6! (2i)! i=0 Schreiben Sie eine Java-Methode cos entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: cos x (double) double Es werden so viele Summanden dieser Reihe aufsummiert, bis sich aufgrund der Rechengenauigkeit die Partialsumme nicht mehr ändert. Diese soll dann zurückgegeben werden. -5- Aufgabe 3 ( Fortsetzung ) b) Schreiben Sie eine Java-Methode entsprechend folgender Spezifikation: Name: Parameter: Rückgabewert: Wirkung: Hinweis: divmod m, n (ganze Zahlen) ganzzahliges Feld mit 2 Komponenten (nämlich q und r) Unter ausschließlicher Benutzung der Operatoren +, -, >=, == und > werden der Quotient q ( d.h. m/n) der ganzzahligen Division von m durch n und der Teilungsrest r (d.h. m%n) ermittelt und im Feld zurückgegeben. Die Operatoren / und % dürfen in dieser Teilaufgabe nicht benutzt werden! Sie können für diese Teilaufgabe voraussetzen, dass m≥0 und n>0 ist. -6- Aufgabe 3 ( Fortsetzung ) c) Der Kehrwert 1/a einer positiven reellen Zahl a kann ohne Division durch folgendes Iterationsverfahren nummerisch beliebig genau berechnet werden: Startwert: Iterationsschritt: x0 mit 1/(2a) < x0 < 3/(2a) xn+1 = xn * (2-a xn) Schreiben Sie eine Java-Methode kehrwert entsprechend folgender Spezifikation, die dieses Verfahren realisiert. Name: Parameter: Rückgabewert: Wirkung: Hinweise: kehrwert a, x0 (double) double Zunächst wird die Bedingung 1/(2a) < x0 < 3/(2a) (natürlich ohne Verwendung von Divisionen) überprüft. Ist diese Bedingung nicht erfüllt, soll 0 zurückgegeben werden. Ansonsten soll solange das nächste xi berechnet werden, bis erstmals das Abbruchkriterium | xi+1 – xi | >= | xi – xi-1 | erfüllt ist; es sind also in jedem Fall mindestens 2 Iterationsschritte durchzuführen. 1. In dieser Teilaufgabe ist die Verwendung des Operators / nicht erlaubt. 2. Für diese Teilaufgabe können Sie a > 0 voraussetzen. -7- Aufgabe 4 (4 + 5 = 9 Punkte ) a) Die hier nicht weiter spezifizierte Methode ausgabe gibt beim Aufruf ausgabe(v) mit einem int-Feld v dieses Feld in einer Zeile aus. Welche Ausgabe wird unter dieser Voraussetzung durch folgendes Programmfragment erzeugt? int[] zeile = {1, 2, 3, 4}; int[][] matrix = new int[3][4]; System.out.print("Stelle 1: "); ausgabe(matrix[1]); matrix[1] = zeile; zeile[1] = 5; System.out.print("Stelle 2: "); ausgabe(matrix[1]); zeile = new int[2]; zeile[0] = 6; System.out.print("Stelle 3: "); ausgabe(zeile); System.out.print("Stelle 4: "); ausgabe(matrix[1]); Stelle 1: Stelle 2: Stelle 3: Stelle 4: -8- Aufgabe 4 (Fortsetzung) b) Eine n x n - Transvektionsmatrix ist durch die Dimension n, eine ganze Zahl r mit 1≤r<n und n-r Werte a1, a2,..., an-r definiert. Alle Diagonalelemente dieser Matrix sind = 1 und in der r-ten Spalte stehen unterhalb der Diagonalen die Werte a1, a2,..., an-r. Die restlichen Matrixelemente haben den Wert 0. Beispiel: Durch n = 4, r = 2, a1 = 1.5 und a2 = 2.5 ist die Matrix 1 0 0 0 0 1 0 0 0 1.5 1 0 0 2.5 0 1 definiert. Schreiben Sie eine Java-Methode entsprechend folgender Spezifikation: Name: Parameter: tvMatrix n (ganze Zahl) a (eindimensionales double-Feld) Rückgabewert: matrix (zweidimensionales double-Feld) Wirkung: Die zu n und a gehörende Transvektionsmatrix wird erzeugt und zurückgegeben. Dabei können Sie davon ausgehen, dass n ≥ 1 gilt und dass und die Länge des Feldes a < n ist. Die fragliche Spalte r ergibt sich dann aus der Dimension n und der Länge von a. Hinweis: Beachten Sie die Java-Konventionen zur Indizierung von Feldern. -9- Aufgabe 5 ( 3 + 5 = 8 Punkte ) a) Was wird beim Aufruf java A5a ausgegeben? public class A5a { static int waswohl(int n) { if (n <= 0) return n; return ( n + waswohl( n/2 )); } public static void main(String[] args) { for (int i = 0; i < 8; i++) System.out.println(i + " : " + waswohl(i)); } } 0: - 10 - Aufgabe 5 ( Fortsetzung ) b) Schreiben Sie rekursive Java-Methode minmax gemäß folgender Spezifikation, die in einen Aussschnitt eines eindimensionalen int-Feld gleichzeitig das Minimum und das Maximum bestimmt. Name: Parameter: minmax feld (eindimensionales int-Feld) links, rechts (int-Zahlen) Rückgabewert: int-Feld mit 2 Komponenten; das Minimum steht in der ersten und das Maximum in der zweiten Komponente. Verfahren: 1. Enthält der Feldausschnitt nur eine Komponente, so ist diese sowohl das Minimum als auch das Maximum. 2. Enthält der Feldausschnitt mindestens 2 Komponenten, so wird er in zwei in etwa gleich große Hälften geteilt. Anschließend wird mit diesem Verfahren für beide Hälften getrennt Minimim und Maximum (d.h minlinks und maxlinks sowie minrechts und maxrechts ) ermittelt. Das gesuchte Minimum ist dann das Minimum der beiden Zahlen minlinks und minrechts; entsprechend ist das Maximum die größere der beiden Zahlen maxlinks und maxrechts. Hinweise: 1. Sie können ohne weitere Überprüfung voraussetzen, dass 0 ≤ links ≤ rechts < Länge des Feldes gilt. 2. Iterative Lösungen werden nicht gewertet. - 11 - Aufgabe 6 (2 + 3 = 5 Punkte ) Gegeben sei folgendes Java Programm (die erste Spalte gehört nicht zum Programm und dient nur der Nummerierung der Zeilen): 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class A6a1 { int i; static int j; public int f() { return j; } } class A6a2 { int j; A6a1 k; } public class A6a3 extends A6a1 { public int f(int i) { return i-j; } A6a3 (int i) { this.i = i; j = 3*i+2; } public static void main (String args[]) { A6a3 k = new A6a3(5); System.out.println(k.f()); System.out.println(k.f(2)); } } a) Welche beiden Zahlen druckt das Programm nach Aufruf von “java A6a3” aus? b) Kreuzen Sie bei den folgenden Aussagen die jeweils korrekte Vervollständigung an. Achtung !!! Falsche Kreuze geben Punktabzug. A6a3 ist eine Subklasse von A6a1 Der Bezeichner j in Zeile 4 ist Klassenvariable Der Bezeichner A6a3 in Zeile 17 ist Klasse Parameter Konstruktor Der Bezeichner k in Zeile 21 ist Klasse Attribut nichts davon Die Klasse A6a2 hat keine(n) Unterklasse Instanzvariablen Konstruktor Klassenvariablen sind j in Zeile 9 k in Zeile 10 keine davon - 12 - A6a2 A6a3 nichts davon Instanzvariable Parameter Attribut Aufgabe 7 (7 + 4+ 5 = 16 Punkte ) a) Entwerfen Sie eine Javaklasse Kalender entsprechend folgender Spezifikation: Name: Kalender Attribute: jahr (ganze Zahl) monat (ganze Zahl) tag (ganze Zahl) Konstruktoren: 1. Parameter: keine Es wird das Datum 1.1.1600 erzeugt. 2. Parameter: j, m, t (ganze Zahlen) Es wird das entsprechende Datum erzeugt, sofern die drei Zahlen ein korrektes Datum (d.h. 1 ≤ Monat ≤ 12; 1 ≤ Tag ≤ entsprechende Monatslänge) nicht früher als 1.1.1600 darstellen. Sonst wird das Datum 1.1.1600 erzeugt. Methoden: zeige Parameter: − Rückgabewert: − Wirkung: Das Datum wird auf dem Bildschirm in der Form tt.mm.jjjj angezeigt. (Beispiel: 5. August 2003 ⇒ 05.08.2003 ) istSchaltjahr Parameter: − Rückgabewert: true / false Wirkung: Es wird geprüft, ob das aktuelle Jahr ein Schaltjahr ist. ( Ein Jahr ist ein Schaltjahr, wenn es - durch 400 oder - durch 4, aber nicht durch 100 teilbar ist.) monatslaenge Parameter: m (ganze Zahl) Rückgabewert: ganze Zahl. Wirkung: Ist 1 ≤ m ≤ 12, so wird die Länge des zugehörigen Monats im aktuellen Jahr ermittelt und zurückgereicht. Bei sonstigen Eingaben wird 0 zurückgereicht. Monatslängen: Januar, März, Mai, Juli, August, Oktober, Dezember: 31 Februar: 28 (kein Schaltjahr) bzw. 29 (Schaltjahr) restliche Monate: 30 Auf die Attribute soll nur mit den Methoden der Klasse und eventueller abgeleiteter Klassen zugegriffen werden können; auf die Methoden soll von überall her zugegriffen werden können. - 13 - Aufgabe 7 ( Fortsetzung ) - 14 - Aufgabe 7 ( Fortsetzung ) b) Entwerfen Sie eine Klasse Uhrzeit entsprechend folgender Spezifikation: Attribute: std, min (jeweils int) Konstruktoren: 1. Uhrzeit() (erzeugt die Uhrzeit 0:00) 2. Uhrzeit(int stunden, int minuten) (Ist 0 ≤ stunden ≤ 23 und 0 ≤ minuten ≤ 59, so wird die entsprechende Uhrzeit erzeugt. Andernfalls wird die Uhrzeit 0:00 erzeugt.) Methoden: zeige Parameter: Rückgabewert: Wirkung: gibt die aktuelle Uhrzeit im Format std:min auf dem Terminal aus copy Parameter: Rückgabewert: Uhrzeit Wirkung: liefert eine Kopie der aktuellen Uhrzeit Auf die Attribute darf nur mit Methoden der Klasse zugegriffen werden; die Methoden sollen von überallher zugreifbar sein. - 15 - Aufgabe 7 ( Fortsetzung ) c) Erweitern Sie die Klasse Kalender zu einer Klasse Terminkalender entsprechend folgender Spezifikation: Name: Terminkalender zusätzliche Attribute: termine ( Feld mit 10 Uhrzeiten) belegt (ganze Zahl; Anzahl der bereits eingetragenen Termine) Konstruktoren: Parameter: Wirkung: Methoden: wie bei Kalender wie bei Kalender; zusätzlich werden alle Uhrzeiten mit 0:00 und belegt mit 0 initialisiert. zeige Parameter: − Rückgabewert: − Wirkung: gibt das das aktuelle Datum und die belegten Termine aus. neuerTermin Parameter: z (Uhrzeit) Rückgabewert: Wirkung: Sind noch Termine frei, so wird eine Kopie der übergebenen Uhrzeit in termine (an der Position belegt) eingetragen und belegt um 1 erhöht. Sind schon alle Termine belegt, so wird nur eine entsprechende Meldung auf dem Bildschirm ausgegeben. Auf die Attribute soll nur mit den Methoden dieser Klasse zugegriffen werden können; auf die Methoden soll von überall her zugegriffen werden können - 16 - Aufgabe 7 ( Fortsetzung ) - 17 - Zusatzblatt - 18 -