Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme Programmieren I Dr. Werner Struckmann 17. Februar 2018 Name: Vorname: Matrikelnummer: Kennnummer: Anrede: Frau Herr Studiengang: Bachelor Master Diplom Frühstudium Erasmus Fachrichtung: Informatik Wirtschaftsinformatik Mathematik Physik Mobilität und Verkehr Psychologie Maschinenbau ( Mechatronik) Elektrotechnik Wirtschaftsingenieurwesen ( Bauing E-Technik Maschbau) Finanz- und Wirtschaftsmathematik IST Sonstige: Versuch der Notenverbesserung: 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 10 16 8 11 20 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 dürfen Ergebnisse weder telefonisch noch per E-Mail mitgeteilt werden. Die Ergebnisse der Klausur erfahren Sie voraussichtlich ab dem 22. Februar 2018 auf der Web-Seite dieser Veranstaltung. Ihre Klausur können Sie am Freitag, den 23. Februar 2018, von 10:00 bis 14:00 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. Interface: Ein Interface muss eine abstrakte oder eine konkrete Methode enthalten: In einem Interface kann eine Methode den Modifikator default bekommen: In einem Interface können Methoden den gleichen Namen bekommen: Operatoren: Der Operator + wird stets numerisch ausgewertet: Der Operator = ist rechtsassoziativ: Der Operator % liefert immer Werte >= 0: Arrays: Die Elemente eines Arrays können zum Beispiel vom Typ char sein: Die Länge eines Arrays kann stets vom Compiler festgestellt werden: Die Elemente eines Arrays können geändert werden: Objektorientierung: Von astrakten Klassen können keine Objekte erzeugt werden: Ein Objekt einer Klasse kann evtl. Variablen anderer Klassen zugeordnet werden: Man kann einstellen, dass Klassen von anderen Klassen durch extends nicht erweitert werden: Deklaration: Die Deklaration float w = 0.1F; erzeugt eine Fehlermeldung: Die Deklaration float x = 2E5f; erzeugt eine Fehlermeldung: Die Deklaration float y = (double) 2; erzeugt eine Fehlermeldung: Die Deklaration float z = f ; erzeugt eine Fehlermeldung: Die Deklaration float _$_2 = 2.0f; erzeugt eine Fehlermeldung: 5 Punkte 2
Aufgabe 2: (Zahldarstellung) Schreiben Sie die Hexadezimalzahl (0x7D) 16 als Binär-, Oktal- und als Dezimalzahl in Java. Durch welche Bitfolge wird der byte-wert 18 in Java gespeichert? Welchen Wert stellt der Ausdruck 17-013 + 0xd - 0b1110 in Java dar? a) (0x7D) 16 als Binärzahl in Java: b) (0x7D) 16 als Oktalzahl in Java: c) (0x7D) 16 als Dezimalzahl in Java: d) Byte-Darstellung von 18: e) Der Wert von 17-013 + 0xd - 0b1110: 10 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 x = 12; int y = 11; while ( x > y ) { switch (x / y) { case 0 : x = x + 1; case 1 : y = y - 4; break; case 2 : y = y + 8; case 3 : x = x + 1; break; default : y = y + 3; Die Schleife terminiert: ja nein x = y = b) int x = 8; int y = 5; for (int i = 1; i < x + y; i = i + 2) { x = y; if ( x < y ) { if ( x > y ) x++; else y--; else { if ( x > y ) y++; else x--; Die Schleife terminiert: ja nein x = y = 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 = 14; voraus. c) (x >> 1 ^ 7 ) pr. Typ: Wert: d) (x == (x 2)) pr. Typ: Wert: e) (x + ~2 - x%2) 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 = 0; i <= 15; i = i+3) a[i/3] = 10 - i%4; for (int i = 5; i >= 0; i--) a[i] = a[a[i] - 6] + 2*i - 2; a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = 16 Punkte
Aufgabe 4: (Programmverständnis) Gegeben seien die Methode static void g(int[][] a, int... t) { int m = t[0], n = t[0]; for (int l = 0; l <= t.length-1; l++) { if (t[l] < m) m = t[l]; if (t[l] > n) n = t[l]; assert m <= a.length & n >= a.length; int y = a[0].length; int i = 0; for (int k = 1; k <= a.length-1; k++) { if (a[k].length > y) { y = a[k].length; i = k; int s = 0; for (int j = 0; j <= a[i].length-1; j = j+2) { s = s + a[i][j] - a[i][j+1]; System.out.println(s); sowie das Programmfragment int[][] a = {{5,3,1,{2,1,3,2,{5,7; g(a, 2, 4); a) Was macht die Methode g in Abhängigkeit der Parameter a und int... t? Welche Fehler können während der Laufzeit dieser Methode auftreten? Begründen Sie Ihre Aussage. b) Wie lautet die Ausgabe des Programmfragments? Lösung: 8 Punkte 5
Aufgabe 5: (Rekursion) Gegeben sei die folgende rekursive Methode: static int f(int x, int y) { if (y <= 1) return y + 2; else if (x == 1) return x + 1; else return 2 + f(f(x-3,y), y/2); Welchen Wert liefert der Aufruf f(16, 3)? 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. Lösung: 11 Punkte 6
Aufgabe 6: (Programmerstellung) Eine der Goldbachschen Vermutungen (Christian Goldbach, 1690-1764) sagt, dass jede gerade Zahl n 6 als Summe von zwei ungeraden Primzahlen beschrieben werden kann. Für alle Zahlen ist dies bis heute noch nicht bewiesen. Beispiele: 6 = 3 + 3, 8 = 3 + 5, 10 = 3 + 7 = 5 + 5,... Schreiben Sie ein lauffähiges Java-Programm, das diese Vermutung bis n = 1000 prüft und die Summe ausgibt. Beschreiben Sie Ihren Algorithmus. Schreiben Sie Ihren Programmcode auf die nächste Seite. Sie dürfen eigene Hilfsmethoden schreiben, aber weder Klassen noch Methoden importieren. Auf diese Aufgabe erhalten Sie Punkte, wenn Ihr Programm erkennbar geeignet ist, die Problemstellung zu lösen. Lösung: 20 Punkte 7
8
9