Name: Matrikelnummer: 1.) Zahlensysteme (10 Punkte) (a) Stellen Sie die folgenden zur Basis 8 (oktal) angegebenen Ganzzahlen als vorzeichenbehaftete Binärzahlen in 7 Bit dar. Negative Binärzahlen sollen im Zweierkomplement repräsentiert werden. (17)8 : (−37)8 : (b) Führen Sie die folgenden arithmetischen Operationen auf den ganzen Zahlen in der vorzeichenbehafteten 7 Bit-Binärdarstellung schriftlich durch. Negative Binärzahlen sollen im Zweierkomplement repräsentiert werden. Ergebnisse ohne Rechenweg werden nicht bewertet. (−17)10 − (17)10 (−41)10 + (41)10 (c) Übertragen Sie die Zahl (1ABC)16 vom Hexadezimalsystem in das Binärsystem. (d) Übertragen Sie die Zahl (10)10 vom Dezimalsystem in das Hexadezimalsystem: Seite 1 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: (e) Gegeben sei die Dezimalzahl -0,125. Die Zahl sei als Gleitkommazahl analog zur IEEE-Norm 754 mit 1 Vorzeichenbit, 2 Bit Mantisse und 4 Bit Exponent gespeichert. Geben Sie für diese Zahl die nächstkleinere Zahl an, die man im selben Gleitkomma-Format kodieren kann. Geben Sie Ihr Ergebnis als Dezimalzahl an. (f) Stellen Sie die Dezimalzahl -40,375 als Gleitkommazahl im Binärformat nach der IEEE-Norm 754 dar. Verwenden Sie 1 Bit für das Vorzeichen, 8 Bit für den Exponenten und 23 Bit für die Mantisse. Vorzeichen: Exponent: Mantisse: (g) Die Java-Funktion mult16 erhält als Argument eine positive Hexadezimalzahl, deren Ziffern (0-9 bzw. A-F) als Elemente des Feldes char[] a gespeichert sind. Die Ziffern sind dabei in aufsteigender Wertigkeit beginnend ab dem ersten Element des Feldes abgelegt. Die Funktion soll die übergebene Hexadezimalzahl mit 16 multiplizieren und das Ergebnis als neues Feld wiederum in der beschriebenen Repräsentation als Hexadezimalzahl zurückliefern. Das ursprüngliche Feld darf dabei nicht verändert werden! Die Zahl bzw. ihre Ziffern dürfen nicht in ein anderes Zahlensystem konvertiert werden! public static char [] mult16 ( char [] a ) { } Seite 2 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: 2.) Grammatiken (6 Punkte) (a) Gesucht ist die vollständige Beschreibung einer Grammatik G für die folgende Sprache L(G): L(G) = {baum, krone, baumkrone, baumstamm, zierbaum, tannenbaum, tannenbaumschmuck}. Die Menge der Terminalsymbole sei P = {baum, krone, stamm, zier, tannen, schmuck}. Geben Sie die Menge der Nichtterminalsymbole N und der Produktionen (Ersetzungsregeln) P für eine Grammatik an, welche exakt die in L(G) definierte Sprache akzeptiert. Dabei darf auf der rechten Seite einer Produktion maximal ein Terminal und höchstens zwei Nichtterminale vorkommen, und das leere Wort darf nicht vorkommen. Seite 3 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: (b) Gegeben sei die folgende Grammatik mit den Terminalsymbolen ’(’ und ’)’. ist das leere Wort: S→(S) S→SS S→ Geben Sie den Ableitungsbaum für das Wort ’()((()()))(())’ an. Seite 4 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: 3.) Reguläre Ausdrücke und Zustandsautomaten (7 Punkte) (a) Geben Sie für jedes der folgenden Wörter mit JA“ oder NEIN“ an, ob es sich aus dem regulären ” ” Ausdruck a∗ |(a∗ ba∗ ba∗ ba∗ )∗ bilden lässt. Richtige Antworten bringen 0,5 Punkte, falsche Antworten kosten 0,5 Punkte, Enthaltungen bringen 0 Punkte. Für diese Teilaufgabe erhalten Sie als Gesamtpunktzahl keine negativen Punkte. ’’ ’bbb’ ’aaa’ ’abbbaaa’ ’abbaaaa’ ’bbbaababbaa’ ’baabbbaa’ ’aaabbbab’ (b) Konstruieren Sie einen deterministischen endlichen Automaten (DEA), der alle Folgen von Nullen und Einsen akzeptiert, die die Folge ’01011’ enthalten. Gehen Sie davon aus, dass der Automat eine Folge nicht akzeptiert, wenn die Eingabe in einem beliebigen Zustand ausser dem Endzustand bereits vollständig abgearbeitet sein sollte. Sie müssen dann keinen zusätzlichen Endzustand verwenden. (c) Geben Sie einen regulären Ausdruck für die Sprache über dem binären Alphabet an, die alle Wörter enthält, in denen mindestens 3 mal das Zeichen ’1’ vorkommt. Seite 5 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: 4.) Funktionen und Rekursion (10 Punkte) (a) Die McCarthy-Funktion ist folgendermaßen definiert: n − 10 für n > 100 M (n) = M (M (n + 11)) für n ≤ 100 Im Folgenden ist die Implementierung einer rekursiven Funktion in Java angegeben, die McCarthyZahlen gemäß der obigen Definition für eine übergebene Ganzzahl berechnet und zurückliefert: int mccarthy ( int n ) { if ( n > 100) { return n - 10; } else { return mccarthy ( mccarthy ( n + 11)); } } Schreiben Sie nun eine Prozedur in Java, welche die implementierte McCarthy-Funktion verwendet. Die Prozedur soll für alle ganzen Zahlen von 0 bis 100 die McCarthy-Zahlen berechnen. Falls die McCarthy-Funktion für eine Zahl nicht den Wert 91 zurückliefert, so soll diese Zahl ausgegeben werden. Falls außerdem eine Prüfung ergibt, dass alle Zahlen den Funktionswert 91 haben, so soll ausgeben werden: Alle Zahlen haben den Funktionswert 91.“. ” Seite 6 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: (b) Implementieren Sie eine rekursive Funktion int search(int n, int vec[], int elem), die -1 zurückliefert, wenn das Feld vec das Element elem nicht enthält, oder andernfalls den größten Index zurückliefert, an dem das Element im Feld steht. Gehen Sie davon aus, dass Ihre Methode initial mit n = 0 aufgerufen wird. int search ( int n , int vec [] , int elem ) { } Seite 7 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: (c) Schreiben Sie zwei Funktionen boolean even(int n) und boolean odd(int n), die sich wechselseitig rekursiv aufrufen, um zu berechnen, ob die positive Zahl n gerade oder ungerade ist. Beachten Sie hierbei, dass keine Schleifen verwendet werden dürfen, eine if-Anweisung nur mit dem Vergleichsoperator > verwendet werden darf, nur das Dekrementieren von Variablen sowie die return-Anweisung verwendet werden dürfen, die Funktionen sich nur gegenseitig aufrufen dürfen. boolean even ( int n ) { } boolean odd ( int n ) { } Seite 8 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: 5.) Gray-Codes (8 Punkte) Der Gray-Code für ein gegebenes N ist eine Folge von N -stelligen Codewörtern aus binären Ziffern, bei der sich benachbarte Codewörter immer nur in einer einzigen Stelle unterscheiden. Beispiel: N =2 N =3 Codewörter 00, 01, 11, 10 000, 001, 011, 010, 110, 111, 101, 100 Man kann alle Codewörter des Gray-Codes für ein gegebenes N ausgeben, indem man rekursiv zuerst die Folge der (N − 1)-stelligen Gray-Codes mit vorangestellter "0" und anschließend die Folge der (N − 1)-stelligen Gray-Codes in umgekehrter Reihenfolge mit vorangestellter "1" ausgibt. Gegeben sei nun das folgende Java-Programm zur Ausgabe des Gray-Codes für ein übergebenes N : public class GrayCode { // Gibt alle N - stelligen Codewoerter in umgekehrter Reihenfolge // mit vorangestelltem prefix aus public static void yarg ( String prefix , int N ) { if ( N == 0) { System . out . println ( prefix ); } else { _______________________________________________ // (1) _______________________________________________ // (2) } } // Gibt alle N - stelligen Codewoerter mit vorangestelltem prefix aus public static void gray ( String prefix , int N ) { if ( N == 0) { System . out . println ( prefix ); } else { gray ( prefix + " 0 " , N - 1); yarg ( prefix + " 1 " , N - 1); } } public static void main ( String [] args ) { int N = Integer . parseInt ( args [0]); gray ( " " , N ); } } (a) Vervollständigen Sie die Methode yarg an den Stellen (1) und (2) im obigen Quelltext so, dass die Codewörter des Gray-Codes für N durch das Programm wie beschrieben ausgegeben werden. Seite 9 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: (b) Illustrieren Sie graphisch durch Angabe eines sogenannten Aufrufbaumes die Reihenfolge der Aufrufe der Methoden gray(String prefix, int N) und yarg(String prefix, int N). Die Wurzel des Aufrufbaumes besteht aus einem Knoten (als Kreis dargestellt) mit Inhalt ("", 3) und repäsentiert den initialen Aufruf von gray("", 3) Alle weiteren rekursiven Aufrufe von gray bzw. yarg werden als neue Knoten dargestellt, die mit demjenigen Knoten über eine Linie verbunden werden, der zur aufrufenden Methode korrespondiert. Jeder neue Knoten wird wiederum als Kreis dargestellt, in dem die Werte der dazugehörigen Methodenargumente dargestellt sind. Ordnen Sie die Elemente des Aufrufbaums entsprechend ihrer Aufrufreihenfolge bzw. Rekursionstiefe jeweils von links nach rechts bzw. oben nach unten. Hinweis: Sie müssen den Unterschied zwischen gray und yarg nicht graphisch kennzeichnen. "", 3 Seite 10 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: 6.) Typverträglichkeit und Polymorphie (9 Punkte) (a) Gegeben sei das folgenden Java-Programm: public interface PinKeyboard {} public interface QwertyKeyboard {} public class Automat {} public class Geldautomat extends Automat implements PinKeyboard {} public class K on t o au s z ug s D ru c k er extends Automat implements PinKeyboard {} public class U e b e r w e i s u n g s A u t o m a t extends K on t o au s z ug s D ru c k er implements QwertyKeyboard {} Gegeben seien außerdem die folgenden Variablen: Automat a Geldautomat g K on t o a us z u gs D r uc k e r k UeberweisungsAutomat u = = = = new new new new Automat (); Geldautomat (); K o nt o a us z u gs D r uc k e r (); U e b e r w e i s u n g s A u t o m a t (); PinKeyboard p = new PinKeyboard () { public void enterPin ( int pin ) { System . out . println ( " Anonymous PinKeyboard : " + pin ); } }; QwertyKeyboard q = new QwertyKeyboard () { public void pressKey ( char c ) { System . out . println ( " Anonymous QwertyKeyboard : " + c ); } }; Geben Sie für die folgenden Anweisungen an, ob sie jeweils RICHTIG“ sind oder einen LAUF” ” ZEITFEHLER“ oder einen COMPILERFEHLER“ verursachen. ” a = u = k; k = u; g = u; g = (Geldautomat) u; Seite 11 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: u = (UeberweisungsAutomat) g; p = k; q = k; k = u; q = (UeberweisungsAutomat) k; p = q; q = p; p = (PinKeyboard) q; q = (QwertyKeyboard) p; (b) Gegeben sei das folgenden Java-Programm: class X { int a = 4; int get () { return a ; } } class Y extends X { static int a = 7; int get () { return a ; } static void set ( int x ) { a = x ; } static void set ( char c ) { a = 2 * c ; } } class Z extends Y { static int b = 3; int get () { return b + a ; } static int get ( X x ) { return x . a ; } static void set ( int i ) { a = 3 * i ; } static void set ( X x , int i ) { a = i ; } static void test () { Z z = new Z (); System . out . println ( z . a ); // 1) _ __ _ _ __ _ _ __ _ _ __ _ _ __ System . out . println ( get ( z )); // 2) _ __ _ _ __ _ _ __ _ _ __ _ _ __ System . out . println ((( X ) z ). get ()); // 3) _ __ _ _ __ _ _ __ _ _ __ _ _ __ z . set ( ’c ’ - ’a ’ -1); System . out . println ( get ( z )); // 4) _ __ _ _ __ _ _ __ _ _ __ _ _ __ System . out . println ( z . get ()); // 5) _ __ _ _ __ _ _ __ _ _ __ _ _ __ Y y = z; Seite 12 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Matrikelnummer: y . set (2); System . out . println ( z . get ()); // 6) _ __ _ _ __ _ _ __ _ _ __ _ _ __ z . set (y ,0); System . out . println ( y . get ()); // 7) _ __ _ _ __ _ _ __ _ _ __ _ _ __ } } Geben Sie zu den Anweisungen in der Methode test, die mit einer Nummer im Kommentar gekennzeichnet sind, die enstprechenden Ausgaben an. Schreiben Sie Ihre Antworten hinter die jeweilige Nummer im Kommentar. Seite 13 von 14 Informatik 1 – Wiederholungsklausur WS 2011/12 Name: Seite 14 von 14 Matrikelnummer: Informatik 1 – Wiederholungsklausur WS 2011/12