Strukturiertes Programmieren

Ähnliche Dokumente
Strukturiertes Programmieren

Programmieren in Java

Übung zur Vorlesung Strukturiertes Programmieren WS 2014/15. Übungsblatt 1: JAVA - Erste Schritte Abgabe: Besprechung:

Grundelemente objektorientierter Sprachen (1)

Grundelemente objektorientierter Sprachen (1)

Bachelorprüfung: Objektorientierte Softwareentwicklung

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

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

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

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

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Übung 10: Dynamische Datenstrukturen und Rekursion

Informatik II Übung 5

Vorkurs Informatik WiSe 16/17

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

Programmieren in Java

Programmieren in Java -Eingangstest-

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Vorkurs Informatik WiSe 17/18

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

a) Für das vorgegebene Programmstück ergibt sich folgendes Referenzgeflecht:

Methoden und Wrapperklassen

Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1

Einstieg in die Informatik mit Java

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Tag 8 Repetitorium Informatik (Java)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Verkettete Datenstrukturen: Listen

Vererbung, Polymorphie

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Prozeduren vs. Funktionen

Einführung in die Programmierung WS 2009/10. Übungsblatt 5: Typen, Variablen und einfache Methoden in Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Informatik II Musterlösung

Einstieg in die Informatik mit Java

Objektorientierte Programmierung Studiengang Medieninformatik

Folienpaket 7 Themenschwerpunkte: Methoden in OOP /2016 Dr. Daniel Haase - Vorkurse Informatik V3/V4

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

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

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Einstieg in die Informatik mit Java

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Basiswissen in Informatik

Probeklausur: Programmierung WS04/05

Grundlagen der Informatik / Algorithmen und Datenstrukturen. Aufgabe 139

Einstieg in die Informatik mit Java

ADT: Verkettete Listen

Bachelorprüfung: Objektorientierte Softwareentwicklung

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2017/18. Vorbereitende Aufgaben

ADT: Verkettete Listen

Objektorientierung. Programmierstarthilfe WS 2010/11 Fakultät für Ingenieurwissenschaften und Informatik

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Implementieren von Klassen

Probeklausur Informatik 2 Sommersemester 2013

Transkript:

Friedrich-Schiller-Universität Jena Fakultät für Mathematik und Informatik Institut für Informatik Prof. Dr. E.-G. Schukat-Talamazzini http://www.minet.uni-jena.de/fakultaet/schukat/ Prof. Dr. P. Dittrich http://users.minet.uni-jena.de/~dittrich/, R3430 Übung zur Vorlesung Strukturiertes Programmieren WS 2017/18 Übungsblatt 9: Klassen, dynamische Datentypen, Liste, Pakete, Ausnahmen Abgabe: 18.12.2017 Besprechung: 19.12.2017 Hinweise: 1. Bitte bringen Sie den Quelltext Ihrer Lösungen zur Übung mit. Sie sollten diese vorführen können. Kommen Sie zur Übung, auch wenn Sie keine Lösungen haben. 2. Abgabe auch möglich bis 10:14 (Montags) Büro Dittrich (EAP 1-4, 4. Stock, rechts, ganz hinten). 3. Bearbeitungszeit: 10h 4. Maximale Punktzahl: 10 Punkte 5. Abgegebene Blätter tackern. Gruppennummer notieren (oben rechts). Skript zu jeder Veranstaltung mitbringen. Aufgaben 2-6 sind besonders wichtig!. 1 Wiederholung (1h / 1P) Arbeiten Sie das Skript (Folien) zur laufenden Vorlesung durch; insbesondere die Teile, die nicht in der Übung behandelt werden; etwa: Beispiel einer Klasse komplexer Zahlen. Alles klar soweit? Was ist unklar geblieben? Investierte Zeit neben der Vorlesung: Zusammengearbeitet mit: 2 Präsenzübung 1: Swap für Paare (-/-) Erweitern Sie Ihre Klasse IntPair um eine Methode swap, die die Element des Paars vertausch. (a) Testen Sie Ihre Methode: 1

