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.