Institut für Programmierung und Reaktive Systeme 10. Mai Programmieren II. 11. Übungsblatt

Ähnliche Dokumente
Institut für Programmierung und Reaktive Systeme 7. Mai Programmieren II. 11. Übungsblatt

Institut für Programmierung und Reaktive Systeme 22. Mai Programmieren II. 11. Übungsblatt

Institut für Programmierung und Reaktive Systeme 31. Mai Programmieren II. 12. Übungsblatt

Institut für Programmierung und Reaktive Systeme 24. April Programmieren II. 10. Übungsblatt

Institut für Programmierung und Reaktive Systeme 28. Mai Programmieren II. 12. Übungsblatt

Institut für Programmierung und Reaktive Systeme 12. Juni Programmieren II. 12. Übungsblatt

Institut für Programmierung und Reaktive Systeme 27. Mai Programmieren II. 12. Übungsblatt

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren II. 12. Übungsblatt

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Institut für Programmierung und Reaktive Systeme 24. Juni Programmieren II. 14. Übungsblatt

Institut für Programmierung und Reaktive Systeme 6. Juni Programmieren II. 12. Übungsblatt

Institut für Programmierung und Reaktive Systeme 5. Dezember Programmieren I. 5. Übungsblatt

Institut für Programmierung und Reaktive Systeme 27. Juni Programmieren II. 14. Übungsblatt

Institut für Programmierung und Reaktive Systeme 8. Mai Programmieren II. 10. Übungsblatt

Institut für Programmierung und Reaktive Systeme 26. April Programmieren II. 10. Übungsblatt

Institut für Programmierung und Reaktive Systeme 4. Dezember Programmieren I. 5. Übungsblatt

Institut für Programmierung und Reaktive Systeme 7. Juli Programmieren II. Übungsklausur

Algorithmen und Programmierung III

Institut für Programmierung und Reaktive Systeme 6. Juli Programmieren II. Übungsklausur

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Institut für Programmierung und Reaktive Systeme 17. Juli Programmieren II. Übungsklausur

Institut für Programmierung und Reaktive Systeme 20. November Programmieren I. 4. Übungsblatt

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

Grundlagen der Informatik

13. Bäume: effektives Suchen und Sortieren

13. Bäume: effektives Suchen und Sortieren

Kapitel 4: Datentyp Keller und Schlange

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Institut für Programmierung und Reaktive Systeme 11. Dezember Programmieren I. 5. Übungsblatt

Institut für Programmierung und Reaktive Systeme 25. Januar Programmieren I. Übungsklausur

Schnittstellen, Stack und Queue

Kapitel 3: Datentyp Keller und Schlange

Technische Universität Braunschweig

Allgemeine Informatik 2 im SS 2007 Programmierprojekt

2.3 Implementierung und Anwendung von ADT Anwendung von ADT... am Beispiel "Stapel"

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

ihrer Klasse benötigt die Funktion einfuegenan:

Probeklausur zur Vorlesung

Einführung in die Programmierung (EPR)

Software Entwicklung 1

Institut für Programmierung und Reaktive Systeme 9. Januar Programmieren I. 6. Übungsblatt

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

ALP II Dynamische Datenmengen Datenabstraktion

Software Entwicklung 1

Institut für Programmierung und Reaktive Systeme 6. November Programmieren I. 3. Übungsblatt

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Tutoraufgabe 1 (Implementierung eines ADTs):

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

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 16. Juli Klausur

Programmieren 2 15 Abstrakte Datentypen

Vorkurs Informatik WiSe 17/18

Vorkurs Informatik WiSe 16/17

Einstieg in die Informatik mit Java

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

Übung Informatik I - Programmierung - Blatt 8

Punkte. Teil 1. Teil 2. Summe. 1. Zeigen Sie, dass der untenstehende Suchbaum die AVL-Bedingung verletzt und überführen Sie ihn in einen AVL-Baum.

Name: Matrikelnr : Aufgabe 1: (ca. 8 Punkte )

Abschnitt 10: Datenstrukturen

EPROG 2.Teilprüfung. Aufgabe 1:

Grundlagen der Informatik

Ausdrucksbäume in verschiedenen Darstellungen

Programmieren in Java -Eingangstest-

Technische Universität Braunschweig

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

