¨ MUNCHEN ¨ TECHNISCHE UNIVERSITAT

¨ T FU ¨ R INFORMATIK FAKULTA Lehrstuhl fu ¨ r Sprachen und Beschreibungsstrukturen Einfu ¨ hrung in die Informatik I Prof. Dr. Helmut Seidl, A. Lehmann, A. Herz, Dr. M. Petter

SS 2011 Endtermklausur 6.8.2011

Name

Vorname

Studiengang

Matrikelnummer

H¨orsaal

Reihe

Sitzplatz

Unterschrift

Allgemeine Hinweise: • Bitte fu andig aus und unter¨ llen Sie die oben angegebenen Felder vollst¨ schreiben Sie! • Schreiben Sie nicht mit Bleistift oder in roter/gru ¨ ner Farbe! • Die Arbeitszeit betr¨ agt 120 Minuten. • Pru ¨ fen Sie, ob Sie alle 7 Seiten erhalten haben. • In dieser Klausur k¨ onnen Sie insgesamt 75 Punkte erreichen. Zum Bestehen werden in Midterm und Endterm zusammen 40 Punkte ben¨ otigt. • Es sind keine Hilfsmittel zugelassen.

2 Aufgabe 1 [20 Punkte] Javas Typsystem Gegeben seien die folgenden Klassen-Definitionen: class A { public s t a t i c void ); } public void public void private s t a t i c void public void } c l a s s B extends A { public void public void public void } c l a s s C extends A { public void }

p

( Object o ) { System . out . p r i n t l n ( o . t o S t r i n g ( )

m1 m1 m2 m2

(A () (A ()

a) { { a) { {

p ( ”m1(A) i n A”) ; m1(new B( ) ) ; p ( ”m2(A) i n A”) ; m2( t h i s ) ;

} } } }

m1 (B b ) { m2 (A a ) { m3 ( ) {

p ( ”m1(B) i n B”) ; p ( ”m2(A) i n B”) ; super . m1( t h i s ) ;

} } }

m1 (C c ) {

p ( ”m(C) i n C”) ;

}

a) Welche der folgenden Anweisungen werden vom Java-Compiler ohne Fehler u ¨bersetzt? Hinweis: Richtige Antworten bringen 2 Punkte, falsche Antworten kosten 2 Punkte, Enthaltungen bringen 0 Punkte. F¨ ur diese Teilaufgabe erhalten Sie als Gesamtpunktzahl keine negativen Punkte.

 Richtig A a = new A(); B.m2(a); . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  Richtig A a = new A(); B b = new B(); ((A)b).m2(a); . . . . . . . .  Richtig class D extends B { public static void m1(B b){} } .  Richtig A a = new A(); ((B)a).p(a); . . . . . . . . . . . . . . . . . . . . . . . . . .  Richtig C ca = new C(); . . . . . . . . . . . . . . . . . . . . . . . . . . .  Richtig

i) A a = new B(); a.m1(new B()); . . . . . . . . . . . . . . . . . . . . . . ii) iii) iv) v) vi)

 Falsch  Falsch  Falsch  Falsch  Falsch  Falsch

b) (Bonus) Welche der folgenden Anweisungen werden vom Java-Compiler ohne Fehler u ¨bersetzt? Hinweis: Richtige Antworten bringen 2 Punkte, falsche Antworten kosten 2 Punkte, Enthaltungen bringen 0 Punkte. F¨ ur diese Teilaufgabe erhalten Sie als Gesamtpunktzahl keine negativen Punkte. i) C ca = new C(); ca.m1(new C()); . . . . . . ii) C ca = new C(); ca.m1(new C()); . . . . . . iii) C ca = new C(); ca.m1(new C()); . . . . . .

 Richtig  Falsch  Richtig  Falsch  Richtig  Falsch

