Sie sind auf Seite 1von 5

Prof. Dr. A. Weber, Dr. G.

Kniesel
J. Tautges, P. Bihler oose.cs.uni-bonn.de

Universitt Bonn a Institut fr Informatik II u Institut fr Informatik III u 17.06.2008

Sommersemester 2008

Ubungen zur Vorlesung Objektorientierte Softwareentwicklung (BA-INF-024) Musterlsung zum Aufgabenblatt 10 o


Aufgabe 1 (Generics, Listen - 2 Punkte) Uberlegen Sie sich fr jede Aussage ein Argument, mit dem Sie eindeutig bestimmen knnen, ob die u o Aussage wahr oder falsch ist. Fr jede richtig angekreuzte Antwort werden 0,5 Punkte angerechnet, u fr jede falsch angekreuzte Antwort 0,5 Punkte abgezogen. Nicht angekreuzte Antworten geben u keinen Punktabzug. wahr X falsch X Alle Java-Klassen sind Unterklassen von java.lang.Object. Set<Object> ist Obertyp von Set<String>. Es besteht keine Typ-Beziehung zwischen verschiedenen Instanzen desselben generischen Typs fr verschiedene u konkrete Argumente. Der Zugri auf ein spezielles Element erfolgt in einer Liste schneller als in einem Array. Wahlfreier Zugri im Array vs. Durchhangeln durch die Elemente einer Liste. Anders als in Arrays lassen sich in Listen verschiedene Datentypen miteinander verknpfen. Auch Listen sind zunchst Aggregationen von Objekten u a desselben Typs, allerdings erlaubt die generische Programmierung die Verknpfung verschiedener Datentypen. u

Aufgabe 2 (Wildcard - 2 Punkte) Was versteht man im Zusammenhang mit Java Generics unter dem Begri Wildcard ? Musterlsung: Wildcards knnen als anonyme Typparameter verstanden werden: Parameter, die o o nicht weiter referenziert werden mssen. Wildcards als Lsung des Problems der Invarianz bei Geu o nerics (Ableitungsbeziehung zwischen Typargumenten ubertrgt sich nicht auf generische Klassen). a Beispiel fr Syntax: Box<?> b; u http://java.sun.com/docs/books/tutorial/java/generics/wildcards.html Aufgabe 3 (Listen - 10 Punkte) a) (6 Punkte) Erweitern Sie die in der Vorlesung vorgestellte Implementierung der Klasse TList um die Methoden get(int i), die das i -te Element der Liste zurckgibt, u delete(int i), die das i -te Element aus der Liste entfernt, insert(T elem, int i), die das Element elem an der i -ten Stelle der Liste einfgt. u Analog zur Array-Indizierung sei hierbei i = 0 die Position des ersten Listenelements. Behandeln Sie jeweils die Ausnahme, dass der Index i die Lnge der Liste ubersteigt! a Musterlsung: (bereits generisch) o
public T get(int i) { TNode<T> temp = head; try { for(int n = 0; n < i ; n++) temp = temp.next; return temp.getData(); }

catch (NullPointerException e) { System.out.println("get()::Index bersteigt Listenlnge!"); u a return null; } } public void delete(int i) { TNode<T> temp = head; if(i == 0) { this.head = this.head.next; return; } try { for(int n = 0; n < i - 1; n++) temp = temp.next; temp.next = temp.next.next; } catch (NullPointerException e) { System.out.println("delete()::Index bersteigt Listenlnge!"); u a } } public void insert(T elem, int i) { TNode<T> node = new TNode<T>(elem); TNode<T> temp = head; if(i == 0) { node.next = temp.next; this.head = node; return; } try { for(int n = 0; n < i-1 ; n++) temp = temp.next; node.next = temp.next; temp.next = node; } catch (NullPointerException e) { System.out.println("insert()::Index bersteigt Listenlnge!"); u a } }

b) (4 Punkte) Formen Sie die Klassen TNode und TList zu einer generischen Liste mit Typparameter um! Musterlsung: o
public class TList<T> { private TNode<T> head; public TList() { head = null; } // Anpassung der Methoden analog zu Aufgabe 3a) }

Aufgabe 4 (Matrizenmultiplikation - 11 Punkte) a) (5 Punkte) Implementieren Sie eine Klasse DoubleMatrix, die Matrizen allgemeiner Dimension von Zahlen vom Typ double reprsentiert. Es sollen also nicht nur quadratische Matrizen behandelt a werden knnen, sondern allgemeine Matrizen, die lineare Abbildungen von Rm Rn darstellen o (wobei R durch double approximiert wird und n und m positive Zahlen vom Typ int sind). Implementieren Sie eine Funktion matrixMult zur Durchfhrung der Matrizenmultiplikation! u Musterlsung: o