Übung Informatik I - Programmierung - Blatt 6

Programmieren I + II Regeln der Code-Formatierung

Übung Algorithmen und Datenstrukturen

Institut für Programmierung und Reaktive Systeme 2. Februar Programmieren I. Übungsklausur

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Algorithmen und Programmierung III

Einführung in die Programmierung

II.4.4 Exceptions - 1 -

Einführung in die Objektorientierte Programmierung Vorlesung 18: Lineare Datenstrukturen. Sebastian Küpper

Tutoraufgabe 1 (Verifikation):

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

2 Programmieren in Java I noch ohne Nachbearbeitung

Programmieren in Java

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

Fragenkatalog ESOP WS 16/17

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

! 1. Rekursive Algorithmen.! 2. Rekursive (dynamische) Datenstrukturen. II.3.2 Rekursive Datenstrukturen - 1 -

1 Einleitung Generizität Syntax... 2

Ordnung im Materiallager: Datenstrukturen II. Suchen und Sortieren im Array Verkettete Listen Rekursion

OOP Aufgabenblatt 7 6. Dezember 2013

Programmieren I + II Regeln der Code-Formatierung

Klausur Sommersemester 2012 Datenstrukturen und Algorithmen 24. September 2012

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Klausur zur Veranstaltung Programmierung (fortgeschrittene Konzepte)

Spezielle Datenstrukturen

Programmierkurs Java

Objektorientierte Programmierung Studiengang Medieninformatik

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Software Entwicklung 1

Übung Algorithmen und Datenstrukturen

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Vorlesung Datenstrukturen

Transkript:

Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 10. Mai 2013 Programmieren II 11. Übungsblatt Hinweis: Dieses Übungsblatt enthält die zweite Pflichtaufgabe. Ihre Lösung der Pflichtaufgabe dieses Übungsblatts müssen Sie bis spätestens zum 26. Mai 2013 auf der Web-Seite http://abgabe.yafido.de abgeben. Nach der Abgabe müssen Sie die Lösung Ihrem Tutor in der Rechnerübung erläutern. Halten Sie sich bei der Programmierung an die in der Vorlesung vorgestellten Richtlinien zur Formatierung von Java-Programmen. Auf der Internetseite zu dieser Veranstaltung finden Sie eine Zusammenstellung dieser Richtlinien. Kommentieren Sie Ihre Lösung der Pflichtaufgabe. Der Kommentar muss Ihren Namen, Ihre Matrikelnummer und Ihre Übungsgruppe sowie eine Beschreibung Ihrer Lösung enthalten. Auf der Abgabeseite finden Sie eine Möglichkeit, die Formatierung Ihrer Lösung zu checken. Aufgabe 62: Der abstrakte Datentyp Keller mit Elementen vom Typ T wird durch die generische Schnittstelle interface Stack<T> { boolean isempty(); T top() throws MyStackException; void push(t x); void pop() throws MyStackException; beschrieben. a) Geben Sie eine Klasse LinkedListStack an, die diese Schnittstelle durch eine verkettete Liste implementiert. Lösen Sie jeweils eine eigene Ausnahme aus, falls eine Operation nicht definiert ist. Realisieren Sie Ihre Implementierung ohne den Import fremder Klassen. b) Testen Sie Ihre Implementierung, indem Sie eine Klasse LinkedListStackTest anlegen, mit der alle Methoden des Interfaces für die Datentypen Integer und Character mit JUnit getestet werden. Ihr Test soll dabei auch den Fehlerfall top/pop für einen leeren Keller enthalten.

