TU Ilmenau, Fakultät IA FG Telematik/Rechnernetze Prof. Dr.-Ing. G. Schäfer http://www.tu-ilmenau.de/telematik/aup Algorithmen und Programmierung WS 15/16 Übungsblatt 3 Abgabe der Lösungen am 11.11.2015 in der Vorlesung Aufgabe 1 (Sichtbarkeit und Speicherhaltung von Variablen) 5 + 1 Punkte Das folgende Programm wird mit dem Kommandozeilenparameter 13 aufgerufen. (a) Geben Sie für den resultierenden Programmablauf bei jedem Erreichen einer mit /* 1 */, /* 2 */, /* 3 */ oder /* 4 */ markierten Zeile die entsprechende Markierung sowie die Namen und Werte aller zu diesem Zeitpunkt (nach Ausführung der Zeile) im Speicher vorhandenen Variablen an. Geben Sie zudem auch an, ob die vorhandenen Variablen an dieser Stelle sichtbar sind. Hinweis: Auch aktuell nicht sichtbare Variablen des Aufrufers einer Funktion müssen gespeichert bleiben. (b) Welche Ausgabe liefert das Programm bei Aufruf mit dem Parameter 13? public c l a s s Scope { s t a t i c int num = 3 ; s t a t i c int f o o ( int x ) { /∗ 1 ∗/ i f ( x % 2 == 0 ) { return x ∗ 2 ; } else { int y = num ∗ f o o ( x +1); /∗ 2 ∗/ return y ; } } s t a t i c int bar ( int x ) { /∗ 3 ∗/ int y = x ∗ f o o (num ) ; return y ; } public s t a t i c void main ( S t r i n g [ ] a r g s ) { i f ( a r g s . l e n g t h <1) { System . out . p r i n t l n ( ” Usage : j a v a K l a s s e <par : i n t >” ) ; System . e x i t ( −1); } int x = 0 ; int num = I n t e g e r . p a r s e I n t ( a r g s [ 0 ] ) ; /∗ 4 ∗/ System . out . p r i n t l n ( bar (num ) ) ; } } 2 Algorithmen und Programmierung WS 15/16 Übungsblatt 3 Aufgabe 2 (Rechnen mit großen Zahlen in Java) 5 + 1 Punkte Es gilt 11 + 22 + 33 + · · · + 1010 = 10405071317. (a) Entwickeln Sie einen Algorithmus in Java, der die letzten 10 Ziffern der folgenden Summe berechnet: n X ii = 11 + 22 + 33 + · · · + nn (1) i=1 Für die Eingabe n ∈ N, n ≥ 0 des Algorithmus soll der Datentyp short benutzt werden. Hat die Summe weniger als 10 Ziffern, so sollen alle Ziffern berechnet werden. Benutzen sie ferner zur Berechnung nur primitive Datentypen von Java. (b) Geben Sie die letzten 10 Ziffern der Summe für n = 1000 an. Aufgabe 3 (Applikative Algorithmen) 3 Punkte n! Der Binomialkoeffizient nk = k!(n−k)! kann auch rekursiv definiert werden. Dabei gilt n =0 k falls n < k, sowie n n = =1 0 n und n n−1 n−1 = + . k k−1 k Schreiben Sie ein applikatives Programm bin(n,k), welches den Binomialkoeffizienten rekursiv berechnet. Aufgabe 4 (Wandlung von Programmierparadigmen) 2 + 3 + 2 Punkte Formulieren Sie die folgenden applikativen Algorithmen imperativ, nicht rekursiv in Java. Gehen Sie davon aus, dass es sich bei x und y um ganze Zahlen handelt. Zusätzlich gelte x ≥ 1. Der Rückgabewert der Algorithmen ist eine Fließkommazahl. (a) f(x,y) = if (y = 0) then 1 else if (y < 0) then (1.0)/f(x,-y) else if (y > 0) then x · f(x,y-1) fi fi fi (b) w(x) = a(x,0,x) a(x,u,o) = if (o-u < 0.00000001) then (o+u)/2 else if ((o+u)/2 · (o+u)/2 < x) then a(x,(o+u)/2,o) else a(x,u,(o+u)/2) fi fi (c) Welche mathematischen Funktionen berechnen diese Algorithmen? Hinweis: Um in Java bei der Division zweier int-Variablen ein gebrochenes Ergebnis zu erhalten, können sie eine der Variablen mit 1.0 multiplizieren. Bsp: float z = x*1.0/y Bitte wenden! Algorithmen und Programmierung WS 15/16 Übungsblatt 3 Aufgabe 5 (Semantik imperativer Ausdrücke) 3 3 Punkte Die Semantik imperativer Schleifenkonstrukte kann durch Funktionen auf Zuständen beschrieben werden. So etwa die while−Schleife: ( Z, falls Z(B) = false [[ while B do α od ]] (Z) = [[ while B do α od ]] ([[ α ]] (Z)), sonst Geben Sie die Semantik für die do . . . while−Schleife entsprechend an. Aufgabe 6 (Semantik imperativer Algorithmen) 4 + 1 Punkte Gegeben sei folgender imperativer Algorithmus: Q: var n, q : int; input n; q := 0; while n>0 do q := q + n + n - 1; n := n - 1 od output q. (a) Werten Sie den imperativen Algorithmus analog zum in der Vorlesung gezeigten Beispiel (Berechnung der Fakultät, Kapitel 4 Folie 44) auf der Eingabe n = 2 aus. Ebenfalls analog zur Vorlesung dürfen Sie die Abkürzung while β für die while-Schleife verwenden. (b) Welche Funktion wird durch den Algorithmus berechnet?