Übungen zu Grundlagen der Programmierung

Werbung
Technische Universität München
Fakultät für Informatik
Dr. C. Herzog, M. Maalej
WS 2010/11
Übungsblatt 6
29. November 2010
Übungen zu Grundlagen der Programmierung
Aufgabe 26 (H) Terminierung und Induktion
Gegeben sei folgende Java–Funktion:
public int f (int x, int y, int z) {
return (x > 1) ? f(x-1, y, z) + y + (x-1) * z
: y;
}
a) Zeichnen Sie den verkürzten Aufrufbaum für f(3,0,2).
b) Für welche Eingabewerte terminiert f? Beweisen Sie Ihre Aussage.
c) Zeigen Sie, dass f(x,0,2) für Eingabewerte x ≥ 1 das Ergebnis x ∗ (x − 1) liefert. Verwenden Sie dabei für den Beweis vollständige Induktion über n = x.
Aufgabe 27 (H) Durchschnittsberechnung mit Einbettung
Gegeben sei eine Sequenz ganzer Zahlen vom Typ IntSequenz mit den in der Vorlesung definierten Funktionen isEmpty, first und rest. In dieser Aufgabe soll nun eine Funktion
public float avgSeq (IntSequenz s)
geschrieben werden, die den Durchschnitt aller in der Sequenz enhaltenen ganzen Zahlen berechnet. Für die leere Sequenz ist die Funktion nicht definiert, für nichtleere Sequenzen ergibt sich
der Durchschnitt durch Aufsummierung aller in der Sequenz enthaltenen ganzen Zahlen gemittelt
durch die Anzahl der in der Sequenz enthaltenen Zahlen.
Eine mögliche Lösung für das Problem erhält man, wenn für die Berechnung der Summe und der
Anzahl jeweils eine eigene Funktion definiert wird und die Ergebnisse dieser beiden Hilfsfunktionen in der Funktion avgSeq durcheinander dividiert werden. Nachteil dieser Lösung ist jedoch,
dass die Berechnung der Einzelergebnisse jeweils einen eigenen Durchlauf durch die gesamte
Eingabesequenz s erfordert.
In dieser Aufgabe soll eine funktionale Lösung realisiert werden, in der die Sequenz für die gesamte Durchschnittsberechnung nur einmal durchlaufen wird.
Aufgabe 28
Kontrollstrukturen der imperativen Programmierung
a) Für die Kontrollstruktur der Zählschleife (in Java for–Schleife) ist charakteristisch, dass
eine Zählvariable verwendet wird, die bei jedem Schleifendurchlauf mit einem von vornherein festgelegten Wert verglichen und auf dieselbe Art und Weise fortgeschaltet wird.
Eine for–Schleife hat die Gestalt
for (Zaehlerinitialisierung;
Schleifeneintrittsbedingung;
Weiterschaltung) {
Schleifenrumpf
}
–2–
also beispielsweise:
for (int i=0; i<42; i=i+1) {System.out.println(i);}
Geben Sie eine Methodendefinition int summe2(int m, int n) an, die die ganzen Zahlen von m bis n aufsummiert (∑ni=m i) und als Ergebnis zurückgibt (vergleiche Aufgabe 21).
Verwenden Sie dazu eine Zählschleife.
b) Die bedingte Wiederholungs-Anweisung (in Java while–Schleife) ermöglicht es, eine Anweisung (bzw. Anweisungssequenz) wiederholt auszuführen, solange die Wiederholungsbedingung gilt. Gilt die Bedingung nicht mehr, so wird mit der nächsten Anweisung nach
der while–Schleife fortgefahren.
In Java hat sie die Gestalt
while (Schleifeneintrittsbedingung) {
Schleifenrumpf
}
also beispielsweise:
int x=2;
while (x<42) {x = x*2;}
Geben Sie eine Definition für eine Methode boolean istPalindrom (ZeichenFolge f)
an, die als Ergebnis liefert, ob eine Zeichenfolge f ein Palindrom ist oder nicht (vgl. Aufgabe 20). Verwenden Sie dazu Hilfsvariablen, die Wiederholungsanweisung und die Methoden
first, last, stock, init, create und isEmpty.
Aufgabe 29
Reihungen
Gegeben sei folgendes Programmstück:
int [] x;
x = new int [10];
x[0] = 5;
int [] y = {1,2,3};
int [][] z = new int [3][];
z[1] = new int [5];
a) Versuchen Sie obenstehende Deklarationen und Anweisungen schrittweise graphisch darzustellen.
b) Welche Werte enthalten x[1] und y[1] nach Ausführung des Programmstücks? Welchen
Wert enthält gegebenenfalls z[1][4] bzw. z[1][5]?
c) Für eine Reihung a kann mit dem Ausdruck a.length auf die Länge der Reihung zugegriffen werden. Welchen Wert haben z.length bzw. z[1].length?
d) Schreiben Sie eine Anweisung, die allen Komponenten von x den Wert 2 zuweist.
e) Schreiben Sie eine Anweisung, die z zu einer rechteckigen Matrix komplettiert und in allen
Komponenten den Wert 3 einträgt.
Aufgabe 30 (P) Imperative Programmierung - Reihungen
Schreiben Sie eine Java-Methode
public int [] verdichte (int [] a) {...},
–3–
welche als Parameter eine Reihung ganzer Zahlen erhält, die aufsteigend sortiert ist, in der jedoch Zahlen mehrfach vorkommen können. Als Ergebnis soll sie eine neue, aufsteigend sortierte
Reihung liefern, die dieselben Elemente enthält, in der jedoch jedes Element nur einmal auftritt.
Aufgabe 31 (P) Arbeiten mit Reihungen
a) Schreiben Sie eine Funktion matrixTrans, die eine Matrix als Eingabe erhält und die transponierte Matrix als Ergebnis zurückliefert.
b) Schreiben Sie eine Funktion matrixMult, die als Eingabe zwei Matrizen in Form von zweistufigen Reihungen erhält und als Ergebnis das Produkt dieser beiden Matrizen zurückliefert.
c) Ergänzen Sie Ihre Klasse MathDienste aus Aufgabe 18/Blatt 4 um die Funktionen aus den
obigen Teilaufgaben und testen Sie sie.
Herunterladen