c) Testen Sie anschließend Ihr Programm mit der folgenden Anwendung: Editoren besitzen häufig ein sog. Löschsymbol. Wenn beispielsweise das Zeichen "#" das Löschsymbol ist, dann wird die Zeichenkette "abc#d##e" zur Zeichenkette "ae", denn das erste Löschsymbol löscht "c", das zweite "d" und das dritte "b". Testen Sie Ihr Programm, indem Sie eine Zeichenkette aus einer Datei einlesen und das Ergebnis ausgeben. Falls die Datei die Zeichenkette "abc#d##e" enthält, soll also "ae" ausgegeben werden. Falls die Datei die Zeichenkette "abc #d #e" enthält, soll dementsprechend "abcde" ausgegeben werden. Verwenden Sie dafür den folgenden Algorithmus: Jedes Zeichen der Datei wird eingelesen. Zeichen, die nicht das Löschsymbol sind, werden in einem Keller des Datentyps Character gespeichert. Falls das Zeichen das Löschsymbol ist, wird das oberste Kellerzeichen gelöscht. Falls alle Zeichen eingelesen wurden, befindet sich die gesuchte Zeichenkette in umgekehrter Reihenfolge auf dem Keller. Geben Sie den Kellerinhalt in umgekehrter Reihenfolge aus. Verwenden Sie dazu einen zweiten Keller. Wie Zeichen aus einer Datei eingelesen werden können, zeigt das folgende Beispielprogramm: import java. i o. ; public c l a s s Test { public s t a t i c void main ( S t r i n g [ ] args ) { FileReader f ; i n t c ; try { f = new FileReader ( " input. txt " ) ; while ( ( c = f. read ( ) )!= 1) { System. out. p r i n t ( ( char ) c ) ; f. c l o s e ( ) ; catch ( IOException e ) { System. out. p r i n t l n ( " D a t e i f e h l e r! " ) ; d) Freiwillige Zusatzaufgabe: Realisieren Sie die Klasse ArrayStack, die die Schnittstelle durch ein Feld implementiert. Lösen Sie die nächste Aufgabe. Sie enthält eine weitere Anwendung der obigen Schnittstelle. 2

Aufgabe 63: Der folgende Algorithmus überführt einen vollständig geklammerten, arithmetischen Ausdruck, der in Infix-Notation vorliegt und nur binäre Operatoren enthält, in Postfix-Notation: Der Algorithmus legt zunächst einen Keller für Character an. Dann wird der arithmetische Ausdruck von links nach rechts abgearbeitet. Dabei wird eine öffnende Klammer ignoriert, eine Zahl in die Ausgabe geschrieben und ein Operator auf dem Keller abgelegt. Bei einer schließenden Klammer wird das oberste Symbol vom Keller entfernt und in die Ausgabe geschrieben. Beispielsweise wird der Ausdruck (5*(((9+8)*(4-6))+7)) durch diesen Algorithmus in die Postfix-Darstellung 5 9 8 + 4 6 - * 7 + * überführt. Schreiben Sie ein Java-Programm, das einen Ausdruck in Infix-Notation zunächst von der Kommandozeile einliest, den Ausdruck dann mithilfe des obigen Algorithmus in Postfix- Notation überführt und schließlich den so gewonnenen Ausdruck mit einem Keller, auf dem Zahlen vom Typ Integer gespeichert werden, auswertet. Sie können davon ausgehen, dass nur ganzzahlige positive Werte und die zweistelligen Operatoren +, -, *, / und % auf der Kommandozeile eingegeben werden und dass der Ausdruck in syntaktisch korrekter Form vorliegt. Gehen Sie folgendermaßen vor: a) Verwenden Sie die Schnittstelle und die Implementierung aus der vorigen Aufgabe. b) Schreiben Sie eine Java-Methode infixtopostfix, die einen arithmetischen Ausdruck, der in Infix-Notation vorliegt, in Postfix-Notation überführt. c) Schreiben Sie eine Java-Methode evaluatepostfix, die einen Ausdruck in Postfix- Notation auswertet, indem sie die Zahlen zunächst auf einem Keller für Zahlen vom Typ Integer speichert und bei der Verarbeitung eines Operators zurückholt. Nennen Sie Ihre Klasse, die die main-methode enthält und die den Infix-Ausdruck einliest, Evaluate. Beispielsweise soll damit der Aufruf java Evaluate (5*(((9+8)*(4-6))+7)) zur Ausgabe -135 führen. 3

Aufgabe 64: In dieser Aufgabe betrachten wir das Problem, die Reihenfolge der Elemente eines Arrays eines generischen Typs umzukehren. a) Entwickeln Sie eine rekursive Lösung für dieses Problem. b) Geben Sie eine iterative Lösung mithilfe eines Kellers an. Verwenden Sie für den Keller eine geeignete Klasse aus dem Java Collections Framework. c) Testen Sie Ihre Lösungen aus a) und b) an Kellern mehrerer Klassen. Aufgabe 65: Der abstrakte Datentyp Baum mit Elementen vom Typ T sei durch die generische Schnittstelle interface Tree<T extends Comparable<T>> { boolean isempty(); // überprüft, ob der Baum leer ist boolean isintree(t x); // überprüft, ob x enthalten ist int size(); // liefert die Anzahl der Elemente int height(); // liefert die Höhe des Baums T minimum(); // liefert das kleinste Element T maximum(); // liefert das größte Element void insert(t x); // fügt x in den Baum ein void delete(t x); // löscht ein Vorkommen von x void deleteall(t x); // löscht alle Vorkommen von x String tostring(); // liefert eine In-Order-Darstellung definiert. Implementieren Sie diesen abstrakten Datentyp durch binäre Suchbäume. Stellen Sie durch Verwendung einer Klasseninvarianten sicher, dass jeder Baum nach dem Einfügen oder dem Löschen eines Knotens die Bedingung eines binären Suchbaums erfüllt. Testen Sie Ihr Programm, indem Sie ganze Zahlen, die in einer Datei gespeichert sind, nacheinander einlesen und in den Baum einfügen. Geben Sie anschließend den Baum mithilfe der Methode tostring() aus. Welche Komplexität besitzt dieses Sortierverfahren im günstigsten bzw. ungünstigsten Fall? 4

Pflichtaufgabe 66: Das Thema der letzten Pflichtaufgabe (Aufgabe 61) war die Programmierung von sortierten, verketteten linearen Listen. Als Anwendungsbeispiel wurden Adressen eingelesen und alphabetisch sortiert ausgegeben. Jede Adresse stand als Datensatz in einer Zeile einer CSV-Datei. Das Thema dieser Pflichtaufgabe sind generische Datentypen. Ihre Aufgabe ist es, die Lösung der letzten Pflichtaufgabe generisch zu programmieren. Damit nimmt die Schnittstelle einer Liste die folgende Form an: public interface List<T extends Comparable<T>> { boolean isempty(); int length(); boolean isinlist(t x); T firstelement(); List<T> insert(t x); List<T> delete(t x); List<T> delete(); Die Implementierung dieser generischen Schnittstelle kann also die folgende Klasse sein: public class LinkedList<T extends Comparable<T>> implements List<T> {... Ihre Implementierung dieser generischen Schnittstelle sollen Sie mit zwei konkreten Klassen testen. a) Testen Sie zunächst Ihre Implementierung mit der Klasse Adresse der letzten Pflichtaufgabe als Wert des Parameters <T>. Die Adressen sollen wie in Aufgabe 61 alphabetisch sortiert ausgeben werden. b) Als zweiten Testfall für den Wert des Parameters <T> sollen Sie ebenfalls eine CSV- Datei verarbeiten. Diese Datei enthält in jeder Zeile ein Fußballspiel wie folgt: Liga;Spieltag;Datum;Uhrzeit;Heim_ID;Heim;Gast_ID;Gast;Tore_Heim;Tore_Gast 1;1;2012-08-24;20:40:00;1;Borussia Dortmund;9;SV Werder Bremen;2;1... Auf der Internet-Seite dieser Veranstaltung werden Sie die CSV-Datei spiele.csv finden, die alle Spiele der ersten, zweiten und dritten Liga der Saison 2012/13 enthält. Ausgegeben werden sollen die drei Tabellen der drei Ligen. Die Sortierung, d. h. die Implementierung der Schnittstelle Comparable<T>, soll also wie folgt umgesetzt werden: Mannschaft a steht vor Mannschaft b, falls a mehr Punkte als b erreicht hat. Ein Sieg bringt drei Punkte, ein Unentschieden bringt einen Punkt. Bei der gleichen Punktezahl geht es nach der erzielten Tordifferenz. Bei gleicher Tordifferenz steht die Mannschaft vorne, die mehr Tore erzielt hat. Auf der Internet-Seite dieser Veranstaltung werden Sie auch die CSV-Datei mannschaften.csv finden, die die Mannschaften enthält. Diese Datei können Sie für Ihr Programm verwenden, müssen es aber nicht. In den bisherigen Aufgaben wurde Ihnen die Klassen- und die Datenstruktur Ihres Programms vorgegeben. In dieser Übungsaufgabe sollen Sie nun erstmals auch den Entwurf Ihres Progamms selbst anfertigen. 5