IntPair p1 = new IntPair(1,2); IntPair p2 = p1.swap(); System.out.println("Original p1 = " + p1); System.out.println("Vertauscht p2 = " + p2); AUSGABE: Original p1 = ( 1 2 ) Vertauscht p2 = ( 2 1 ) (b) Welche alternative Implementierung wäre denkbar, die dann aber für obiges Testprogramm folgende Ausgabe liefern würde: AUSGABE: Original p1 = ( 2 1 ) Vertauscht p2 = ( 2 1 ) (c) Wie könnte man das Testprogramm ändern, sodass die korrekte gewünschte Ausgabe geliefert wird? (d) Zeichnen Sie für den Fall (a-c) den Namensraum (so wie in der Übung an der Tafel), d.h., Variablennamen mit Refernzen auf Objekte. 3 Hinweise zum Zeichnen des Namensraums Betrachten Sie: https://docs.google.com/document/d/1khcju60-bhvoakw7j-9uzgdmgtg0tfx4xgcy3jwitqm/edit Zeichnen Sie einen Bereich für den Stabel (engl. stack) und einen für die Halde (engl. heap). Für eine (Referenz)-Variable schreiben wir einfach ihren Namen hin. Eine Referenz (= Verweis) wird durch einen Pfeil dargestellt. Der Pfeil geht von der Referenzvariable zum Objekt. Zwei Pfeile (Referenzen) sind im Übrigen gleich, genau dann wenn sie auf den gleichen Speicherbereich (das identische Objekt) zeigen. Objekte im Speicher (Halde) stellen wir durch einen Kasten dar, auf den Referenzen zeigen können. Den Kasten beschriften wir mit dem Klassennamen und den dynamisch gebundenen Instanzvariablen, die wiederum mit Werten belegt sein können. Insbesondere entsteht bei jedem new ein neuer Kasten im Speicher (hier: auf der Halde, ein anonymes Objekt). Kästen (auf der Halde), auf die keine Referenzen zeigen, können wir entfernen. Beim Zeichnen müssen Sie zwischen Stapel und Halde unterscheiden. Eine neu deklarierte (Referenz-)Variable erscheint auf dem Stapel. Wird eine neues Objekt erzeugt, so erscheint dieses auf der Halde (siehe Skript). Variablen, die einen elementare Datentyp haben (int, long,...) müssen wir anders darstellen, damit der Gleichheitsoperator richtig funktioniert! 2

4 Präsenzübung 2: Paar von Paaren (-/-) a) Entwickeln Sie eine Klasse IntPairPair die Paare von Zahlenpaaren repräsentiert. b) Testen Sie Ihre neue Klasse, etwa wie folgt: IntPair p1 = new IntPair(1,2); IntPair p2 = new IntPair(3,4); IntPairPair pp1 = new IntPairPair(p1,p2); IntPairPair pp2 = new IntPairPair(p2,p1); System.out.println("pp1: " + pp1); System.out.println("pp2: " + pp2); Ausgabe: pp1: [ ( 1 2 ) ( 3 4 ) ) pp2: ( ( 3 4 ) ( 1 2 ) ) c) Zechnen Sie den Namensraum. 5 Liste (ohne Mutatoren) (4h / 6P) Ziel: Implentieren eines komplexen Datentyps variabler Länge. Zunächst ohne Mutatoren (d.h. ein Objekt kann nicht verändert werden), damit wir später den Unterschied zu einer Implementierung mit Mutatoren besser verstehen. Implementieren Sie den Datentyp Liste von Integer (int) als JAVA Klasse List. Eine Liste ist durch folgende Schnittstelle definiert: INTERFACE SEMANTIK (informal) --------------------------------------------------------------- theemptylist: --> List die leere List isempty: List --> boolean true, falls Liste lehr car: List --> int das erste Element der Liste cdr: List --> List die Liste ohne das erste Element cons: int x List --> List Element (item) hinzufuegen ---------------------------------------------------------------- Formale Semantik: Fuer a aus int und L aus List gelte immer: isempty(theemptylist()) == true car(cons(a, L)) == a cdr(cons(a, L)) == L Wir wollen die Liste diesmal als miteinander verketteter Knoten implementieren. Man spricht dann auch von einer verketteten Liste. Dies hat den Vorteil, dass wir nicht von vornherein eine maximale Größe für die Liste festelgen müssen, wie dies bei dem Stack vorher der Fall war. Bevor Sie weiterlesen, überlegen Sie, welche Konstruktoren und Methoden wir benötigen und wie man diese implementieren könnte. (Das brauchen Sie aber nicht für die Abgabe beschreiben.) Die Liste sollte wie folgt verwendbar sein: 3

