Übungen zu Grundlagen der Programmierung

Werbung
Technische Universität München
Fakultät für Informatik
Dr. C. Herzog, M. Maalej
WS 2012/13
Übungsblatt 5
19. November 2012
Übungen zu Grundlagen der Programmierung
Aufgabe 19 (H) Markov-Algorithmus
Wir betrachten den Zeichenvorrat V = {a, b}
Schreiben Sie einen Markov–Algorithmus, der zu einer Zeichenreihe w ∈ V ∗ als Eingabetext genau dann die Zeichenreihe "T" als Ausgabe liefert, wenn w von der Form " aa
· · · a} bb
· · · b} " mit
| {z
| {z
n mal n mal
einem n ∈ N0 ist.
Wenn w nicht von dieser Form ist, soll er als Ausgabe die Zeichenreihe "F" liefern.
Aufgabe 20 (H) Rekursion und Terminierung
a) Eine Zeichenfolge x heißt Palindrom, wenn sie identisch zu ihrer gespiegelten Zeichenfolge
ist (Bsp.: (’o’,’t’,’t’,’o’), (’a’,’d’,’a’)). Geben Sie eine Java-Funktion istPalindrom an, die
feststellt, ob eine als Parameter übergebene Zeichenreihe ein Palindrom ist oder nicht, und
als Ergebnis den entsprechenden Wahrheitswert (Typ boolean) liefert. Für Ihre Lösung
können Sie sich auf alle bisher in der Übung eingeführten Funktionen für Zeichenfolgen
abstützen.
b) Geben Sie die Berechnung für den Aufruf istPalindrom((’o’,’t’,’t’,’o’)) an.
c) Zeigen Sie für Ihre Funktion istPalindrom die Terminierung.
Aufgabe 21 (H) Korrektheit rekursiver Funktionen
Gegeben sei die Funktion summe2, die auf der Menge Z × Z wie folgt definiert ist:
n
mit m, n ∈ Z
summe2(m, n) = ∑ i
i=m
a) Geben Sie eine rekursive Berechnungsvorschrift für die Funktion summe2 in Java an.
b) Beweisen Sie mit Hilfe einer geeigneten Abstiegsfunktion die Terminierung Ihrer Java
Funktion summe2 aus Teilaufgabe a).
n
c) Zeigen Sie, dass die Summenformel ∑ i mit Ihrer Java Funktion aus Teilaufgabe a) korrekt
i=m
berechnet wird.
Bitte wenden!
–2–
Aufgabe 22
Kontrollstrukturen der imperativen Programmierung
a) Mit der Zuweisung, die in Java mit dem „=“–Operationssymbol realisiert wird, können wir
einer Variablen einen Wert (in Form eines Ausdrucks) zuweisen. Der Variablenname steht
auf der linken Seite, der Ausdruck auf der rechten Seite des „=“–Operationssymbols.
Geben Sie an, welche Werte die Variablen x und y während und nach der Ausführung des
folgenden Programmstücks haben:
int
int
y =
x =
x =
x = 3;
y = 2;
(x+1) * (x+1);
x+1;
x*x;
b) Bedingte Ausdrücke der Form
Bedingung ? Ausdruck1 : Ausdruck2
können in Java durch die Kontrollstruktur der bedingten Anweisung
if (Bedingung) Anweisung1; else Anweisung2;
nachgebildet werden. Setzen Sie die Anweisung mit bedingtem Ausdruck
return a==b ? a : a>b ? a-b : b-a
in eine entsprechende bedingte Anweisung um.
Aufgabe 23
Einbettung und iterative Lösung für rekursive Programme
In dieser Aufgabe soll eine Java-Funktion maxVorkommen angegeben werden, die eine Zeichenfolge f als Eingabe erhält und als Ergebnis eines der Zeichen liefert, die maximales Vorkommen
in f haben. Dabei gilt: Ein Zeichen c hat maximales Vorkommen in einer Zeichenfolge f, wenn
es kein anderes Zeichen gibt, das öfter in f vorkommt als c.
Definieren Sie dazu zunächst eine rekursive Funktion vorkommen, die ein Zeichen c und eine
Zeichenfolge f als Eingabe erhält und als Ergebnis zurückliefert, wie oft c in f vorkommt.
Aufgabe 24 (P) Fibonacci-Zahlen rekursiv
a) Implementieren Sie rekursiv eine Java-Funktion, die die Fibonaccizahl zu gegebenem n
berechnet. Die Berechnungsvorschrift ist rekursiv gegeben durch:

für n > 1
 fib(n − 1) + fib(n − 2)
1
für n = 1
fib(n) =
 0
für n = 0
b) Testen Sie Ihre Funktion schrittweise für grössere n und geben Sie die benötigte Rechenzeit
in Sekunden auf der Standardausgabe mittels
System.out.println("");
aus. Zur Messung der aktuellen Systemzeit können Sie folgende Befehle verwenden:
java.util.Calendar cal = java.util.Calendar.getInstance();
long t = cal.getTimeInMillis();
–3–
Was für ein Effekt tritt bei steigendem n ein und wie erklären Sie sich diesen?
Aufgabe 25 (P) Ersetzen von Teilzeichenfolgen
Wir betrachten Zeichenfolgen x, y, z. Analog zu den Sequenzen ganzer Zahlen aus der Vorlesung
heißt x Anfangsfolge von y, falls es eine Zeichenfolge v gibt, so dass y = conc(x, v) gilt. x heißt
Teilfolge von y, falls es Zeichenfolgen u, v gibt, so dass y = conc(u, conc(x, v)) gilt.
a) Realisieren Sie die Funktionen istAnfang und istTeilFolge für Zeichenfolgen entsprechend den aus der Vorlesung bekannten Funktionen für Sequenzen ganzer Zahlen.
b) u heißt Vorfolge von x in y, falls es eine Zeichenfolge v gibt, so dass y = conc(u, conc(x, v))
gilt und x in conc(u, x) nur ein einziges Mal Teilfolge ist.
Definieren Sie eine Java-Funktion vorfolge(x,y), die zu x und y die Vorfolge von x in y
ausgibt. Falls x nicht Teilfolge von y ist, sei der Funktionswert undefiniert.
c) Definieren Sie eine weitere Java-Funktion lsub(y,x) (Linkssubtraktion), die für (y, x) genau dann definiert ist, falls x die Anfangsfolge von y ist, und für die y = conc(x, lsub(y, x))
gilt.
d) Programmieren Sie eine Java-Funktion ersetze(x,y,z), die die erste Teilfolge x von y
durch z ersetzt und ansonsten y unverändert läßt. Stützen Sie sich dabei auf die in den vorangegangenen Teilaufgaben definierten Hilfsfunktionen ab. Realisieren Sie eine neue Klasse
MeineZeichenFolge, welche die Klasse ZeichenFolge um die Operation ersetze und
alle benötigten Hilfsfunktionen (Teilaufgaben a) bis c)) erweitert.
e) Schreiben Sie eine Klasse TestMeineZeichenfolge, die Ihnen als Umgebung zum Testen
Ihrer Funktion ersetze dient.
Hinweis: Im WWW steht Ihnen unter
http://www1/static/lehrstuhl/teaching/timeline-wt1011/
365-grundlagen-der-programmierung-uebung-wise11
die Datei ZeichenFolge.java bereit, die alle in der Aufgabe genannten Schnittstellenoperationen enthält. Ferner umfasst diese Klasse noch die Operation toString, die es ermöglicht
Zeichenfolgen mit Hilfe der System.out.println-Methode auszugeben, sowie eine Operation
parseString, die Strings in Zeichenfolgen umwandelt.
Herunterladen