Objektorientierte Programmierung



Ähnliche Dokumente
Objektorientierte Programmierung

Objektorientierte Programmierung

Einführung in die Programmierung für Wirtschaftsinformatik

Java: Vererbung. Teil 3: super()

Einführung in die Programmierung

Java Einführung Collections

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

Studentische Lösung zum Übungsblatt Nr. 7

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

Objektorientierte Programmierung

Programmierkurs Java

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

Objektorientierte Programmierung. Kapitel 12: Interfaces

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

Programmieren in Java

Vorkurs C++ Programmierung

Algorithmen und Datenstrukturen

Übung Programmierung WS 2007/08 - Blatt 5

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

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

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Gebundene Typparameter

Objektorientierte Programmierung

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

368 4 Algorithmen und Datenstrukturen

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

Große Übung Praktische Informatik 1

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

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

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

PIWIN 1 Übung Blatt 5

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

Java-Schulung Grundlagen

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

3 Objektorientierte Konzepte in Java

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

Test-Driven Design: Ein einfaches Beispiel

Kapitel 6. Vererbung

Einführung in die Java- Programmierung

Prinzipien Objektorientierter Programmierung

Programmieren in Java

Kapitel 6. Vererbung

Speicherstrukturen. Aufgabe 1-1: Fragen zu FAT (File Allocation Table) Aufgabe 1-2: Datensätze variabler Länge. Kind.java:

Übungsblatt 3: Algorithmen in Java & Grammatiken

Java Kurs für Anfänger Einheit 5 Methoden

Kapitel 6. Vererbung

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

U08 Entwurfsmuster (II)

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

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

Folge 18 - Vererbung

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Einführung in die Programmierung

Informatik für Schüler, Foliensatz 23 Konstruktor, String-Methode und Heldenklassse

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

Client-Server-Beziehungen

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

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

1 Polymorphie (Vielgestaltigkeit)

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

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

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

Musterlösungen zur Klausur Informatik 3

Typumwandlungen bei Referenztypen

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Aufgabenblatt Nr. 5 Generizität und TicTacToe

Java Einführung Abstrakte Klassen und Interfaces

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

Computeranwendung und Programmierung (CuP)

SEP 114. Design by Contract

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

Einführung in die Java- Programmierung

Applet Firewall und Freigabe der Objekte

Arrays Fortgeschrittene Verwendung

5. Abstrakte Klassen

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Innere Klassen in Java

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

II.4.4 Exceptions - 1 -

Praktische Übung 'JUnit-Test'

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

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

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

Assoziation und Aggregation

Breiten- und Tiefensuche in Graphen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

Javakurs zu Informatik I. Henning Heitkötter

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Probeklausur: Programmierung WS04/05

Tagesprogramm

Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.

