Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme Programmieren I Dr. Werner Struckmann 13. März 2017 Name: Vorname: Matrikelnummer: Anrede: Frau Kennnummer: Herr Studiengang: Bachelor Master Fachrichtung: Informatik Mobilität und Verkehr Elektrotechnik Diplom Frühstudium Wirtschaftsinformatik Psychologie Erasmus Mathematik Physik Maschinenbau ( Mechatronik) Wirtschaftsingenieurwesen ( Bauing E-Technik Maschbau) Finanz- und Wirtschaftsmathematik Versuch der Notenverbesserung: IST Sonstige: Bitte kreuzen Sie an, falls Sie teilgenommen haben: Programmierlabor, Legolabor. Die Bearbeitungszeit beträgt 120 Minuten. Die Klausur besteht aus 6 Aufgaben. Sie haben die Klausur bestanden, wenn Sie mindestens 35 von 70 möglichen Punkten erreicht haben. Aufgabe 1 2 3 4 5 6 Σ max. Punkte 5 8 16 11 8 22 70 Punkte Note: Bitte prägen Sie sich Ihre Kennnummer gut ein. Aus Datenschutzgründen wird das Klausurergebnis nur unter dieser Kennnummer bekannt gegeben. Aus den gleichen Gründen können Ergebnisse weder telefonisch noch per E-Mail mitgeteilt werden. Die Ergebnisse der Klausur erfahren Sie voraussichtlich ab dem 24. März 2017 auf der Web-Seite dieser Veranstaltung. Ihre Klausur können Sie am Mittwoch, den 12. April 2017, von 09:00 bis 11:30 Uhr und von 13:30 bis 16:30 Uhr im Raum 251 des Informatikzentrums einsehen. Aufgabe 1: Bitte kreuzen Sie die wahren Aussagen an. Für die vollständigen richtigen Antworten einer Gruppe erhalten Sie einen Punkt. Die Fragen dieser Aufgabe beziehen sich auf Java 8. Ausnahmebehandlung/Exception Handling: Die catch-or-throw-Regel gilt für RuntimeExeception nicht. Die throw-Anweisung leitet die Exception weiter. Eine try-catch-Anweisung muss mindestens eine catch-Klausel enthalten. Literale: Es gilt 0x8 != 8. 5e5 ist ein Literal von Typ double. +4_4 ist ein Literal für einen ganzzahligen primitiven Typ. Objektorientierung: Zwei abgeleitete Klassen können dieselbe Basisklasse besitzen. Innerhalb einer Klasse kann eine Methode nicht den gleichen Namen wie ein Attribut der Klasse besitzen. Es kann Variable geben, die während ihrer Gültigkeit auf Objekte verschiedener Typen verweisen können. Abstrakte Klassen: Eine abstrakte Klasse kann konkrete Methoden enthalten. Eine abstrakte Klasse kann von mehreren Klassen erweitert werden. Klassen, die nur konkrete Methoden enthalten, dürfen den Modifikator abstract verwenden. Deklarationen: Einzelne Deklarationen in der main-Methode: Die Deklaration int i = 0.0; führt zu einem Übersetzungsfehler. Die Deklaration int main = ’0’; führt zu einem Übersetzungsfehler. Die Deklaration int j = (short) 0; führt zu einem Übersetzungsfehler. 5 Punkte Aufgabe 2: (Zahldarstellung in Java) Schreiben Sie die Dezimalzahl 74 als Binär-, Oktalund Hexadezimalzahl in Java. Durch welche Bitfolge wird der byte-Wert −11 in Java gespeichert? a) (74)10 als Binärzahl in Java: b) (74)10 als Oktalzahl in Java: c) (74)10 als Hexadezimalzahl in Java: d) byte-Darstellung von −11: 8 Punkte Aufgabe 3: (Kontrollstrukturen, Operatoren, Arrays) Welche der beiden folgenden Schleifen terminieren? Geben Sie im Falle der Terminierung an, welche Werte die Variablen besitzen, nachdem die jeweiligen Anweisungen ausgeführt wurden. a) int a = 3; int b = 1; do { a = a + b; if (b == 4) continue; else b++; if ((a * b) % 3 == 1) break; a--; } while (a > b); Die Schleife terminiert: b) int x = 5; int y = 1; for (int i = 1; i < x += 4 - y; switch (y % 4) { case 1 : y = x case 2 : y = x case 3 : y = x default : y = x } } Die Schleife terminiert: ja nein a = b = x = y = x; i++) { + + - 4; 3; 2; 1; break; break; ja nein Geben Sie für jeden der folgenden Ausdrücke den primitiven Typ und den Wert des Ausdrucks an. Setzen Sie vor jedem Ausdruck die Deklaration int x = 17; voraus. c) ((4 | x ) ^ 5) pr. Typ: Wert: d) (x % 9 + ~(-1) + 2) pr. Typ: Wert: e) ((x & 1) == (x >> 4)) pr. Typ: Wert: Es sei a durch int[] a = new int[6]; deklariert. Geben Sie den Inhalt des Felds nach Ausführung der beiden folgenden Anweisungen an: f) for (int i = 5; i > -1; i--) a[i] = 3 + (i + i*2)/3; for (int i = 1; i < 7; i++) a[i-1] = a[a[i-1] - 3] + a[i-1]; a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = 16 Punkte Aufgabe 4: (Rekursion) Gegeben sei die folgende rekursive Methode: static int f(int x, int y) { if (x == 1) return y + 1; else if (x == y) return f(x - 2, y); else return f(x % 2, f(x - 2, y + 1) + 2); } Welchen Wert liefert der Aufruf f(11, 8)? In welcher Reihenfolge und mit welchen Parametern wird f dabei aufgerufen? Geben Sie die Reihenfolge der Aufrufe explizit an. Wie groß ist die maximale Rekursionstiefe, d. h. die maximale Anzahl gleichzeitig aktiver Aufrufe? Liefert für alle int-Werte x ≥ 0, y ≥ 0 der Aufruf f(x, y) einen int-Wert? Begründen Sie Ihre Antwort. 11 Punkte Lösung: –4– Aufgabe 5: (Programmverständnis) Gegeben seien die Methode public static boolean f(int i) { if (i <= 1) return false; int s = 1; for (int j = 2; j <= i/2; j++) { if (i % j == 0) s += j; } return s == i; } und das Programmfragment for (int i = 2; i <= 8; i++) { if (f(i)) { String t = ""+ i + "_=_" + "1"; for (int j = 2; j <= i/2; j++) if (i%j == 0) { t = t+"_+_"+j; } System.out.println(t); } } a) Was berechnet die Methode f in Abhängigkeit vom Parameter i? b) Wie lautet die Ausgabe des Programmfragments? 8 Punkte Lösung: –5– Aufgabe 6: (Programmerstellung) Eine natürliche Zahl n > 0 heißt Nivenzahl, wenn die Quersumme von n ein echter Teiler von n ist. Ein Beispiel für die Nivenzahlen ist 156, denn die Quersumme von 156 ist 12 = 1 + 5 + 6 und es gilt 156 = 12 ∗ 13. Die Mathematik hat bewiesen, dass die Zahlen 111, 222, 333, 444, 555, 666, 777, 888 und 999 Nivenzahlen sind. Schreiben Sie ein lauffähiges Java-Programm, das für alle dreistelligen natürlichen Zahlen prüft, ob es sich bei dieser Zahl um eine Nivenzahl handelt. Ist eine Zahl eine Nivenzahl, so soll die Ausgabe wie folgt aussehen: Quersumme(156) = 12 und 156 = 12 * 13 Beschreiben Sie Ihren Algorithmus. Schreiben Sie Ihren Programmcode auf die nächste Seite. Sie dürfen eigene Hilfsmethoden schreiben und verwenden, aber weder Klassen noch Methoden importieren. Auf diese Aufgabe erhalten Sie nur dann Punkte, wenn Sie ein Java-Programm angeben, das erkennbar geeignet ist, die Problemstellung zu lösen. In den 22 Punkten sind 4 Punkte für fehlerfrei compilierenden Code enthalten. 22 Punkte Lösung: –6– –7– –8–