TU Ilmenau, Fakultät IA FG Telematik/Rechnernetze Prof. Dr.-Ing. G. Schäfer, Dr. S. Grau http://www.tu-ilmenau.de/telematik/aup Algorithmen und Programmierung WS13/14 Übungsblatt 3 Abgabe am Mittwoch 06.11.2013 in der Vorlesung Aufgabe 1 Sichtbarkeit und Speicherhaltung von Variablen 9 Punkte Das folgende Programm wird mit dem Kommandozeilenparameter 5 aufgerufen. Geben Sie für den resultierenden Programmablauf bei jedem Erreichen einer mit /* 1 */, /* 2 */ oder /* 3 */ markierten Zeile die entsprechende Markierung sowie die Namen und Werte aller zu diesem Zeitpunkt im Speicher vorhandenen Variablen an. Hinweis: Auch aktuell nicht sichtbare Variablen des Aufrufers einer Funktion müssen gespeichert bleiben. Markieren Sie, welche Variablen jeweils sicht- bzw. unsichtbar sind. Welchen Ausgabewert liefert das Programm bei Aufruf mit dem Parameter 5? public c l a s s K l a s s e { 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 ; } } 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 ] ) ; /∗ 3 ∗/ x = f o o (num ) ; System . out . p r i n t l n ( x + num ) ; } } Bitte wenden! 2 Algorithmen und Programmierung WS13/14 Übungsblatt 3 Aufgabe 2 Berechnung von π 4+0 Punkte Eine einfache (und recht langsame) Methode die Zahl π zu berechnen, liegt darin die folgende Berechnungsvorschrift anzuwenden: π= 4 4 4 4 4 − + − + − ... 1 3 5 7 9 Schreiben Sie ein Java-Programm, das in einer Schleife die obige Summe, und somit π, berechnet. Brechen Sie die Berechnung ab, sobald sich ihr Zwischenergebnis pro Schleifendurchlauf nur noch um weniger als 0, 00000001 ändert. Geben Sie ihr Ergebnis und die Anzahl notwendiger Iterationen an. Fakultativ: Mittels des folgenden Konstrukts können sie eine Schleife für t Minuten ausführen: for (long s=System.currentTimeMillis()+TimeUnit.MINUTES.toMillis(t); s>System.currentTimeMillis();) { // do something } Bis zu welcher Genauigkeit berechnet ihr Rechner die Zahl π innerhalb von 1, 2, 8, 32 bzw. 64 Minuten? Aufgabe 3 Wandlung von Programmierparadigmen 2+3+2 Punkte Formulieren Sie die folgenden applikativen Algorithmen imperativ 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 Aufgabe 4 Applikative Algorithmen 3 Punkte n! Der Binomialkoeffizient nk = k!(n−k)! kann auch rekursiv definiert werden. Dabei gilt n =0 k n n falls n < k, sowie = =1 0 n n n−1 n−1 und = + . k k−1 k Schreiben Sie ein applikatives Programm bin(n,k), welches den Binomialkoeffizenten rekursiv berechnet. Es folgt eine weitere Aufgabe! Algorithmen und Programmierung WS13/14 Aufgabe 5 (Uhrzeit) Übungsblatt 3 3 6 Punkte Für ein Sprachsynthesesystem sind Uhrzeiten der Form HHMM in eine natürlich-sprachliche Repräsentation zu bringen. So soll die Eingabe 1345 zur Ausgabe “dreizehn Uhr fünfundvierzig” führen. Schreiben Sie ein Java-Programm, welches die Uhrzeit in obiger Repräsentation als ersten Kommandozeilenparameter erhält und die gewünschte Zeichenkette zurückgibt. Hinweis 1: Für den Zugriff auf die einzelnen Stellen der Eingabe haben Sie zwei Möglichkeiten. Entweder, Sie wandeln die Eingabe in eine Ganzzahl und extrahieren die einzelnen Stellen per div- (in Java ’/’) und mod-Operationen (in Java ’%’). Als Beispiel gilt 3 == (1345 / 100) % 10. Oder Sie greifen über die String-Methode substring zu. Im Beispiel gilt 3 == “1345“.substring(1,2). Hinweis 2: Für die Abbildung von Zahlen auf Strings sollten sie im Programm vordefinierte Felder mit passenden String-Variablen in Betracht ziehen.