Objektorientierte Programmierung



Ähnliche Dokumente
Objektorientierte Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in die Programmierung

Objektorientierte Programmierung

Objektorientierte Programmierung

U08 Entwurfsmuster (II)

Studentische Lösung zum Übungsblatt Nr. 7

Java: Vererbung. Teil 3: super()

Große Übung Praktische Informatik 1

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Java Einführung Collections

Client-Server-Beziehungen

Einführung in die Programmierung für Wirtschaftsinformatik

Prinzipien Objektorientierter Programmierung

Programmieren in Java

Test-Driven Design: Ein einfaches Beispiel

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

SEP 114. Design by Contract

Kapitel 6. Vererbung

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

Kapitel 6. Vererbung

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Grundlagen von Python

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

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Kapitel 6. Vererbung

Folge 19 - Bäume Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Algorithmen und Datenstrukturen

368 4 Algorithmen und Datenstrukturen

Einführung in die Java- Programmierung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Folge 18 - Vererbung

Programmierkurs Java

Tagesprogramm

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Prüfungszeuch im Fach Objektorientierte Programmierung WS 2000

Vorkurs C++ Programmierung

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Java Kurs für Anfänger Einheit 5 Methoden

Software Engineering Klassendiagramme Assoziationen

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

Typumwandlungen bei Referenztypen

Arrays Fortgeschrittene Verwendung

Selbststudium OOP4 Auftrag

Arbeiten mit UMLed und Delphi

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Einführung in Javadoc

5. Abstrakte Klassen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Klassenbeziehungen & Vererbung

Applet Firewall und Freigabe der Objekte

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

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

Praktische Übung 'JUnit-Test'

Software Engineering Klassendiagramme Einführung

Fakultät Angewandte Informatik Lehrprofessur für Informatik

4. AuD Tafelübung T-C3

Technische Dokumentation SilentStatistikTool

Java Einführung Abstrakte Klassen und Interfaces

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Code-Erzeugung aus UML-Klassendiagrammen

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Einführung in die Programmierung

Computeranwendung und Programmierung (CuP)

EndTermTest PROGALGO WS1516 A

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Probeklausur Softwareengineering SS 15

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

5 Projekt Bankverwaltung

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

PIWIN 1 Übung Blatt 5

Einführung in die Programmierung für NF

1 Polymorphie (Vielgestaltigkeit)

Algorithmen und Datenstrukturen

Kapitel 12 Dokumentation und Zugriffsrechte

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Innere Klassen in Java

Assoziation und Aggregation

Auktion name adresse pseudonym adresse /bewertungszahl. Gebot. höhe zeitpunkt bieter. initiiert

Javakurs zu Informatik I. Henning Heitkötter

Fakultät Angewandte Informatik Programmierung verteilter Systeme Übungen zur Vorlesung Informatik II, Blatt 6

Probeklausur: Programmierung WS04/05

Gebundene Typparameter

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Software Engineering Interaktionsdiagramme

3 Objektorientierte Konzepte in Java

Kapitel 9. Inner Classes. 9.1 Wiederholung: Iteratoren. Ausführen einer Operation auf allen Elementen einer Containerklasse

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Von der UML nach C++