Programmiervorkurs SS 2011 Technische Universität Darmstadt Jan Hendrik Burdinski, Felix Kerger

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

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Transkript:

Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Übungsblatt 5 Lösungsvorschlag Objektorientierte Programmierung 22. 05. 2006 Lösung 9 (SMS-Eingabe am Handy mit Tries) Abstrakte Oberklasse der in T9 fuer Woerterbuecher verwendeten Tries; legt Schnittstelle fest und stellt die Hilfsmethode "tastezu" bereit. public abstract class T9Trie { Konversionsmethode: liefert Tastennummer zu Zeichen @param z das Zeichen @return die Nummer der Taste, auf der z liegt static public int tastezu (char z) { String belegung = "ABC " + // Taste 2 "DEF " + // Taste 3 "GHI " + // Taste 4 "JKL " + // Taste 5 "MNO " + // Taste 6 "PQRS" + // Taste 7 "TUV " + // Taste 8 "WXYZ"; // Taste 9 return belegung.indexof(z) / 4 + 2; public String prefix (int tabs) { String erg = ""; for (int i = 0; i < tabs; i++) erg += " "; return erg; public abstract String tostring(int tabs); public String tostring() { return tostring(0); 1

Mit Tastenfolge vertraegliche Woerter bestimmen. @param tastenfolge die Tastenfolge als int-array @param ab Index, ab dem Tastenfolge noch zu bearbeiten ist. @return Liste der vertraeglichen Woerter public abstract List suchen (int[] tastenfolge, int ab); Neues Wort in Woerterbuch eintragen. @param wort das einzutragende Wort als String @param ab Index, ab dem wort noch zu bearbeiten ist. @return Trie, der zusaetzlich wort enthaelt public abstract T9Trie eintragen (String wort, int ab); Iterator zu Trie erstellen und zurueckgeben. public abstract Iterator iterator (); ////////////////////////////////////////////////////////////////// Leere Tries - statt null verwenden! public class EmptyTrie extends T9Trie { Konstante, die das einzige EmptyTrie enthaelt und oeffentlich bereitstellt. public static final EmptyTrie LEER = new EmptyTrie(); Konstruktor fuer EmptyTrie-Objekte. Privat, um Singleton-Eigenschaft zu gewaehrleisten! private EmptyTrie () { Mit Tastenfolge vertraegliche Woerter bestimmen. @param tastenfolge die Tastenfolge als int-array @param ab Index, ab dem Tastenfolge noch zu bearbeiten ist. @return Liste der vertraeglichen Woerter public List suchen (int[] tastenfolge, int ab) { return new LinkedList(); 2

Neues Wort in Woerterbuch eintragen. @param wort das einzutragende Wort als String @param ab Index, ab dem wort noch zu bearbeiten ist. @return Trie, der zusaetzlich wort enthaelt public T9Trie eintragen (String wort, int ab) { T9Trie neu = new Trie(); neu = neu.eintragen (wort, ab); return neu; Iterator zu leerem Trie erstellen und zurueckgeben. public Iterator iterator () { return new EmptyTrieIterator(); public String tostring(int tabs) { return "[ emptytrie ]"; ////////////////////////////////////////////////////////////////// Klasse der inneren Knoten eines Tries. public class Trie extends T9Trie { private List wortliste; private T9Trie[] sohn; //sohn[i] wird ueber Taste i+2 erreicht getter fuer wortliste public List getwortliste() { return wortliste; getter fuer sohn public T9Trie[] getsohn() { return sohn; 3

Konstruktor fuer Trie-Objekte. Belegt alle Attribute entsprechend der Sicherheitsanforderung. public Trie() { wortliste = new LinkedList(); sohn = new T9Trie[8]; for (int i = 0; i < 8; i++) sohn[i] = EmptyTrie.LEER; Mit Tastenfolge vertraegliche Woerter bestimmen. @param tastenfolge die Tastenfolge als int-array @param ab Index, ab dem Tastenfolge noch zu bearbeiten ist. @return Liste der vertraeglichen Woerter public List suchen (int[] tastenfolge, int ab) { if (ab == tastenfolge.length) return wortliste; return sohn[tastenfolge[ab]-2].suchen(tastenfolge,ab+1); Neues Wort in Woerterbuch eintragen. @param wort das einzutragende Wort als String @param ab Index, ab dem wort noch zu bearbeiten ist. @return Trie, der zusaetzlich wort enthaelt public T9Trie eintragen (String wort, int ab) { if (ab == wort.length()) { wortliste.add(wort); return this; int i = tastezu(wort.charat(ab))-2; sohn[i] = sohn[i].eintragen(wort,ab+1); return this; Iterator zu Trie erstellen und zurueckgeben. public Iterator iterator () { return new TrieIterator(this); public String tostring(int tabs) { String erg = "[ {"; Iterator woerter = wortliste.iterator(); if (woerter.hasnext()) erg += woerter.next(); 4

while (woerter.hasnext()) erg += ","+woerter.next(); erg += "\n" + prefix(tabs); for (int i = 0; i < 7; i++) erg += (i+2) + ":" + sohn[i].tostring(tabs+1)+"\n" + prefix(tabs); erg += 9 + ":" + sohn[7].tostring(tabs+1); return erg; ////////////////////////////////////////////////////////////////// public class T9Test { public static void main(string[] args) { Trie mytrie = new Trie(); mytrie.eintragen ("VOM", 0); mytrie.eintragen ("TOM", 0); mytrie.eintragen ("VON", 0); mytrie.eintragen ("TON", 0); mytrie.eintragen ("UNO", 0); mytrie.eintragen ("AB", 0); mytrie.eintragen ("BAR", 0); // mytrie.eintragen ("BEATE", 0); // mytrie.eintragen ("LOTHAR", 0); // mytrie.eintragen ("DOMINIK", 0); System.out.println("myTrie iteriert:\n"+ "================"); Iterator it = mytrie.iterator(); while (it.hasnext()) { System.out.println(it.next()); //Ergebnis : // mytrie iteriert: // ================ // AB // BAR // BEATE // DOMINIK // LOTHAR // VOM // TOM // VON // TON // UNO 5

////////////////////////////////////////////////////////////////// Iterator fuer Klasse EmptyTrie. public class EmptyTrieIterator implements Iterator { Konstruktor fuer EmptyTrie-Iteratoren. EmptyTrieIterator () { public boolean hasnext() { return false; public String next() { return "FEHLER: EmptyTrieIterator.next() aufgerufen!"; public void remove() { ////////////////////////////////////////////////////////////////// Iterator fuer Klasse Trie. public class TrieIterator implements Iterator { Trie baum; Iterator akt; int bi; // Index des als naechstes zu betrachtenden Sohn-Iterators. Hilfsmethode: Findet den naechsten Iterator, der noch Elemente enthaelt - sofern es einen solchen gibt. private void finde() { while (bi < 8 &&! akt.hasnext()) { akt = ((T9Trie)baum.getSohn()[bi]).iterator(); bi++; Konstruktor fuer Trie-Iteratoren. TrieIterator (Trie b) { baum = b; akt = baum.getwortliste().iterator(); 6

bi = 0; finde(); // Evtl. hat akt keine Elemente... public boolean hasnext() { return akt.hasnext(); public String next() { String erg = (String) akt.next(); finde(); return erg; public void remove() { 7

Lösung 10 (Quadtrees) a) EmptyQuadTree enthält keine Attribute, da keine Unterknoten oder Informationen für Objekte dieser Klasse zu speichern sind. QuadTreeElement besitzt ein Koord-Attribut, um die Koordinate abzulegen. Weiterhin werden vier weitere Attribute für die Objekte der Unterbäume benötigt. Dieses können einerseits vier verschiedene Attribute oder andererseits ein Array sein. b) In dieser Graphik sind die EmptyQuadTree-Objekte nicht als schwarze Punkte gekennzeichnet. c) Zur Lösung wurde die Klasse QuadTree etwas erweitert: public abstract class QuadTree{ public final static QuadTree empty(){ return new EmptyQuadTree(); 8

public abstract boolean isempty(); public abstract QuadTree insert(koord newk); public abstract boolean contains(koord k); public abstract Iterator iterator(); public abstract String tostring(string ind); Die Klasse QuadTreeElement (mit Lösung aus d) ): public class QuadTreeElement extends QuadTree{ public Koord k; public QuadTree[] q; // // 1 0 // --------- // 2 3 // public QuadTreeElement(Koord k){ this.k = k; q = new QuadTree[4]; q[0] = empty(); q[1] = empty(); q[2] = empty(); q[3] = empty(); public QuadTree getsubtree(int number){ return q[number]; public boolean contains(koord k2){ if(k2 == null) return false; if(k2.equals(k)) return true; return q[insubtree(k2)].contains(k2); public boolean isempty(){ return false; public QuadTree insert(koord newk){ if(k.equals(newk)) return this; int quadrant = insubtree(newk); q[quadrant] = q[quadrant].insert(newk); return this; 9

private int insubtree(koord p){ if(p.getx()>=k.getx()){ if(p.gety()>=k.gety()) return 0; return 3; else{ if(p.gety()>=k.gety()) return 1; return 2; public Koord getkoord(){ return k; public Iterator iterator(){ return new QuadTreeIterator(this); public String tostring(string ind){ return ind+"quadtree:"+this.k.tostring()+ "\n"+q[0].tostring(ind+" ")+ "\n"+q[1].tostring(ind+" ")+ "\n"+q[2].tostring(ind+" ")+ "\n"+q[3].tostring(ind+" "); Die Klasse EmptyQuadTree: public class EmptyQuadTree extends QuadTree{ public EmptyQuadTree(){ super(); public boolean isempty(){ return true; public Iterator iterator(){ return new QuadTreeIterator(this); public QuadTree insert(koord newk){ return new QuadTreeElement(newK); public String tostring(string ind){ return ind+"empty"; public boolean contains(koord k) { return false; 10

d) siehe c) e) public class QuadTreeIterator implements Iterator { private int cursubtree; private Iterator currentiterator; private QuadTreeElement qt; public QuadTreeIterator(EmptyQuadTree qt) { this.qt = null; this.currentiterator = null; this.cursubtree = 5; public QuadTreeIterator(QuadTreeElement qt) { this.qt = qt; this.cursubtree = 0; this.currentiterator = qt.getsubtree(0).iterator(); public boolean hasnext() { return cursubtree!= 5; public void remove() { public Object next(){ if(!hasnext()) throw new NoSuchElementException(); // Alle SubTrees durchgelaufen => "qt" zurückgeben if(cursubtree == 4) { cursubtree++; return qt; if(currentiterator.hasnext()) return currentiterator.next(); else{ // aktueller Iterator leer => nächster SubTree cursubtree++; // Solange cursubtree einen vorhandenen SubTree // bezeichnet, den Iterator davon erzeugen if(cursubtree <= 3) currentiterator = qt.getsubtree(cursubtree).iterator(); // rekursiv diese Methode aufrufen return next(); 11