3 c) Welche Ausgaben und/oder Exceptions produzieren die folgenden Anweisungen? Hinweis: Sie finden die verwendeten Klassen nochmals im Anhang zum Abtrennen. i) B b=new B(); A a =b; a.m1(b); ............................................................................... ............................................................................... ............................................................................... ............................................................................... ............................................................................... ii) B b=new B(); B a =b; b.m1(a); ............................................................................... ............................................................................... ............................................................................... ............................................................................... ............................................................................... iii) C ca = new C(); ((A)ca).m1(ca); ............................................................................... ............................................................................... ............................................................................... ............................................................................... ............................................................................... iv) B b = new B(); b.m1(); ............................................................................... ............................................................................... ............................................................................... ............................................................................... ............................................................................... v) B b = new B(); b.m2(); ............................................................................... ............................................................................... ............................................................................... ............................................................................... ............................................................................... vi) B b = new B(); b.m3(); ............................................................................... ............................................................................... ............................................................................... ............................................................................... ...............................................................................

4 Aufgabe 2 [15 Punkte] Modellierung An der Nicht-technischen Universit¨at Garchinsk soll eine Klausur im Fach Diabolische Mathematik geschrieben werden. Professor Hellmuth Seidel hat sich das folgende effiziente Verfahren zur Korrektur und Bewertung der Klausur u ¨berlegt: H¨orer einer Vorlesung verf¨ ugen u ¨ber unterschiedliche Wissensst¨ande, die durch einen ganzzahligen Wert von 1 bis 5 dargestellt und durch die Methode getWissen zur¨ uckgegeben werden. Die Klausurnote jedes H¨orers, die als reelle Zahl durch die Methode eval zur¨ uckgegeben werden soll, ergibt sich dann als Mittelwert aus einer gew¨ urfelten Zahl von 1 bis 5 sowie dem jeweiligen Wissensstand. Studenten und Studentinnen sind spezielle H¨orer, die sich jeweils durch einen festen Wert an Wissen auszeichnen. Studenten haben einen Wissenswert von konstant 3, Studentinnen haben einen Wissenswert von konstant 1. Implementieren Sie entsprechend dieser Vorgaben die Klassen Hoerer, Student und Studentin. Die Klasse Hoerer soll nicht instantiiert werden k¨onnen und die Objektmethode getWissen in dieser Klasse prototypisch deklariert werden. Eine Zufallszahl im Intervall [0, 1) k¨onnen Sie mit Hilfe von Math.random() ermitteln.

5 Aufgabe 3 [20 Punkte] Bin¨ arer Suchbaum Ein Bin¨arbaum ist ein Baum, in dem alle Knoten einen Wert und 2 Teilb¨aume haben. Bei einem bin¨aren Suchbaum (BSB) gilt f¨ ur jeden Knoten des Baumes, dass sein Wert: • gr¨osser ist als die Werte aller Knoten in seinem linken Teilbaum; • kleiner ist als die Werte aller Knoten in seinem rechten Teilbaum; • maximal einmal im ganzen BSB vorkommt. Beispiel: In der obigen Zeichnung finden Sie einen BSB f¨ ur die Zahlen 1, 3, 6, 7, 8, 10, 13, 14. Die Knoten innerhalb des BSBs sind mit Objekten der Klasse BSB dargestellt: public c l a s s BSB { private BSB l e f t ; private BSB r i g h t ; private int v a l u e ; public BSB( int v ) { value = v ; } }

Erg¨anzen Sie die Klasse BSB um folgende Objekt-Methoden: a) int min() und int max(), die die kleinste bzw. gr¨oßte Zahl dieses BSBs ausgeben b) BSB removeMax(), die den aktuellen BSB zur¨ uckgibt, in dem die gr¨oßte Zahl entfernt wurde. Der urspr¨ ungliche BSB darf dabei modifiziert werden. Beispiel: Die folgende Zeichnung illustriert einen Aufruf von removeMax():

removeMax()

−→

c) boolean isSearchTree(), die u uft, ob in dieser BSB-Instanz tats¨achlich die Be¨berpr¨ dingungen f¨ ur einen bin¨aren Suchbaum eingehalten werden. Beispiel: Die folgenden Zeichnungen illustrieren B¨aume, die die Bedingungen f¨ ur bin¨are Suchb¨aume verletzen:

