Vorbemerkungen: Bitte beachten Sie, dass diese Aufgaben keinerlei Beschränkung des zu prüfenden Stoffes noch sonstige Rückschlüsse auf die Klausur begründen. Die Auswahl der hier gestellten Aufgaben erfolgte unter dem Gesichtspunkt, Ihnen einen Eindruck von möglichen Klausur-Aufgaben vermitteln. Eine Beschränkung der Klausur- Aufgaben auf die hier ausgewählten Themen ist damit nicht verbunden. Bei einigen Aufgaben liegt es nahe, zur Lösung einen Computer zu Hilfe zu nehmen. Da bei der Klausur aber keine Hilfsmittel erlaubt sind, sollten Sie dies bei Ihrer Vorbereitung beachten. Die Lösungen der Aufgaben werden in der Vorlesung am 2004-Feb-04 vorgestellt. Am Tag vorher werden die Lösungen im Web veröffentlicht. Aus Platzgründen wird in der Aufgabe 7 auf die Post-Aufgabe aus den Übungen verwiesen. In der Klausur würden die Angaben mit in der Aufgabenstellung stehen. Algorithmik I WS 2003/04 1
Aufgabe 1 10 Punkte Gegeben sei folgendes Java-Programm: 1 c l a s s F e h l e r h a f t O d e r N i c h t { 2 p u b l i c s t a t i c void main ( S t r i n g [ ] a r g s ) { 3 i n t l f v = ( i n t ) 2. 3 4 5 ; 4 double i = 3 ; 5 boolean b = f a l s e ; 6 7 System. o u t. p r i n t l n ( Programm S t a r t ) ; 8 f o r ( i n t t e s t = 0 ; b ; l f v ) { 9 ; 10 11 while ( b = true ) { 12 System. o u t. p r i n t l n ( i n d e r While S c h l e i f e ) ; 13 } / / w h i l e 14 15 } / / f o r 16 System. o u t. p r i n t l n ( Programm Ende ) ; 17 } / / main 18 } / / c l a s s F e h l e r h a f t O d e r N i c h t Untersuchen Sie das Programm zunächst auf syntaktische Fehler. Entscheiden Sie, ob das Programm übersetzbar und ausführbar ist oder nicht. Bearbeiten Sie abhängig von Ihrer Entscheidung genau eine der beiden folgenden Aufgaben: a) Wenn Sie der Meinung sind, dass das Programm syntaktische Fehler enthält, so geben Sie diese unter Angabe der Zeilennummer an. b) Wenn Sie der Meinung sind, dass das Programm übersetzbar und ausführbar ist, dann geben Sie genau an, was das Programm ausgibt. Lösungsvorschlag Aufgabe 1 8 Punkte für die richtige Entscheidung, dass das Programm keine Fehler enthält. 2 Punkte für die richtige Ausgabe. Lösung: Das Programm ist fehlerfrei übersetzbar und ausführbar. Das Programm gibt genau zwei Zeilen Text aus: Programm-Start Programm-Ende Algorithmik I WS 2003/04 2
Aufgabe 2 10 Punkte Geben Sie für jede der folgenden Formeln einen Ausdruck in Java an, der sie berechnet. Setzen Sie Variablen mit geeigneten Namen und Datentypen voraus. a) s = s 0 + v 0 t + 1 2 gt b) EW = AW(1 + p/100) LZ c) c = a 2 + b 2 + 2abcosy Sie können die Methoden Math.pow(double, double), Math.sqrt(double), und Math.cos(double) der Klasse java.lang.math benutzen. Lösungsvorschlag Aufgabe 2 a) s = s0 + v0 t + 1.0/2.0 Math.pow(g, t) b) ew = aw Math.pow((1.0 + p/100.0), LZ) oder ew = aw Math.pow((1 + p/100), LZ) c) c = Math.sqrt(Math.pow(a, 2.0) + Math.pow(b, 2.0) + 2.0 a b Math.cos(y)) a) 3 Punkte b) 3 Punkte c) 4 Punkte Algorithmik I WS 2003/04 3
Aufgabe 3 20 Punkte a) Was gibt folgende Schleife aus? 3 i n t j = 1 9 ; 4 i n t m = 0 ; 5 f o r ( i n t i = 9 ; i >= 0 && j > = 0 ; i, j ) { 6 m = ( i < 5? j < 1 0? i + + : j : j + + ) ; 7 System. o u t. p r i n t l n (m + + i + + j ) ; 8 } / / f o r b) Wandeln Sie das Programmfragment aus Teilaufgabe (a) um, so dass es statt der for-schleife und den?:-operatoren eine while-schleife und if-anweisungen enthält. Halten Sie die Codier-Regeln für Java ein. Lösungsvorschlag Aufgabe 3 a) Ausgabe des Programms 1 9 9 2 0 1 9 8 2 0 1 9 7 2 0 1 9 6 2 0 1 9 5 2 0 1 9 4 1 8 1 7 3 1 6 1 5 2 1 4 1 3 1 1 2 1 1 0 1 0 Algorithmik I WS 2003/04 4
b) While-Version 3 i n t j = 1 9 ; 4 i n t i = 9 ; 5 i n t m = 0 ; 6 i n t wertausdruck1 = 0, wertausdruck2 = 0 ; 7 while ( i >= 0 && j > = 0 ) { 8 i f ( i < 1 0 ) { 9 wertausdruck2 = j ; 10 } e l s e { 11 wertausdruck2 = i ; 12 } 13 i f ( wertausdruck2 < j ) { 14 wertausdruck1 = j ; 15 } e l s e { 16 wertausdruck1 = wertausdruck2 ; 17 } 18 i f ( i < 5 ) { 19 i f ( j < 1 0 ) { 20 i ++; 21 m = wertausdruck2 ; 22 } e l s e { 23 j ; 24 m = wertausdruck2 ; 25 } 26 } e l s e { 27 j ++; 28 m = wertausdruck1 ; 29 } 30 System. o u t. p r i n t l n (m + + i + + j ) ; 31 i ; 32 j ; 33 } / / w h i l e a) 8 Punkte b) 12 Punkte Algorithmik I WS 2003/04 5
Aufgabe 4 10 Punkte Formulieren Sie eine rekursive Methode, die zu zwei Integer-Zahlen n, m > 0 den Binomialkoeffizienten ( ) n m berechnet. Verwenden Sie die folgende Definition der Binomialkoeffizienten: ( ) n = m 0 : falls n < m 1 ) ( ) : falls m = 0 oder m = n + n 1 : sonst ( n 1 m 1 m Lösungsvorschlag Aufgabe 4 Hinweis: In der Aufgabe ist nur die Methode gefragt, ein Hauptprogramm oder Testfälle sind sind nicht notwendig. 3 p u b l i c s t a t i c i n t binkoeffrek ( i n t n, i n t m) { 4 i f ( n < m) { 5 return 0 ; 6 } e l s e i f (m = = 0 n = = m) { 7 return 1 ; 8 } e l s e { 9 return ( binkoeffrek ( n 1, m 1 ) 10 + binkoeffrek ( n 1, m ) ) ; 11 } 12 13 } / / b i n K o e f f R e k a) 10 Punkte Algorithmik I WS 2003/04 6
Aufgabe 5 4 Punkte Gegeben seien die Methoden foo(n) und bar(n) mit asymptotischen Aufwandsfunktionen O(logn) bzw. O(n). Es seien: k sei eine positive Konstante, n eine Variable, i und j seien Laufvariablen. Geben Sie den asymptotischen Aufwand (Komplexität) folgender Programmstücke in O-Notation an: a) b) f o r ( i n t i = 1 ; i <=k ; i + + ) foo ( n ) ; f o r ( i n t j = 1 ; j <=n ; j + + ) b a r ( j ) ; Lösungsvorschlag Aufgabe 5 a) O(logn) b) O(n 2 ) a) 2 Punkte b) 2 Punkte Algorithmik I WS 2003/04 7
Aufgabe 6 6 Punkte Gegeben Sei eine Streutabelle mit n = 18 Plätzen. Kollisionen werden durch lineares Fortschalten mit konstanter Schrittweite w aufgelöst. Geben Sie die Menge aller Schrittweiten w <= n an, bei denen beim linearen Fortschreiten prinzipiell jeder Platz erreicht werden würde. Lösungsvorschlag Aufgabe 6 Schrittweite und Tabellengrösse müssen teilerfremd sein. Hier: {1, 5, 7, 11, 13, 17} a) je 1 Punkt für jede richtige Schrittweite Algorithmik I WS 2003/04 8
Aufgabe 7 15 Punkte Ergänzen sie die Post-Aufgabe um eine Klasse BriefkastenImpl, die das Interface Briefkasten implementiert. Die Kunden können beliebig viele ihrer Briefe in den Briefkasten einwerfen. Zur Leerung des Briefkastens wird ein Postsack benutzt, in den dann die eingeworfenen Briefe gefüllt werden. Verwenden Sie folgendes Interface: p u b l i c i n t e r f a c e B r i e f k a s t e n { p u b l i c S t r i n g t o S t r i n g ( ) ; p u b l i c void w i r f B r i e f I n B r i e f k a s t e n ( B r i e f a k t B r i e f ) ; p u b l i c void l e e r e B r i e f k a s t e n I n P o s t s a c k ( P o s t s a c k a k t P o s t s a c k ) ; } / / c l a s s B r i e f k a s t e n Algorithmik I WS 2003/04 9
Lösungsvorschlag Aufgabe 7 import j a v a. u t i l. ; c l a s s B r i e f k a s t e n I m p l implements B r i e f k a s t e n { p r i v a t e HashSet b r i e f k a s t e n I n h a l t = new HashSet ( ) ; p u b l i c S t r i n g t o S t r i n g ( ) { S t r i n g z e i c h e n k e t t e = new S t r i n g ( I n h a l t des B r i e f k a s t e n s : \ n ) ; / / b ) / / Hier s o l l e i n e Z e i c h e n k e t t e e r z e u g t werden, d i e / / d i e r e l e v a n t e I n f o r m a t i o n / / d e s B r i e f k a s t e n s e n t h a e l t, a l s o d i e B r i e f e, d i e d a r i n / / e n t h a l t e n s i n d. / / Verwenden S i e b e i den Erzeugung d i e t o S t r i n g Methode / / der B r i e f e! I t e r a t o r i t e r B r i e f k a s t e n = b r i e f k a s t e n I n h a l t. i t e r a t o r ( ) ; B r i e f a k t B r i e f ; / / S c h l e i f e ueber b r i e f e while ( i t e r B r i e f k a s t e n. hasnext ( ) ) { a k t B r i e f = ( B r i e f ) i t e r B r i e f k a s t e n. n e x t ( ) ; z e i c h e n k e t t e = z e i c h e n k e t t e + a k t B r i e f + \n ; } / / w h i l e return z e i c h e n k e t t e ; } / / t o S t r i n g p u b l i c void w i r f B r i e f I n B r i e f k a s t e n ( B r i e f a k t B r i e f ) { b r i e f k a s t e n I n h a l t. add ( a k t B r i e f ) ; } / / w i r f B r i e f I n B r i e f k a s t e n p u b l i c void l e e r e B r i e f k a s t e n I n P o s t s a c k ( P o s t s a c k a k t P o s t s a c k ) { a k t P o s t s a c k. addall ( b r i e f k a s t e n I n h a l t ) ; b r i e f k a s t e n I n h a l t. c l e a r ( ) ; / / Aufraeumen n i c h t v e r g e s s e n } / / l e e r e B r i e f k a s t e n I n P o s t s a c k } / / c l a s s B r i e f k a s t e n I m p l a) 7 Punkte tostring b) 3 Punkte wirfbriefinbriefkasten c) 5 Punkte leerebriefkasteninpostsack Algorithmik I WS 2003/04 10
Aufgabe 8 3 Punkte Geben Sie die schwächste Vorbedingung an. Hinweis: Anweisungen und Nachbedingung sind durch ein Komma getrennt. a) wp(a := 3 + b c;, a = 2 b) = b) wp(if (a > b) c := d; else e := f;, c = 7 e = f a = 4 b = 6) = Dabei seien: := die Wertzuweisung = der Test auf Gleichheit Lösungsvorschlag Aufgabe 8 a) 1 Punkte b) 2 Punkte Lösung: wp(a := 3 + b c;, a = 2 b) = (2 b = 3 + b c) wp(if (a > b) c := d; else e := f;, c = 7 e = f a = 4 b = 6) = (a = 4 b = 6 a b c = 7) Algorithmik I WS 2003/04 11
Aufgabe 9 6 Punkte 1 p u b l i c s t a t i c i n t m( i n t n ) { 2 / / P : n>=0 3 i n t r e s = 0 ; 4 i n t k = 1 ; 5 while ( k <= n ) { 6 r e s = r e s + k k k ; 7 k = k + 1 ; 8 } 9 / / Q:? 10 return r e s ; 11 } a) Für die obige Java-Methode gelte die Vorbedingung P : n >= 0. Was berechnet die Java- Methode? b) Formulieren Sie eine Nachbedingung Q, die ausdrückt, welchen Wert die Variable res beim Verlassen der Methode hat. Lösungsvorschlag Aufgabe 9 a) 3 Punkte b) 3 Punkte Lösung: a) Die Schleife berechnet die Summe der Kubikzahlen von 1 bis n b) Q : res = n k 3 k=1 Algorithmik I WS 2003/04 12
Aufgabe 10 20 Punkte Gegeben sei der folgende abstrakte Datentyp (ADT) Ring. Signaturen: neu : Ring leer : Ring booleant hinzufuegen : Ring int Ring entfernen : Ring Ring auslesen : Ring int drehen : Ring Ring Für alle r Ring, i integer gelten folgende Axiome: A1 : leer(neu()) = true A2 : leer(hinzufuegen(r, i)) = false A3 : entfernen(hinzufuegen(r, i)) = A4 : auslesen(hinzuf uegen(r, i)) = A5 : drehen(r) = { { { r : leer(r) hinzuf uegen(entf ernen(r), i) : sonst i : leer(r) auslesen(r) : sonst r : leer(r) hinzuf uegen(entf ernen(r), auslesen(r)) : sonst Hinweis: Massnahmen zur Synchronisation der Zugriffe auf den Ring brauchen nicht berücksichtigt werden. a) Geben Sie die Werte folgender Ausdrücke an. Schreiben Sie unter oder über die Gleichheitszeichen die jeweils verwendeten Axiome. (a) entf ernen(hinzunehmen(neu(), i)) = (b) auslesen(drehen(hinzunehmen(neu(), i)) = Algorithmik I WS 2003/04 13
b) Ergänzen Sie die folgende Implementierung für einen Ring. Sie können dabei davon ausgehen, dass nie mehr als MAX Elemente gleichzeitig im Ring vorhanden sein werden, die Anzahl der Operationen auf dem Ring ist aber nicht beschränkt. Die auszufüllenden Lücken sind durch einen Kommentar gekennzeichnet, z.b, // b) 1 c l a s s Ring { 2 f i n a l s t a t i c i n t MAX = 9 9 ; 3 p r i v a t e s t a t i c i n t [ ] e l e m e n t e ; 4 p r i v a t e s t a t i c i n t a n f a n g = 0 ; 5 p r i v a t e s t a t i c i n t ende = 1; 6 7 p u b l i c s t a t i c void neu ( ) { 8 / / a ) 9 } / / neu 10 11 p u b l i c s t a t i c boolean l e e r ( ) { 12 / / b ) 13 } / / l e e r 14 15 p u b l i c s t a t i c i n t a u s l e s e n ( ) { 16 / / c ) 17 } / / a u s l e s e n 18 19 p u b l i c s t a t i c void h i n z u f u e g e n ( i n t i ) { 20 / / d ) 21 } / / h i n z u f u e g e n 22 23 p u b l i c s t a t i c void e n t f e r n e n ( ) { 24 / / e ) 25 } / / e n t f e r n e n 26 27 p u b l i c s t a t i c void d r e h e n ( ) { 28 / / f ) 29 } / / drehen 30 31 } / / c l a s s Ring Algorithmik I WS 2003/04 14
Lösungsvorschlag Aufgabe 10 a) a) 1 Punkt, b) 4 Punkte b) 15 Punkte Lösung: a) (a) entf ernen(hinzuf uegen(neu(), i)) A3 = neu() (b) auslesen(drehen(hinzuf uegef uegenneu(), i)) A5 = auslesen(hinzuf uegen(entf ernen(hinzuf uegen(neu(), i), auslesen(hinzuf uegen(neu(), i))) A3 = auslesen(hinzuf uegen(neu(), auslesen(hinzuf uegen(neu(), i)))) A4 = auslesen(hinzuf uegen(neu(), i)) A4 = i Algorithmik I WS 2003/04 15
b) Implementierung: 1 / 2 Created on 07 Feb 2004 3 4 / 5 / @author wilke@cs. f a u. de 6 / 7 8 c l a s s Ring { 9 / / Anzahl der Elemente im Ring 10 / / zu T e s t z w e c k e n i s t e i n e k l e i n e Zahl g u e n s t i g 11 p r i v a t e f i n a l s t a t i c i n t MAX = 3 ; 12 13 / / S c h a l t e r der a n g i b t, ob Ring b e r e i t s i n i t i a l i s i e r t wurde 14 p r i v a t e s t a t i c boolean i n i t = f a l s e ; 15 16 / / V e k t o r der Ring Elemente 17 p r i v a t e s t a t i c i n t [ ] e l e m e n t e ; 18 19 s t a t i c i n t ende, a n f a n g ; 20 21 p r i v a t e s t a t i c boolean g e t I n i t ( ) { 22 return i n i t ; 23 } 24 25 / / g u t f u e r T e s t z w e c k e 26 p r i v a t e s t a t i c void a l l e s A u s g e b e n ( ) { 27 i f ( g e t I n i t ( ) ) { 28 f o r ( i n t i n d e x = a n f a n g ; i n d e x <= ende ; i n d e x + + ) { 29 System. o u t. p r i n t l n ( 30 Elem i n d e x = 31 + ( i n d e x % MAX) 32 + wert = 33 + e l e m e n t e [ i n d e x % MAX] ) ; 34 } 35 } 36 } / / a l l e s A u s g e b e n 37 38 / / Ring i n i t i a l i s i e r e n 39 p u b l i c s t a t i c void neu ( ) { 40 e l e m e n t e = new i n t [MAX] ; 41 a n f a n g = 0 ; 42 ende = 1 ; / / damit T e s t s nach den I n i t i a l i s i e r u n g 43 / / k o r r e k t s i n d 44 i n i t = true ; Algorithmik I WS 2003/04 16
45 } / / neu 46 47 / / Test, ob Elemente im Ring s i n d 48 p u b l i c s t a t i c boolean l e e r ( ) { 49 i f ( g e t I n i t ( ) ) { 50 return ende < a n f a n g ; 51 } e l s e 52 return f a l s e ; / / e x c e p t i o n waere b e s s e r! 53 } / / l e e r 54 55 / / T e s t ob a l l e P l a t z e im V e k t o r e l e m e n t e b e l e g t s i n d 56 p u b l i c s t a t i c boolean v o l l ( ) { 57 i f ( g e t I n i t ( ) ) { 58 return ( ende = = ( a n f a n g + MAX 1 ) ) ; 59 } e l s e { 60 return f a l s e ; / / e x c e p t i o n waere b e s s e r! 61 } 62 } / / v o l l 63 64 / / l i e s t das Element am Anfang des Rings aus 65 p u b l i c s t a t i c i n t a u s l e s e n ( ) { 66 i f ( g e t I n i t ( ) & &! l e e r ( ) ) { 67 return e l e m e n t e [ a n f a n g % (MAX) ] ; 68 } e l s e 69 return 0 ; / / e x c e p t i o n waere b e s s e r! 70 } / / a u s l e s e n 71 72 / / 73 p u b l i c s t a t i c void h i n z u f u e g e n ( i n t neueselem ) { 74 i f ( g e t I n i t ( ) ) { 75 i f (! v o l l ( ) ) { 76 ende ++; 77 e l e m e n t e [ ende % (MAX) ] = neueselem ; 78 } e l s e { 79 System. e r r. p r i n t l n ( 80 Kein P l a t z mehr f u e r Element + i 81 + vorhanden! ) ; 82 / / e x c e p t i o n waere b e s s e r! 83 } 84 } 85 } / / h i n z u f u e g e n 86 87 p u b l i c s t a t i c void e n t f e r n e n ( ) { 88 i f ( g e t I n i t ( ) ) { 89 i f (! l e e r ( ) ) { 90 a n f a n g ++; Algorithmik I WS 2003/04 17
91 } e l s e { 92 System. e r r. p r i n t l n ( 93 E n t f e r n e n n i c h t moeglich, 94 + da d e r Ring l e e r i s t. ) ; 95 / / e x c e p t i o n waere b e s s e r! 96 } 97 } 98 } / / e n t f e r n e n 99 100 p u b l i c s t a t i c void d r e h e n ( ) { 101 i f ( g e t I n i t ( ) ) { 102 i n t z w i s c h e n s p e i c h e r = a u s l e s e n ( ) ; 103 e n t f e r n e n ( ) ; 104 h i n z u f u e g e n ( z w i s c h e n s p e i c h e r ) ; 105 } 106 } / / drehen 107 108 } / / c l a s s Ring Algorithmik I WS 2003/04 18
Aufgabe 11 18 Punkte Der Betreiber eines Internet-Chat-Rooms will die Zeiten ermitteln, in denen keiner seiner Kunden im Chat-Room eingewählt ist, z.b. um in diesen Zeiten den Rechner zu warten. Als Daten stehen die Protokolldateien zur Verfügung, die verzeichnen, wann ein Benutzer sich ein- und ausgewählt hat. Zu Testzwecken wurde der Chat-Room nur einen Tag geöffnet, das Protokoll aller Zu- und Abgänge sieht wie folgt aus: Benutzername Begin Ende Dagobert 16:44 17:33 Daisy 12:34 23:44 Donald 13:52 14:15 Tick 8:15 9:33 Track 15:58 17:11 Trick 9:58 10:37 a) Skizzieren Sie einen Algorithmus, der die benötigte Information berechnet. b) Zeigen Sie an den oben angegebenen Daten, wie der Algorithmus arbeitet, und was für ein Ergebnis er liefert. c) Geben Sie den asymptotischen Aufwand für Ihren Algorithmus bei n Einträgen an. Algorithmik I WS 2003/04 19
Lösungsvorschlag Aufgabe 11 a) 10 Punkte b) 5 Punkte c) 3 Punkte Lösung: a) Man ordnet jedem Beginn-Zeitpunkt den Zähler +1 zu, jedem End-Zeitpunkt den Zähler -1. Dann sortiert man die Zeiten in aufsteigender Reihenfolge. Danach beginnt man die Zähler zu addieren. Immer wenn der Zähler 0 ist, ist niemand eingewählt. b) Zeit Zu/Abgang Anzahl 8:15 +1 1 9:33-1 0 9:58 +1 1 10:37-1 0 12:34 +1 1 13:52 +1 2 14:15-1 1 15:58 +1 2 16:44 +1 3 17:11-1 2 17:33-1 1 23:44-1 0 In den Zeiten - 8:15, 9:33-9:58, 10:37-12:34, und 23:44 - war niemand im Chat-Room. c) Für die Musterlösung: Durchlaufen der Liste, aufteilen der Daten, setzen der Zähler (+1/-1): O(n) Sortieren O(nlogn) Durchlaufen der Liste, aufaddieren der Zähler : O(n) Gesamtaufwand: O(nlogn) Bemerkung: Es gibt auch eine Lösung in O(n), dem Leser als Übung überlassen. Algorithmik I WS 2003/04 20