Algorithmen und Programmierung WS13/14

Werbung
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.
Herunterladen