public static void main(string[] args) { List L = new List(); List L1 = L.cons(1); List L2 = L1.cons(2); List L3 = L2.cons(3); System.out.println(L1); System.out.println(L2); System.out.println(L3); System.out.println(L3.car()); System.out.println(L3.cdr()); List L4 = L3.cons(4).cons(5).cons(6); System.out.println(L4); AUSGABE: 1 2 1 3 2 1 3 2 1 6 5 4 3 2 1 Zur Implementierung sollte folgende Vorlage verwendet werden. Beachten Sie, dass hier die Klasse Node innerhalb der Klasse List definiert wird. Also nur innerhalb dieser sichtbar ist. 4

public class List { private class Node { int item; List next; Node(int i, List l){ item = i; next = l; private Node root; // hier def. wir eine Klasse innerhalb // einer Klasse // erste Node der Liste List(){ root = null;; // root=null ist wohl ueberfluessig, // da root initial mit null belegt wird. boolean isempty(){return (root == null);... car(){return...... cdr(){return...... cons(...){... new List...... new Node... return... @Override public String tostring(){... isempty...... return... return... car()... cdr()... 6 Namensraum und Speicherbelegung zeichnen (1h / 2P) Zeichnen Sie die Umgebung mit Variablennamen und ihren Refernzen auf die entprechenden Objekte am Ennde von main (nach der Deklaration von L4). Verwenden Sie für Objekte der Klassen List und Node jeweils eine andere Farbe. Zur Erinnerung: Jede new Operation erzeugt ein neues Objekt der entsprechenden Klasse. Eine Zuweisung wie z.b. Node a = b; kopiert nur eine Referenz von b nach a, erzeugt aber kein neues Objekt. 7 Paket für Zahlenpaare (1h / 1P) Ziel: Einüben des Paketkonzepts. (a) Schreiben Sie ein Paket (package) namens container, das eine Klasse aus einer vorausgehenden Übung enthalten soll (bspw. Paar, List, oder Stack). (b) Ist Ihnen klar was public im Zusammenhang mit Paketen bedeutet und was passiert, wenn man nur die default-sichtbarkeit (d.h. ohne public) verwendet. (ja / nein) (bei nein, nachlesen) 5

(c) Testen Sie das Paket, indem sie es verwenden. Hinweis: Pakete erlauben es, Klassen zusammenzufassen, wodurch eine bessere Strukturierung möglich ist. In der Praxis sollte man schon bei kleinen Projekten auch Pakete verwenden. Für den Übungsbetrieb ist dies aber nicht so relevant. Für die Praxis schon, desshalb hier einmal selbst versuchen. Hinweis: NETBEANS hilft Ihnen bei der Paketerzeugung: Einfach links-click auf Source-Packages und New -> JAVA Package wählen und einen sinnvollen Namen für das Paket eingeben. Innerhalb des Pakets dann die neue Klasse anlegen. 8 Ausnahmen (3h / 3P) Ausnahmen (engl. exceptions) sind eine äußerst mächtige und elegante Technik Programme sicherer und stabiler zu machen. Machen Sie sich klar, welche Arten von Ausnahmenklassen es gibt. Throwable - Klasse, die man werfen kann Error - toetlich Exception - muss abgefangen werden Runtimeexeption - muss nicht unbedingt abgefangen werden (a) Erweitern Sie die Implementierung einer Liste um eine Ausnahme, die das Lesen über das Listenende abfängt. (b) Führen Sie einen entsprechenden Test durch (Beispiellauf wie immer ausdrucken). Hinweis: Wenn es Ihnen zu kompliziert ist, Ihre Liste zu erweitern, denken Sie sich zwei eigene einfache Beispiele für Ausnahmen aus und testen Sie sie. 9 Hülltypen (1h / keine Abgabe) Probieren Sie die Verwendung von Hülltyen aus: Byte, Short, Integer, Long, Float, Double, Character, Boolean 10 Mathematische Funktionen (1h / keine Abgabe) import static java.lang.math.* erspart Praefix Math Nur zunächst als Info. Genug geübt bis hierher. Viel Spaß und Erfolg! 6