Informatik II Musterlösung



Ähnliche Dokumente
Tutoraufgabe 1 (Hoare-Kalkül):

! 1. Erste Schritte! 2. Einfache Datentypen! 3. Anweisungen und Kontrollstrukturen! 4. Verifikation! 5. Reihungen (Arrays) II.1.4. Verifikation - 1 -

(08 - Einfache Sortierverfahren)

Aufgabenblatt: Arrays

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Korrektheit und Hoare-Kalkül für Imperative Programme

Lösungshinweise/-vorschläge zum Übungsblatt 5: Software-Entwicklung 1 (WS 2017/18)

Vor- und Nachbedingungen in imperativen Programmen OOPM, Ralf Lämmel

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

9. Defensives Programmieren

Informatik II Übung 2. Gruppe 4. Lukas Burkhalter (Folien teils von Christian B. und Leyna S.)

9. Java Arrays und Strings. Allokation, Referenzen, Elementzugriff, Mehrdimensionale Arrays, Strings, Stringvergleiche

// Objekt-Methoden: public void insert(int x) { next = new List(x,next); } public void delete() { if (next!= null) next = next.next; } public String

Einführung in die Programmierung Vorlesungsprüfung

Einfache Sortierverfahren in Java, 1. Version

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Tutoraufgabe 1 (Sortieralgorithmus):

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Probeklausur zur Vorlesung

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Einführung in die Programmierung

3. Übungsblatt zu Algorithmen I im SoSe 2017

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Einführung in die Programmierung für NF. Arrays

Übung zur Vorlesung Programmierung

Vorlesung Programmieren

Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Selbsteinstufungstest Vorkurs Programmieren

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Martin Unold INFORMATIK. Geoinformatik und Vermessung

hue12 January 24, 2017

Aufgabenblatt 5. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Problem: Gegeben Spezifikation (P,Q) und Implementierung S Gesucht formaler (automatisierbarer?) Beweis, dass S (P,Q) erfüllt.

Einfache Sortierverfahren in Java, 2. Version

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

5. Java Arrays und Strings

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Informatik II Musterlösung

Programmieren in Java

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Informatik II Sortieren

Informatik II Musterlösung

Sortieralgorithmen OOPM, Ralf Lämmel

Algorithmen und Datenstrukturen

DAP2 Praktikum Blatt 2

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Programmanalyse): Programmierung WS17/18 Übungsblatt 5 (Abgabe ) Allgemeine Hinweise:

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Präsenzübung Datenstrukturen und Algorithmen SS 2014

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Datenstrukturen sind neben Algorithmen weitere wichtige Bausteine in der Informatik

Probeklausur: Programmierung WS04/05

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Informatik II Übung 3. Pascal Schärli

Einführung in die Programmierung. (K-)II/Wb17

Tutoraufgabe 1 (Pilze):

Informatik II Übung 2. Pascal Schärli

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen 2. Stefan Florian Palkovits, BSc Juni 2016

Informatik 1 für Nebenfachstudierende Beispiele für Klausuraufgaben

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einstieg in die Informatik mit Java

Zentralübung Grundlagen der Programmierung

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Transkript:

