Institut für Simulation und Graphik Magdeburg, 6. Februar 2012 Dr. Christian Rössl Klausur zur Vorlesung " Einführung in die Informatik" Name, Vorname Studiengang Matrikelnummer Zusatzbätter Unterschriften Student/in Aufsicht Hinweise zur Klausurbearbeitung Tabelle bitte nicht ausfüllen! Aufgabe max. Punkte erreicht 1 ADT 6 2 Korrektheit (rekursiv) 5 3 Korrektheit (imperativ) 6 4 Komplexität: Schleifen 3 5 Komplexität: Addition 3 6 Registermaschine 8 7 OOP 6 8 Binäre Suche 10 9 Quicksort 8 10 Wahr oder falsch? 5 A Bonus: Quadratwurzel (+2) 60 (+2) Bearbeitungszeit: 120 Minuten Überprüfen Sie die Klausur auf Vollständigkeit (12 nummerierte Blätter). Füllen Sie das Deckblatt aus! Beschriften Sie alle Blätter (Klausur, verteiltes Papier) mit Ihrem Namen. Legen Sie bitte alle für die Klausur benötigten Dinge, Stifte, Verpflegung und insbesondere Lichtbildausweis, auf Ihren Tisch. Schalten Sie Ihr Mobiltelefon aus! Hilfsmittel (Taschenrechner, Bücher, Skripten, Mobiltelefone,... ) sind nicht zugelassen! Täuschungsversuche führen zum Nichtbestehen der Klausur! Verwenden Sie für Ihre Antworten den freien Platz nach den Aufgaben und ggf. die Rückseiten der Blätter. Melden Sie sich, wenn Sie zusätzliche leere Blätter benötigen. Schreiben Sie deutlich! Unleserliche Passagen können nicht korrigiert werden. Benutzung von Bleistiften sowie roter und grüner Stiftfarbe ist untersagt. Beschränken Sie sich auf die geforderten Angaben und halten Sie Ihre Antworten kurz und präzise. Nicht geforderte Angaben ergeben keine zusätzlichen Punkte. Geben Sie bei Rechenaufgaben vor jedem Schritt an, was Sie gerade berechnen. Bewertet wird der Rechenvorgang, das Endergebnis allein genügt nicht. Viel Erfolg!
Aufgabe 1: Abstrakte Datentypen (6 Punkte) Erweitern Sie den vorgegebenen ADT Stack zur Darstellung von Stapeln um die Operatoren height und swap: height liefert die Höhe (Anzahl der Einträge) des Stapels, swap liefert eine Kopie des Stapels, wobei die beiden obersten Einträge vertauscht wurden! Geben Sie dazu Signaturen, Axiome und gegebenenfalls Vorbedingungen für height und swap an! Hinweis: Sie können, wenn nötig, die Typen Bool (Wahrheitswerte) und Nat (natürliche Zahlen inklusive Null) mit den üblichen logischen und arithmetischen Operatoren (z.b. und +) verwenden. t y p e Stack [ Item ] import Bool, Nat o p e r a t o r s empty_stack : Stack top : Stack Item push : Stack Item Stack pop : Stack Stack is_empty : Stack Bool axioms ( S : Stack), ( i : Item) top ( push (S,i)) = i pop ( push (S,i)) = S is_empty ( empty_stack ) = t r u e is_empty ( push (S,i)) = f a l s e p r e c o n d i t i o n s top (S) : is_empty (S) pop (S) : is_empty (S) Blatt 2
Aufgabe 2: Korrektheit rekursiv definierter Algorithmen (5 Punkte) Die partielle Funktion pow : Z Z Z ist rekursiv 1 definiert als pow(x,y) = if y = 0 then 1 else mult(pow(x, pred(y)), x) fi, mit mult(x,y) = x y und pred(x) = x 1. (a) Zeigen Sie mit Hilfe einer vollständigen Induktion, dass pow(x,y) = x y gilt für y 0! (b) Erklären Sie an diesem Beispiel kurz den Begriff partielle Funktion! 1 Hinweis: Die nachfolgende Aufgabe 3 betrachtet eine iterative Variante. Blatt 3
Aufgabe 3: Korrektheit imperativ definierter Algorithmen (6 Punkte) Gegeben ist der folgende iterative 2 Algorithmus POW (siehe unten). (a) Zeigen Sie, dass POW partiell korrekt ist bezüglich der Vorbedingung { Y 0 } und der Nachbedingung { Z = X Y }. Verwenden Sie dazu die Schleifeninvariante P X Y = Z X W. (b) Welche zusätzliche Eigenschaft wäre noch zu zeigen, um die totale Korrektheit bezüglich Vor- und Nachbedingung zu zeigen? (Nennen Sie diese Eigenschaft! Kein Beweis!) POW : var W,X,Y,Z : i n t ; i n p u t X,Y; Z :=1; W:=Y; w h i l e W 0 do Z:=Z*X; W:=W -1; od; o u t p u t Z; 2 Hinweis: Die vorhergehende Aufgabe 2 betrachtet eine rekursive Variante. Blatt 4
Aufgabe 4: Komplexität in O-Notation: Schleifen (3 Punkte) Zu welchen Komplexitätsklassen in Abhängigkeit von n gehören die folgenden Anweisungsfolgen? (Keine Begründung nötig!) (a) f o r ( i n t i =0;i<n ;++ i); (b) f o r ( i n t i =100;i<n ;++ i); (c) f o r ( i n t i =1;i <=n;i=i+i); (d) f o r ( i n t i =1;i <=n;++ i) f o r ( i n t j=n;j>i;--j); (e) f o r ( i n t i=n /2;i<n ;++ i); (f) f o r ( i n t i =0;i<n ;++ i) f o r ( i n t j =1;j <=n*n ;++ j); Blatt 5
Aufgabe 5: Komplexität in O-Notation: Schriftliches Addieren (3 Punkte) Gegeben ist eine natürliche Zahl n. Nehmen Sie an, Sie bestimmen die Summe n + n durch schriftliches Addieren mit Übertrag (im Dezimalsystem). Beispiel: Für n = 12345 ergibt sich 12345 + 12345 1 = 24690 Geben Sie den Aufwand der schriftlichen Addition in Abhängigkeit von n an, wobei zum Addieren zweier Dezimalstellen konstanter Aufwand O(1) angenommen wird. Begründen Sie Ihre Antwort! Blatt 6
Aufgabe 6: Registermaschine (8 Punkte) (a) Welche Funktion berechnet das folgende Programm einer Registermaschine M bei einer gegebenen Startkonfiguration b = 1,c 0 = 0,c 1 = x,c 2 = 0,... mit x 0? Geben Sie zur Begründung die gleiche Berechnung als Java- oder Pseudocode an! (b) Geben Sie ein Programm für eine Registermaschine an, das die folgende Funktion berechnet: { 0 für x > y f(x,y) = 1 sonst. Dabei gilt für die Startkonfiguration b = 1 und Eingabe c 1 = x, c 2 = y mit x,y 0. Die Ausgabe erfolgt in der Endkonfiguration als c 3 = f(x,y). Registermaschine M 1 CLOAD 1 2 STORE 2 3 LOAD 1 4 IF c 0 = 0 GOTO 12 5 LOAD 2 6 CMULT 3 7 STORE 2 8 LOAD 1 9 CSUB 1 10 STORE 1 11 GOTO 4 12 END Die Befehle haben folgende Bedeutung: Befehl Arg. Semantik LOAD i > 0 b = b + 1 c 0 = c i c j = c j für j 0 CLOAD i 0 b = b + 1 c 0 = i c j = c j für j 0 STORE i > 0 b = b + 1 c i = c 0 c j = c j für j i ADD i > 0 b = b + 1 c 0 = c 0 + c i CADD i > 0 b = b + 1 c 0 = c { 0 + i SUB i > 0 b = b + 1 c 0 = c 0 c i für c 0 c i 0 sonst { CSUB i > 0 b = b + 1 c 0 = c 0 i für c 0 i 0 sonst MULT i > 0 b = b + 1 c 0 = c 0 c i CMULT i 0 b = b + 1 c 0 = c 0 i DIV i > 0 b = b + 1 c 0 = c 0/c i CDIV i > 0 b = b + 1 c 0 = c 0/i GOTO i > 0 b = i IF c 0 = 0 GOTO END { i > 0 b i für c 0 = 0 = b + 1 sonst b = b Blatt 7
Aufgabe 7: OOP: Vererbung und Polymorphie (6 Punkte) Gegeben sind die folgenden Klassen als Java-Code. p u b l i c a b s t r a c t c l a s s Animal { p u b l i c a b s t r a c t v o i d move ( String dest ); p u b l i c v o i d move ( i n t x) { System. out. println ( " t e l e p o r t t o " +x); } } p u b l i c c l a s s Fish e x t e n d s Animal { p u b l i c v o i d move ( String dest ) { System. out. println ( " swim " + dest ); } } p u b l i c c l a s s Bird e x t e n d s Animal { p u b l i c v o i d move ( String dest ) { System. out. println ( " f l y " + dest ); } p u b l i c v o i d move ( i n t x, i n t y) { System. out. println ( " f l y " +x+y); } } p u b l i c c l a s s RoadRunner e x t e n d s Bird { p u b l i c v o i d move ( String dest ) { System. out. println ( " r u n " + dest ); } p u b l i c v o i d move ( i n t x) { System. out. println ( " r u n f a s t e r t o " +x); } } (a) Wie lautet die Ausgabe des folgenden Java-Codes? Ergänzen Sie die Tabelle. 1 Fish shark =new Fish (); 2 Bird bird =new RoadRunner (); 3 Animal animal =new Bird (); 4 5 animal. move ( " home " ); 6 animal = bird ; 7 shark. move (0) ; 8 bird. move (0) ; 9 animal. move ( " away " ); Zeile 5 7 8 9 Ausgabe nach System.out (b) Erklären Sie an diesem Beispiel kurz den Unterschied zwischen Überladen und Überschreiben von Methoden! Verwenden Sie dazu insbesondere die Begriffe Klasse und Signatur! (c) Welche der folgenden Code-Zeilen kann/können nicht übersetzt werden? Warum nicht? 1 Animal shark =new Fish (); 2 Animal gnu =new Animal (); 3 RoadRunner coyote =new RoadRunner (); 4 Fish nemo = coyote ; Blatt 8
Aufgabe 8: Binäre Suche (10 Punkte) Gegeben ist ein aufsteigend sortiertes Feld von ganzen Zahlen int [] a und eine ganze Zahl int x. Sie dürfen für die gesamte Aufgabe annehmen, dass a.length>0 und a[0] x a[a.length-1]. Der folgende Java-Code implementiert eine binäre Suche von x in a als eine Funktion find(a,x). 1 p u b l i c s t a t i c i n t find ( i n t [] a, i n t x) { 2 r e t u r n find (a,0,a. length -1,x); 3 } 4 s t a t i c i n t find ( i n t [] a, i n t left, i n t right, i n t x) { 5 i n t mid =( left + right ) /2; 6 7 i f (left > right x==a[ mid ]) r e t u r n mid ; 8 9 i f (x<a[ mid ]) r e t u r n find (a,left,mid -1,x); 10 e l s e r e t u r n find (a,mid +1, right,x); 11 } (a) Was berechnet find(a,x)? (Welche Bedeutung hat der Rückgabewert?) (b) Sei n := a.length die Größe der Eingabe. Leiten Sie einen Ausdruck für die im schlechtesten Fall nötige Anzahl von Vergleichen in Abhängigkeit von n her! Hinweise: Betrachten Sie nur den Test auf Gleichheit x==a[mid] (Zeile 7). Sie dürfen annehmen, dass n eine Zweierpotenz ist! (c) Geben Sie den Java-Code für eine nicht-rekursive Funktion int ifind(int[] a,int x) an, die die binäre Suche wie oben aber iterativ, also mit Hilfe einer Schleife, implementiert. Es soll also gelten gelten find(a,x)==ifind(a,x) für alle a, x. Blatt 9
Aufgabe 9: Quicksort (8 Punkte) Der Quicksort Algorithmus sortiert Daten rekursiv gemäß dem Teile-und-Herrsche Prinzip. Die nachfolgende Funktion partition implementiert einen wesentlichen Teil des Algorithmus. s t a t i c i n t partition ( i n t [] a, i n t left, i n t right ) { assert (left <= right ); i n t p=a[ right ], t; // pivot i n t i=l -1, j=r; do { do ++i; w h i l e (a[i]<p); do --j; w h i l e (j >0 && a[j]>p); t=a[i]; a[i]=a[j]; a[j]=t; } w h i l e (i<j); a[j]=a[i]; a[i]=a[ right ]; a[ right ]=t; } r e t u r n i; // new index of pivot (a) Erläutern Sie kurz die Semantik von m=partition(a,left,right) am Beispiel a={2,4,1,5,3}. (Beschreiben Sie nur das Ergebnis nicht die vorgegebene Implementierung!) (b) Implementieren Sie Quicksort in Java als Funktion public static void quicksort(int[] a). Verwenden Sie dazu partition() und gegebenenfalls eine Hilfsfunktion. (c) Geben Sie je eine Permutation der Folge (1,2,3,4,5) an, für die Quicksort (1.) möglichst wenige (bester Fall) bzw. (2.) möglichst viele (schlechtester Fall) Vertauschungen benötigt! (d) Erklären Sie kurz den Begriff stabiles Sortierverfahren! Ist Quicksort stabil? Blatt 10
Aufgabe 10: Wahr oder falsch? (5 Punkte) Kreuzen Sie jeweils (ohne Begründung!) an, ob eine Aussage wahr oder falsch ist. Für jede richtige Antwort gibt es einen halben Punkt, für jede falsche Antwort wird ein halber Punkt abgezogen. (Es gibt wenigstens 0 Punkte auf die gesamte Aufgabe.) Beantworten Sie also lieber nur Fragen, bei denen Sie sich sicher sind! Aussage wahr falsch Mergesort eignet sich als externes Sortierverfahren. 3,5,8,14,22 ist Teil der Fibonacci Folge. Menge M ist überabzählbar. M enthält unendlich viele Elemente. Die Menge der Funktionen ist abzählbar. Das Halteproblem ist entscheidbar. Nach Ausführung von c=b; a=b++; in Java gilt b==c+1 && a==b (für int a,b,c). In Java beschreibt (a>b? a : b) das Maximum aus a und b (für int a,b). log 2 n O(logn) n + 1 2 n2 + 1 3 n3 O(n 3 ) Für eine sortierte Folge ist die Ausführungszeit einer binären Suche immer geringer als die einer sequentiellen Suche. Blatt 11
Bonusaufgabe A: Ganzzahlige Quadratwurzel (2 Zusatzpunkte) Der Algorithmus XYZ aus der Vorlesung berechnet den ganzzahligen Anteil der Quadratwurzel einer positiven ganzen Zahl. XYZ : var W,X,Y,Z : i n t ; i n p u t X; Z :=0; W :=1; Y :=1 w h i l e W X do Z:=Z+1; W:=W+Y+2 Y:=Y+2 od; o u t p u t Z; (a) Geben Sie den asymptotischen Aufwand zur Berechnung der Ausgabe Z in Abhängigkeit von der Eingabe X in O-Notation an! Begründen Sie Ihre Antwort! (b) Geben Sie einen Algorithmus LXYZ an, der dasselbe Ergebnis mit logarithmischen Aufwand berechnet! (Also ( X 0) (XYZ(X) = LXYZ(X)) mit Aufwand O(logX).) Begründen Sie Ihren Ansatz! Blatt 12
Blatt 13