6 Aufgabe 4 [20 Punkte] Threads Die F¨ahre Ferry transportiert immer genau 6 Passagiere vom linken zum rechten Ufer. Falls die F¨ahre bereits voll ist oder sich nicht am linken Flussufer befindet, m¨ ussen neue Passagiere am Ufer warten. Sobald der 6. Passagier die F¨ahre betreten hat, soll die F¨ahre ablegen und den Fluss mit den 6 Passagieren u ¨berqueren. Sobald der 6. Passagier die F¨ahre verlassen hat, soll die F¨ahre wieder zum linken Flussufer zur¨ uckkehren. 6x

1. 2. 3. 4. 5. Jeder Passagier ist ein eigener Thread, eine F¨ahre ist gegeben durch: c l a s s Ferry { boolean l e f t R i v e r S i d e = true ; int o c c u p a t i o n = 0 ; // c o u n t s p a s s e n g e r s on board // p a s s e n g e r b o a r d s int occupy ( ) { o c c u p a t i o n ++; return o c c u p a t i o n ; } // p a s s e n g e r d e b a r k s int deoccupy ( ) { o c c u p a t i o n −−; return o c c u p a t i o n ; } void t r a v e r s e R i v e r ( ) { try { // do i m p o r t a n t s a i l i n g and a n c h o r i n g b u s i n e s s . . . . Thread . s l e e p ( 5 0 0 0 ) ; } catch ( I n t e r r u p t e d E x c e p t i o n ex ) { } leftRiverSide = ! leftRiverSide ; } boolean i s F u l l y O c c u p i e d ( ) { // i s number o f p a s s e n g e r s e x h a u s t e d ? return o c c u p a t i o n == 6 ; } boolean i s A t L e f t R i v e r S i d e ( ) { return l e f t R i v e r S i d e ; } }

Erg¨anzen Sie die Klasse Ferry um die Objekt-Methoden a) triggerReturn(), die einen neuen Thread startet, in dessen run-Methode die F¨ahre vom rechten zum linken Ufer gefahren wird. b) embarkAndDisembark(), die von jedem Passagier genau einmal aufgerufen wird, so¨ bald er die F¨ahre zum Uberqueren des Flusses vom linken zum rechten Ufer benutzen will. Sobald der 6. Passagier einen Platz auf der F¨ahre bekommen hat, soll traverseRiver() aufgerufen werden. Achten Sie darauf, dass Aufrufe von embarkAndDisembark() die u ¨berquerenden Passagiere solange zum Warten zwingen, bis traverseRiver() terminiert ist. Der letzte Passagier sollte, bevor sein embarkAndDisembark() terminiert, die R¨ uckkehr der F¨ahre u ¨ber triggerReturn() veranlassen. Falls die F¨ahre bereits voll ist oder sich nicht am linken Flussufer befindet, sollen weitere neue Passagiere zum Warten gezwungen werden, bis die F¨ahre wieder leer am linken Flussufer eintrifft. Hinweis: Sch¨ utzen Sie kritische Bereiche und vermeiden Sie Busy Waiting!

7

Anhang Die Klassen auf dieser Seite entsprechen denen in Aufgabe 1. Diese Seite darf abgetrennt werden. class A { public s t a t i c void ); } public void public void private s t a t i c void public void } c l a s s B extends A { public void public void public void } c l a s s C extends A { public void }

p

( Object o ) { System . out . p r i n t l n ( o . t o S t r i n g ( )

m1 m1 m2 m2

(A () (A ()

a) { { a) { {

p ( ”m1(A) i n A”) ; m1(new B( ) ) ; p ( ”m2(A) i n A”) ; m2( t h i s ) ;

} } } }

m1 (B b ) { m2 (A a ) { m3 ( ) {

p ( ”m1(B) i n B”) ; p ( ”m2(A) i n B”) ; super . m1( t h i s ) ;

} } }

m1 (C c ) {

p ( ”m(C) i n C”) ;

}