Transkript:

Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Zusatzaufgaben Lösungsvorschlag Objektorientierte Programmierung Lösung 22 (Java und UML-Klassendiagramm) a) Im folgenden UML-Diagramm sind teilweise auch Methoden und Attribute vorhanden, die erst an späterer Stelle in der Aufgabe vorkommen sowie Zugriffsrechte und Datentypen. Dies war laut Aufgabenstellung nicht gefordert, soll hier aber der Vollständigkeit dienen b) 1. In der Klasse VorlesungsTeilnahme muss die Methode wie folgt implementiert sein: public int gebuehren() { return 30 + (anzahlbesuchteruebungen * 10); 2. Die Unterscheidung wird durch Polymorphie erreicht. Das heißt im einzelnen, dass bei der Klasse Teilnahme die Unterklassen VorlesungsTeilnahme und SeminarTeilnahme die abstrakte Methode gebuehren unterschiedlich implementieren. In der Unterklasse Gasthoerer wird die konkrete Methode druckegebuehren reimplementiert. 1

c) Die Ermittlung des fleißigsten Studenten kann z.b. durch folgenden Code in den erwähnten Klassen implementiert werden: In der Klasse Verwaltung: public Student findeprimus() { Iterator keyit = studentendaten.keyset().iterator(); //Vorbelegen mit "erstem" Studenten, falls überhaupt //Studenten vorhanden. Student primus; if(keyit.hasnext()) { primus = (Student)studentenDaten.get(keyIt.next()); //Ermittlung des Primus, indem stets der Student in der Variable //primus gemerkt wird, der bis jetzt die meisten Wertungspunkte //hatte. Dieser wird dann mit dem "nächsten" verglichen und event. //ausgetauscht. ACHTUNG: Wenn zwei Studenten gleich viele //Wertungspunkte haben, ist der der Primus, der bzgl. des Iterator //als erster erscheint! while(keyit.hasnext()) { Student aktstud = (Student)studentenDaten.get(keyIt.next()); if( primus == null primus.wertungspunkte() < aktstud.wertungspunkte() ) { primus = aktstud; return primus; In der Klasse Student: public int wertungspunkte() { int punkte = 0; Iterator keyit = teilnahmedaten.keyset().iterator(); //Die Wertungspunkte aller Teilnahmen werden aufaddiert. while(keyit.hasnext()) { punkte += ((Teilnahme)teilnahmeDaten.get(keyIt.next())).wertungspunkte(); return punkte; In der Klasse SeminarTeilnahme: public int wertungspunkte() { return 4; In der Klasse VorlesungsTeilnahme: public int wertungspunkte() { return anzahlbesuchteruebungen; 2

d) Die Implementierung verwendet eine statisch innere Klasse, die in der Klasse Verwaltung definiert wird. Die eigentliche Arbeit wird von der Methode nextworker erledigt, auf die sich next und der Konstruktor stützen. Das Problem bei der Implementierung ist, dass next nicht null zurückgeben darf, wenn kein Objekt mehr im Iterator vorhanden ist (laut dem Vertrag den das Interface java.util.iterator einer Implementation auferlegt). In diesem Fall muss eine java.util.nosuchelementexception geworfen werden. Des weiteren darf hasnext beliebig oft vor einem next aufgerufen werden, d.h. mit anderen Worten, dass hasnext nicht den Zustand des Objekts verändern darf (deshalb kann die Arbeit, die nextworker verrichtet nicht von dieser Methode erledigt werden). Die hasnext Methode muss aber wirklich implementiert werden und kann nicht einfach an die entsprechende Methode des studit delegiert werden, da noch gefiltert werden muss. Die Idee ist, immer schon im voraus zu ermitteln, welches Objekt vom nächsten Aufruf der Methode next zurückgegeben wird. Dieses wird in nextobject gemerkt. Wenn kein Objekt mehr zurückgegeben werden kann, ist nextobject == null. Der Wert von nextobject wird rekursiv in der Methode nextworker ermittelt. Da die Implementierung von remove in diesem Fall nicht sinnvoll erscheint, wird einfach eine java.lang.unsupportedoperationexception geworfen. Das ist laut Java-API-Referenz der richtige Weg, sich um diese Implementierung zu drücken. Die angegebenen Code-Stücke stammen nur aus der Klasse Verwaltung: public class LvIterator implements Iterator { Iterator studit; String veranstaltungsnummer; Object nextobject; LvIterator(Lehrveranstaltung lv) { studit = studentendaten.keyset().iterator(); veranstaltungsnummer = lv.veranstaltungsnummer; //nextworker benutzt schon studit und veranstaltungsnummer!! nextobject = nextworker(); private Object nextworker() { //ACHTUNG: nextobject noch nicht initialisiert beim ersten // Aufruf! if(studit.hasnext()) { Student aktstud = (Student)studIt.next(); if(aktstud.teilnahmedaten.containskey(veranstaltungsnummer)) { return aktstud.teilnahmedaten.get(veranstaltungsnummer); else { return nextworker(); else { return null; public boolean hasnext() { return nextobject!= null; public Object next() { if(!hasnext()) { throw new NoSuchElementException(); Object resultobject = nextobject; 3

nextobject = nextworker(); return resultobject; public void remove() { throw new UnsupportedOperationException(); public Iterator iterator(lehrveranstaltung lv) { return new LvIterator(lv); Lösung 23 (UML Klassendiagramm - Fakultät) 4

Lösung 24 (Bäume als Datenstrukturen und UML-Diagramme) a) b) public class LeererBaum extends ArtikelBaum { public LeererBaum() { super(); public boolean istleer() { return true; public class WurzelBaum extends ArtikelBaum { public WurzelBaum(int schluessel, int wert, ArtikelBaum links, ArtikelBaum rechts) { this.schluessel = schluessel; this.wert = wert; this.links = links; this.rechts = rechts; 5

public boolean istleer() { return false; c) public class LeererBaum extends ArtikelBaum { public boolean enthaelt(int schluessel) { return false; public int finde (int schluessel) throws NoSuchElementException { throw new NoSuchElementException(); public class WurzelBaum extends ArtikelBaum { public boolean enthaelt(int schluessel) { if (this.schluessel == schluessel) return true; if (schluessel < this.schluessel) return links.enthaelt(schluessel); return rechts.enthaelt(schluessel); public int finde (int schluessel) { if (this.schluessel == schluessel) return wert; if (schluessel < this.schluessel) return links.finde(schluessel); return rechts.finde(schluessel); d) public class LeererBaum extends ArtikelBaum { public WurzelBaum einfuege(int schluessel, int wert) { return new WurzelBaum (schluessel, wert, new LeererBaum(), new LeererBaum()); public ArtikelBaum loesche (int schluessel) throws NoSuchElementException { throw new NoSuchElementException(); e) public class LeererBaumIterator implements java.util.iterator { public boolean hasnext() { return false; 6

public Object next() { throw new NoSuchElementException(); public void remove() { throw new UnsupportedOperationException(); f) Das Attribut position gibt den Zustand des Iterators an und nimmt nacheinander die Werte 0, 1 und 2 an. 0 bedeutet, dass noch gar kein Element iteriert wurde. 1 bedeutet, dass gerade der linke Teilbaum iteriert wird. Entsprechend bedeutet 2, dass der rechte Teilbaum iteriert wird. Wie in der Aufgabenstellung verlangt wird im Feld it der jeweils dafür benötigte Iterator gespeichert. Ist position==2 und it.hasnext()==false wurde auch der rechte Teilbaum vollständig durchsucht. Deshalb gibt hasnext() nun auch false zurück. public class WurzelBaumIterator implements java.util.iterator { private WurzelBaum baum; private int position; private ArtikelBaumIterator it; public WurzelBaumIterator( WurzelBaum baum) { this.baum = baum; position = 0; // it nicht initialisiert public boolean hasnext() { return (position < 2 (position == 2 && it.hasnext())); public Object next() { if (position == 0) { it = baum.getlinks().iterator(); position = 1; if (position == 1) { if (it.hasnext()) return it.next(); it = baum.getrechts().iterator(); position = 2; return baum; // hier ist position == 2 return it.next(); public void remove() { throw new UnsupportedOperationException(); 7

Lösung 25 (Eieruhr) 8

Lösung 26 (Zustandsdiagramm einer Digitaluhr) 9