Universität zu Lübeck Institut für Telematik Prof. Dr. Stefan Fischer Probeklausur im Fach Programmieren“ ” Hinweise zur Bearbeitung: Es sind keinerlei Hilfsmittel zugelassen. Diese Klausur umfasst 18 Seiten. Prüfen Sie Ihr Exemplar auf Vollständigkeit. Notieren Sie alle Lösungen direkt auf den Aufgabenblättern. Schreiben Sie nicht mit Bleistift sondern mit Tinte oder Kugelschreiber. Verwenden Sie keinen Rotstift. Vermerken Sie auf jedem abgegebenen Blatt Ihren vollständigen Namen und Ihre Matrikelnummer. Füllen Sie das folgende Formularfeld aus: Name: ................................................................. Vorname: ................................................................. Studiengang: ................................................................. Matrikel-Nr.: ................................................................. Versuch Nr.: 1 2 3 4 Viel Erfolg! Aufgabe 1 2 3 4 5 maximale Punktzahl 10 13 10 14 13 Summe: 60 Note: Seite 1 von 18 erreichte Punktzahl Name, Vorname: Aufgabe 1 Matrikel-Nr.: (10 Punkte) Bewerten Sie durch Ankreuzen, welche der folgenden Aussagen korrekt bzw. nicht korrekt sind. Ein richtig gesetztes Kreuz gibt 0,5 Punkte, ein falsch gesetztes Kreuz -0,5 Punkte. Aussagen, die mit keinem Kreuz versehen werden, gehen nicht in die Bewertung ein. Die minimale Punktzahl beträgt 0 Punkte. (10 Punkte) korrekt falsch 2 2 Moderne Mikroprozessoren arbeiten objektorientiert. 2 2 In Java ist der primitive Datentyp double immer 32 Bit breit. 2 2 In Java kann der primitive Datentyp int Werte zwischen −215 und 215 − 1 speichern. 2 2 Abstrakte Klassen können keine Konstruktoren enthalten. 2 Wird ein Attribut einer Java-Klasse static deklariert, so kann man auch dann darauf zugreifen, wenn noch keine Instanzen dieser Klasse erzeugt wurden. 2 2 Die Main-Methode eines Java-Programms muss immer static deklariert werden. 2 2 Die Umgebungsvariable CLASSPATH“ kann eine Auflistung von Jar” Dateien und Verzeichnissen enthalten, in denen die für ein Projekt erforderlichen Class-Dateien abgelegt sind. 2 2 Java-Bytecode kann von den meisten Mikroprozessoren direkt als Maschinencode verarbeitet werden. 2 2 Der Exponent einer IEEE754 -Zahl wird in Zweierkomplementdarstellung gespeichert. 2 2 Bei der Addition im Einerkomplement kann der Übertrag stets ignoriert werden. 2 2 Bei der Zweierkomplementdarstellung muss das Vorzeichenbit anders behandelt werden als die übrigen Bits. 2 2 Ein Algorithmus ist deterministisch, wenn er bei jedem Ablauf mit den gleichen Eingaben dieselbe Berechnung durchführt. 2 2 2 2 In Java ist der primitive Datentyp double eine IEEE754 -Fließpunktzahl. 2 In Java ist der primitive Datentyp int immer 32 Bit breit. Seite 3 von 18 korrekt falsch 2 2 Es gibt nichtterminierende Java-Programme. 2 2 Eine Oberklasse erbt von ihrer Unterklasse alle Konstruktoren. 2 2 Eine Instanz eines Objektes nennt man auch Klasse. 2 Eine Instanz einer Klasse ist insbesondere vom Typ der Oberklasse dieser Klasse. 2 2 Wird ein Konstruktor in der Unterklasse überschrieben, so kann der Code des Konstruktors der Oberklasse mittels des Schlüsselwortes super trotzdem aufgerufen werden. 2 2 Ein interface kann über Variablen verfügen. 2 Seite 4 von 18 Name, Vorname: Matrikel-Nr.: Aufgabe 2 : Zahlenumrechnung (13 Punkte) Achten Sie darauf, dass sämtliche Berechnungsschritte nachvollziehbar sind! (a) Zweier-Komplement: (8 Punkte) a) Rechnen Sie die drei Dezimalzahlen -4, 25 und -80 in 8-Bit-Zweierkomplementdarstellung um. b) Addieren die drei Zahlen aus Aufgabenteil (a) in 8-Bit-Zweierkomplementdarstellung. Seite 5 von 18 (b) Stellen Sie die Zahl −21, 37510 in der IEEE 754-Darstellung mit 32 Bit dar. Geben Sie bei der Umrechnung den Rechenweg an und benennen Sie die drei Teile, aus denen eine Zahl in der IEEE 754-Darstellung besteht. (5 Punkte) Seite 6 von 18 Name, Vorname: Matrikel-Nr.: Aufgabe 3 : Java-Fehlerfinden (10 Punkte) (a) In folgendem Java-Programm haben sich 10 Syntaxfehler eingeschlichen. Kennzeichnen Sie sämtliche Fehler im Quelltext und machen Sie Korrekturvorschläge. Für jede richtige Verbesserung erhalten Sie einen Punkt. Für jeden von Ihnen (unbeabsichtigt) eingebauten Fehler wird Ihnen ein Punkt abgezogen. Die minimal erreichbare Punktzahl beträgt bei dieser Aufgabe 0 Punkte. (10 Punkte) 1 public klasse Add { 2 public static void main( String [0] args) { byte [] ia1=new byte (2); byte [] ia2=new byte [3]; ia1 [1]=1; ia1 [0]=4; ia2 [1]=2; ia2 [0]=9; print (add(ia1;ia2 )); } 3 4 5 6 7 8 9 10 11 12 static byte [] add(byte [] a, byte [] b { int maxlength ==0; if (a.length >b. length ) maxlength =a. length ; System .out. println (" maxlength ist " maxlength ); else maxlength =b. length ; byte [] c = new byte[ maxlength +1]; byte uebertrag =0; for (int i=0; i< maxlength +1; i++) { byte z1 =0; byte z2 =0; if (i<a. length ) z1=a[i]; if (i<b. length ) z2=b[i]; c[i]= (byte )(( z1+z2+ uebertrag )%10); uebertrag = (byte )(( z1+z2+ uebertrag )/10); } return c; } 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public static this print (byte [] ia) { for (int i=ia.length -1; i >=0;i--) { system .out. print (ia[i]); } System .out. println (); } 34 35 36 37 38 39 40 } Seite 7 von 18 Seite 8 von 18 Name, Vorname: Matrikel-Nr.: Aufgabe 4 : Java-Implementierung (14 Punkte) (a) Geben Sie einen Algorithmus an, der die Dezimal-Quersumme einer int-Zahl namens ganzzahl berechnet und das Ergebnis als int zurückliefert. Der Rückgabewert soll immer positiv sein. Beispiele: ganzzahl 5 123 −123 89012 richtiges Ergebnis 5 6 6 20 Vervollständigen Sie hierzu die folgende Java-Methode! (8 Punkte) 1 public static int quersumme (int ganzzahl ){ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 } Seite 9 von 18 (b) Analysieren Sie das folgende Programm und achten Sie dabei insbesondere auf die verschiedenen Gültigkeitsbereiche der Klasse, der Methoden und der lokalen Variablen. Was wird auf der Konsole ausgegeben, wenn das Programm mit dem Übergabeparameter 21 aufgerufen wird? Begründen Sie Ihre jeweilige Antwort kurz. (6 Punkte) 1 public class Gueltigkeitsbereiche { 2 static int i = 10; 3 4 public static void main( String [] args) { 5 6 System .out. println ("a) i = "+i); 7 8 i = Integer . valueOf (args [0]); 9 10 int i = 5; 11 12 System .out. println ("b) i = "+i); 13 14 classMethod (); 15 16 Gueltigkeitsbereiche bereiche = new Gueltigkeitsbereiche (); System .out. println ("f) j = " + bereiche . memberMethod ()); 17 18 } 19 20 public static void classMethod (){ 21 22 System .out. println ("c) i = "+i); 23 24 int i = 42; 25 26 System .out. println ("d) i = "+i); 27 } 28 29 public int memberMethod (){ 30 31 int j = 88; { j = 5; } 32 33 34 35 36 System .out. println ("e) i = " + (++i)); return j; 37 38 } 39 40 } Seite 10 von 18 Name, Vorname: Matrikel-Nr.: . Seite 11 von 18 Aufgabe 5 : UML (13 Punkte) (a) Setzen Sie das UML-Diagramm aus Abbildung 1 in Java-Klassen um. Geben Sie vollständige Klassendefinitionen und Methodenköpfe an. Methoden- und Konstruktorenrümpfe brauchen Sie jedoch nicht mit anzugeben! (10 Punkte) Obst # farbe: String + anzahl: int + Obst(farbe: String) + gibAnzahl(): int # istSuess() : boolean Erdbeere Zitrone # gewicht: double - sauer : boolean + groesse: int - reif: boolean + Erdbeere(farbe: String, groesse: int, reif: boolean) + istReif() : boolean + setzeReif(reif: boolean) : void + Zitrone (farbe: String, gewicht: double, sauer: boolean) + gibGewicht(): double Abbildung 1: UML-Klassendiagramm Seite 12 von 18 Name, Vorname: Matrikel-Nr.: . Seite 13 von 18 (b) Schreiben Sie eine main()-Methode, die folgende Aufgaben ausführt: a) Legen Sie jeweils abwechselnd Erdbeer- und Zitronenobjekte an, bis insgesamt 10 Obststücke angelegt sind. Um die Anzahl der insgesamt angelegten Obststücke zu ermitteln, verwenden Sie die Klassenvariable anzahl der Klasse Obst (3 Punkte) Seite 14 von 18 Name, Vorname: Matrikel-Nr.: Platz für Notizen Seite 15 von 18 Name, Vorname: Matrikel-Nr.: Platz für Notizen Seite 17 von 18