Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme Dr. Werner Struckmann 29. Januar 2015 Programmieren I Übungsklausur Hinweise: • Bringen Sie zur Klausur Ihren Ausweis und Ihren Studierendenausweis mit. Ihren Raum erfahren Sie ein paar Tage vor der Klausur auf der Web-Seite dieser Veranstaltung. Während der Klausur dürfen Sie keine Unterlagen benutzen. • Eine Übungsklausur kann aus Umfangsgründen nicht den gesamten Stoff der Vorlesung abdecken. Aufgabe 1: (Zahldarstellung) Schreiben Sie die Dezimalzahlen 29 und 92 als Binär-, Oktal- und Hexadezimalzahlen. Durch welche Bitfolge wird der Int-Wert −29 in Java gespeichert? Aufgabe 2: (Grundlagen, Objektorientierung, Ausnahmebehandlung) Bitte kreuzen Sie an. Alle Fragen dieser Aufgabe beziehen sich auf Java. wahr falsch Unterschiedliche Literale von primitiven Datentypen stellen stets unterschiedliche Werte dar. Lokale Variable dürfen niemals den gleichen Bezeichner besitzen wie Klassen- oder Instanzvariable. Alle Operatoren sind ein- oder zweistellig. Eine abstrakte Klasse darf keine konkrete Methode enthalten. Innerhalb einer Klasse können mehrere Methoden denselben Bezeichner tragen. Ein Konstruktor besitzt keinen Rückgabewert. Die try-catch-Anweisung darf mehr als eine catch-Klausel besitzen. Mit Hilfe des Schlüsselwortes throws kann eine Ausnahme ausgelöst werden. Aufgabe 3: (Programmerstellung) Als sphenische Zahlen werden Zahlen bezeichnet, die genau das Produkt von drei verschiedenen Primzahlen sind. Beispiel: 30 ist eine sphenische Zahl: 30 = 2 · 3 · 5 70 ist eine sphenische Zahl: 70 = 2 · 5 · 7 60 ist keine sphenische Zahl: 60 = 2 · 2 · 3 · 5 Schreiben Sie eine Java-Methode static boolean sphenisch(int n), die den Wert true genau dann liefert, falls n eine sphenische Zahl ist. Eine IllegalArgumentException soll ausgelöst werden, falls n<2 ist. Aufgabe 4: (Kontrollstrukturen, Operatoren, Felder) Welche der 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 = 7; int y = 2; while (x > 0) y = x + y; if (x == 5) if (y < 10) x = x % y } { break; continue; 3; Die Schleife terminiert: b) int x = 1; int y = 2; do { x = x + y; switch (x%3) { case 0 : y = case 1 : y = case 2 : y = default : y = } } while (y < 20); x x x x Die Schleife terminiert: ja + + + - nein x = y = x = y = 1; 2; break; 3; break; 1; break; ja nein Geben Sie für jeden der folgenden Ausdrücke den Typ und den Wert des Ausdrucks an. Setzen Sie vor jedem Ausdruck die Deklaration int x = 13; voraus. c) (x>>3)<<3 Typ: Wert: d) !(x%3==2||x/3>5) Typ: Wert: e) (x-=3)^3 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 < a.length; i++) a[i] = (11-2*i)%7; for (int i = a.length-1; i >= 0; i--) a[i] = a[5-a[i]]; a[0] = a[1] = a[2] = a[3] = a[4] = a[5] = –2– Aufgabe 5: (Programmverständnis) Gegeben seien die Methode static int wasPassiert(int[][] a) { int i = 0, m = a[0].length; for (int j=1; j<a.length; j++) { if (a[j].length>=m) { i = j; m = a[j].length; } } int x = a[i][0], y = a[i][0]; for (int r : a[i]) { if (r>x) x=r; if (r<y) y=r; } return x-y; } sowie das Programmfragment int[][] a = {{3,2},{},{-1,3,5,2},{0},{},{-1,-2,-5,4}}; System.out.println("Ergebnis: "+wasPassiert(a)); a) Welchen Wert berechnet die Methode wasPassiert? Geben Sie den Wert in Abhängigkeit vom Parameter a an. b) Wie lautet die Ausgabe des Programmfragments? c) Welche Fehler können bei einem Aufruf der Methode ggf. auftreten? Begründen Sie Ihre Aussagen. Aufgabe 6: (Rekursion) Gegeben sei die folgende rekursive Methode: static int f(int x, int y) { if (y>=4) return 1; else if (x<=1) return 2; else return 3*f(x-2,y+1)-f(x,y+1); } Welchen Wert liefert der Aufruf f(3,-1)? 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? –3– Aufgabe 7: (Objektorientierung, Fehlerkorrektur) Gegeben seien die Klasse 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 class Bruchzahl { private boolean p; // Vorzeichen: true, falls der Bruch >=0 private int z; // Zähler: z>=0 private n; // Nenner: n>0 public Bruchzahl(boolean p, int z, int n) { if ( z<0 && n<=0 ) throw new IllegalArgumentException(); int g = ggt(z,n); this.p = p; this.z = z/g; this.n = n/g; } private static int ggt(int a, int b) { return b==0 ? a : ggt(b,a%b); } public Bruchzahl add(Bruchzahl r) { // Addition int a = p ? z : -z; int b = r.p ? r.z : -r.z; int x = a*r.n+b*n; return new Bruchzahl(x>=0,Math.abs(x),n*r.n); } public String toString() { return (p ? "+" : "-")+z+"/"+n; } } zur Darstellung von Brüchen mit Vorzeichen sowie das folgende Programmstück: 25 26 27 Bruchzahl r1 = new Bruchzahl(false,7,3), r2 = new Bruchzahl(true,6,5); System.out.println(add(r1,r2)); a) Die Programmzeilen enthalten Fehler. Markieren Sie die Fehler im Programmtext. b) Geben Sie die korrigierten Zeilen an. Was gibt das korrigierte Programm aus? Aufgabe 8: (Programmerstellung) Schreiben Sie eine Methode static void specialSort(int[] a) die ein Feld ganzer Zahlen als Parameter erhält und das Feld nach dem Betrag ihrer Elemente sortiert. Falls Elemente den gleichen Betrag besitzen, sollen die negativen Elemente vor den positiven Elementen stehen. Beispiel: Falls der Parameter a die Folge (5, 2, −5, 1, 3, −5, −2, 4, 0) ist, soll a in die Folge (0, 1, −2, 2, 3, 4, −5, −5, 5) umsortiert werden. Falls das Parameterfeld a keine Werte enthält oder das Null-Objekt ist, soll beim Aufruf der Methode eine IllegalArgumentException ausgelöst werden. Sie dürfen weder Methoden noch Klassen importieren, aber Hilfsmethoden schreiben. Beschreiben Sie Ihren Algorithmus.