Ludwig-Maximilians-Universität München SS 2006 Institut für Informatik Übungsblatt 4 Prof. Dr. M. Wirsing, M. Hammer, A. Rauschmayer Informatik II Musterlösung Zu jeder Aufgabe ist eine Datei abzugeben, deren Name rechts in der Aufgabenüberschrift steht. Stellen Sie die Dateien in ein extra Verzeichnis (mit beliebigem Namen) und packen Sie dieses zu einem ZIP- Archiv. Geben Sie dieses, wie üblich, per UniWorx ab. Aufgabe 4-1 Insertion Sort (InsertionSort.java, 14 Punkte) ˆ Algorithmus: Insertion Sort ist ein Sortier-Algorithmus, bei dem eine Sequenz u von unsortierten Zahlen in eine Sequenz s von sortierten Zahlen überführt werden soll. Am Anfang ist dabei s leer, danach werden der Reihe nach alle Elemente e von u durchlaufen und so in s eingefügt, dass s sortiert bleibt. Für diese Aufgabe wollen wir ganze Zahlen aufsteigend sortieren: Man sucht also das erste Element von s, das größer ist als e und fügt e davor ein. Ist kein Element von s größer, so wird e hinten an s gehängt. Dieser Algorithmus ist sehr nahe an dem, was ein Mensch tun würde, wenn er etwas sortieren muss. ˆ Implementierung: Wir wollen mit Reihungen (Arrays) arbeiten und s nicht separat halten, sondern direkt in u unterbringen (sogenanntes in-place sorting). Dazu betrachten wir immer den Anfang von u als sortiertes Array und fügen den Rest sortiert ein. Zu Beginn hat dieses sortierte Präfix automatisch schon ein Element (da ein einelementiges Array immer sortiert ist). Das nächste einzufügende Element steht immer direkt hinter dem Präfix. Zu Veranschaulichung: Sei u ein Array mit n Elementen e i. e 0, e 1,..., e len 1, e len,..., e n 1 {{ {{ bereits sortiert unsortiert e len ist das nächste einzusortierende Element. u ist sortiert in dem Moment, wo das Präfix das gesamte u ausfüllt, es ist dann len = n. ˆ Hinweis: Sie können die break-anweisung verwenden, um eine Schleife vorzeitig zu verlassen. break steht z.b. im Then-Fall einer if-anweisung und führt oft zu lesbarerem Code, als wenn man das entsprechende Abbruchkriterium noch zusätzlich in die Schleifenbedingung packt (beispielsweise die dritte Stelle der for-schleife). public class BreakExample { int[] myints = { 20, 3, 2, 0, 5, 1; // Variante 1 System.out.println("1. Alle Zahlen vor der ersten 0:"); for(int i=0; i < myints.length; i++) { if (myints[i] == 0) { break; System.out.println(myInts[i]); // Variante 2 System.out.println("2. Alle Zahlen vor der ersten 0:"); for(int myint : myints) { if (myint == 0) { break; System.out.println(myInt);

Teilaufgaben: a) Verwenden Sie das untenstehende Gerüst zur Implementierung der Prozeduren (statischen Methoden) sort und insert und versehen Sie diese Methoden ausserdem mit einem geeigneten JavaDoc- Kommentar. public class InsertionSortSkeleton { public static void sort(int[] numbers) { private static void insert(int[] numbers, int index, int element, int len) { int[] numbers = { 3, 4, 3, 2, 1 ; // Arrays.toString hilft beim Ausgeben von Arrays: System.out.println("Davor: " + Arrays.toString(numbers)); sort(numbers); System.out.println("Danach: " + Arrays.toString(numbers)); b) Fügen Sie zu den Prozeduren sinnvolle Vor- und Nachbedingungen hinzu: ˆ Prozedur sort: Eine Nachbedingung. ˆ Prozedur insert: Eine Vorbedingung. Hinweise: ˆ Schreiben Sie die Vor- und Nachbedingungen in den Java-Code, mit der assert-anweisung. ˆ Sie können beliebig aus dem Quellcode der Vorlesung abschreiben. ˆ Dies ist keine formale Aufgabe, es geht vielmehr darum, ein pragmatisches Gefühl für Vor- und Nachbedingungen zu entwickeln. public class InsertionSort { * Der klassische Insertion-Sort. * * @param numbers * diese ganzen Zahlen werden aufsteigend sortiert. public static void sort(int[] numbers) { for (int len = 1; len < numbers.length; len++) { // Suche das erste Element das grösser ist als numbers[len] for (int i = 0; i < len; i++) { if (numbers[i] > numbers[len]) { // Dann sind wir fertig und fügen numbers[len] an der

// Stelle i ein insert(numbers, i, numbers[len], len); break; // jetzt sind len+1 Elemente sortiert assert isordered(numbers); * Füge ein Element in ein Präfix eines Arrays ein. * * @param numbers * in dieses Array wird eingefügt. * @param index * an dieser Stelle wird eingefügt, die nachfolgenden Elemente * bis (exklusive) <code>len</code> werden um eins nach hinten * verschoben. * @param element * der einzufügende Wert. * @param len * Länge des Präfixes. Alle elemente vor <code>len</code> (und ab * <code>index</code>) werden verschoben, element <code>len</code> selbst * wird überschrieben. private static void insert(int[] numbers, int index, int element, int len) { assert index < len && len < numbers.length; for (int i = len; i > index; i--) { numbers[i] = numbers[i - 1]; numbers[index] = element; int[] numbers = { 3, 4, 3, 2, 1 ; System.out.println("Davor: " + Arrays.toString(numbers)); sort(numbers); System.out.println("Danach: " + Arrays.toString(numbers)); //---------------------- Prädikate für Assertions public static boolean isordered(int[] a) { for (int i = 0; i < a.length - 1; i++) { if (!(a[i] <= a[i + 1])) { return false; return true; c) Welche Zeitkomplexität hat der Insertion Sort? Begründen Sie Ihre Antwort kurz informell.

ˆ Durchschnitt (danach war gefragt): ˆ Worst case: (n 1)n 2 = O(n 2 ) n 1 i=1 ˆ Best case: Array ist schon sortiert, O(n) i 2 = 1 (n 1)n 2 2 = O(n 2 ) Aufgabe 4-2 Matrizen transponieren (MatrixTransposition.java, 8 Punkte) Schreiben Sie ein Programm, das Matrizen transponiert. Erweitern Sie hierzu das folgende Skelett: public class MatrixTranspositionSkeleton { public static int[][] transpose(int[][] matrix) { public static void printmatrix(int[][] matrix) { int[][] matrix = {{1,2,3,{4,5,6; System.out.println("Vor Transposition:"); printmatrix(matrix); System.out.println("Nach Transposition:"); printmatrix(transpose(matrix)); Zu beachten: ˆ Implementieren Sie Matrizen als geschachtelte Reihungen. ˆ Welche Art von zweidimensionaler Reihung kann überhaupt sinnvoll gedreht werden? Schreiben Sie hierzu eine geeignete Vorbedingung, die ggf. eine Hilfsprozedur verwendet. ˆ Bei der Prozedur printmatrix kann ihnen die statische Methode tostring(int[]) in der Klasse java.util.arrays helfen. Im Prinzip könnten Sie auch deeptostring(int[]) einsetzen, aber damit stehen die Zeilen der Matrix nicht untereinander. public class MatrixTransposition { public static int[][] transpose(int[][] matrix) { assert isrectangular(matrix) : "Matrix nicht rechteckig"; if (matrix.length == 0 matrix[0].length == 0) { return new int[0][]; int[][] result = new int[matrix[0].length][];

for(int i=0; i < result.length; i++) { result[i] = new int[matrix.length]; for(int i=0; i < matrix.length; i++) { for(int j=0; j < matrix[i].length; j++) { result[j][i] = matrix[i][j]; return result; private static boolean isrectangular(int[][] matrix) { if (matrix.length == 0) { return true; // Jetzt gibt es auf jeden Fall einen Index 0 in matrix for(int i=1; i < matrix.length; i++) { if (matrix[i].length!= matrix[0].length) { return false; return true; * Kurzversion, die vollkommen genügt. public static void printmatrix(int[][] matrix) { for(int[] row : matrix) { System.out.println(Arrays.toString(row)); * Luxusvariante, motiviert durchs Forum. public static void printmatrix2(int[][] matrix) { // Funktioniert nur, wenn man vorher überprüft hat, dass die Matrix wirklich rechteckig ist String formatstr = computeformatstring(matrix); for(int[] row : matrix) { System.out.print(" "); for(int i=0; i < row.length; i++) { if (i > 0) System.out.print(", "); System.out.format(formatStr, row[i]); System.out.println(" "); private static String computeformatstring(int[][] matrix) { int max = 1; for(int[] row : matrix) { for (int value : row) { max = Math.max(max, Integer.toString(value).length());

String formatstr = "%"+max+"d"; return formatstr; int[][] matrix = {{1,2,3333,{4,5,6; printmatrix2(matrix); printmatrix2(transpose(matrix)); Aufgabe 4-3 Hoare-Tripel (HoareTripel.txt, 8 Punkte) Für welche der folgenden Spezifikationen sind alle, bestimmte oder gar keine Programme P partiell oder total korrekt? Geben Sie für jedes Tripel die Menge der Programme P an, die partiell bzw. total korrekt sind. Gilt die Korrektheit nur für bestimmte Programme, geben Sie ein Beispiel eines korrekten und eines inkorrekten Programms an! a) {true P {true ˆ Dies ist partiell korrekt für beliebige Programme P ˆ Totale Korrektheit gilt nur, wenn P auch terminiert. So gilt totale Korrektheit für { ({true { {true), während für while(true){ zwar partielle, nicht jedoch totale Korrektheit gilt. b) {false P {true Für alle P gilt bzgl. dieser Spezifikation partielle wie totale Korrektheit. Da {false niemals erfüllt sein kann, ist die Forderung Wenn die Vorbedingung gilt, dann... trivialerweise erfüllt. c) {true P {false ˆ Partielle Korrektheit gilt genau dann für P, wenn P nicht terminiert. Beispielsweise gilt für {true while(true){ {false partielle Korrektheit, während für {true { {false partielle Korrektheit nicht gilt. ˆ Für kein P gilt totale Korrektheit bzgl. dieser Spezifikation. d) {φ P {φ für eine beliebige Formel φ Streng nach Aufgabenstellung: Partielle wie totale Korrektheit gilt nur für manche P. Beispielsweise gelten beide Korrektheiten für {φ {φ, hingegen keine von beiden für {x = 0 x = 1; {x = 0. Wir können aber etwas genauer hinschauen: Totale Korrektheit für {φ P {φ gilt nur dann, wenn auch totale Korrektheit für {φ P {true gilt, d.h. P terminiert unter der Vorbedingung φ. Und partielle Korrektheit (und, mit obriger Bedingung, auch totale Korrektheit) gilt für {φ P {φ genau dann, wenn φ invariant bzgl. P ist. Dies gilt z.b., wenn P keine Variablen, die in φ vorkommen, modifiziert (z.b. {x > 0 y = 1; {x > 0). Abgabe: Per UniWorx, bis spätestens Montag, den 29.5.2006 um 9:00 Uhr.