/** * Klasse zur Reprsentation allgemeiner Matrizen mit Eintrgen vom Typ Double a a * @author Paul Mller, Markus Schmitz, Aaron Schmischke, Jochen Tautges u */ public class DoubleMatrix { private int rows; private int columns; private double values[][]; public DoubleMatrix() { this.rows = 0; this.columns = 0; this.values = null; } public DoubleMatrix( int i ) { this( i, i ); } public DoubleMatrix( int zeilen, int spalten ) { this.rows = zeilen; this.columns = spalten; this.values = new double[zeilen][spalten]; } public DoubleMatrix( double values[][] ) { this.rows = values.length; this.columns = values[0].length; this.values = values; } /** * Funktion zur Multiplikation zweier allgemeiner Matrizen * @param mat allgemeine (mxn)-Matrix * @return Ergebnis einer Matrizenmultiplikation * @exception IllegalArgumentException bei inkompatibler Matrizendimensionen */ public DoubleMatrix matrixMult( DoubleMatrix mat ) { if( this.columns != mat.rows ) throw new IllegalArgumentException(); DoubleMatrix result = new DoubleMatrix( this.rows, mat.columns ); for( int i = 0; i < this.rows; i++ ) { for( int j = 0; j < mat.columns; j++ ) { result.values[i][j] = 0.0; for( int k = 0; k < this.columns; k++ ) result.values[i][j] += this.values[i][k] * mat.values[k][j]; } } return result; } public void setValue( int i, int j, double value ) { this.values[i][j] = value; } public double getValue( int i, int j ) { return this.values[i][j]; } public int getRows() { return this.rows; }

public int getColumns() { return this.columns; } /** * Funktion zur Ausgabe einer Matrix */ public void Print() { for( int i = 0; i < rows; i++ ) { for( int j = 0; j < columns; j++ ) { System.out.printf("%f\t",values[i][j]); } System.out.println(); } } }

b) (3 Punkte) Behandeln Sie die Ausnahme, dass die Operation wegen inkompatibler Dimensionen der Matrizen nicht durchgefhrt werden kann! Geben Sie als Teil der Ausnahmebehandlung eine u Fehlermeldung auf System.err aus! Dokumentieren Sie ihren Quellcode mit javadoc! Musterlsung: siehe Aufgabe 4 a) o c) (3 Punkte) Implementieren Sie eine Klasse GenericMatrix, welche dieselbe Funktionalitt besitzt a wie die Klasse DoubleMatrix, jedoch den Datentyp Matrix generisch (Zahltyp) realisiert. Musterlsung: o
public class GenericMatrix<T extends Number> { int rows; int columns; Number[][] values; // Konstruktoren ... public GenericMatrix( int zeilen, int spalten ) { this.rows = zeilen; this.columns = spalten; this.values = new Number[zeilen][spalten]; } public GenericMatrix( T values[][] ) { this.rows = values.length; this.columns = values[0].length; this.values = values; } public GenericMatrix<T> matrixMult( GenericMatrix<T> mat ) { if( this.columns != mat.rows ) throw new IllegalArgumentException(); GenericMatrix<T> result = new GenericMatrix<T>( this.rows, mat.columns ); for( int i = 0; i < this.rows; i++ ) { for( int j = 0; j < mat.columns; j++ ) { result.values[i][j] = 0.0; for( int k = 0; k < this.columns; k++ ) result.values[i][j] = result.values[i][j].doubleValue() + this.values[i][k].doubleValue() * mat.values[k][j].doubleValue(); } } return result; }

public void setValue( int i, int j, T value ) { this.values[i][j] = value; } public Number getValue( int i, int j ) { return this.values[i][j]; } ... }

Aufgabe 5 (Matrizenmultiplikation mit Multithreading - 6* Punkte) * Bonusaufgabe: Durch Lsen dieser Aufgabe knnen Sie sich zustzliche Bonuspunkte verdienen! o o a a) (4 Punkte) Bei der Multiplikation zweier Matrizen knnen oensichtlich alle Eintrge der Ergebo a nismatrix unabhngig voneinander berechnet werden. Nutzen Sie diese Erkenntnis aus und versuchen a Sie Ihre Implementierung aus der vorigen Aufgabe mithilfe von Multithreading zu beschleunigen! Musterlsung: (zur Verfgung gestellt von Paul Mller, Markus Schmitz, Aaron Schmischke) o u u
https://sewiki.iai.uni-bonn.de/ media/teaching/lectures/oose/2008/aufgaben/Blatt10Aufgabe05.rar

b) (2 Punkte) Ist es sinnvoll, fr jeden Eintrag der Ergebnismatrix einen eigenen Thread zu starten? u Oder lsst sich mit weniger Threads eine optimale Rechenzeit erreichen? Testen Sie verschiedene a Implementierungen und diskutieren Sie die Ergebnisse! Geben Sie an, wie viele Prozessoren die von Ihnen verwendeten Rechner besitzen! Hinweis: Den Zeitbedarf (in Millisekunden) eines Anweisungsblocks knnen Sie sich folgendermaen anzeigen lassen1 : o long tix = System.currentTimeMillis(); { ... // Anweisungen } System.out.println(System.currentTimeMillis()-tix); Musterlsung: (zur Verfgung gestellt von Paul Mller, Markus Schmitz, Aaron Schmischke) o u u

1 Die Genauigkeit hngt von der Aktualisierungsrate der Systemzeit und damit vom Betriebssystem ab. Um aussaa gekrftige Ergebnisse zu erzielen sollten Sie daher die Rechenzeiten fr groe Anzahlen an hintereinander ausgefhrten a u u Multiplikationen vergleichen.

Das könnte Ihnen auch gefallen