Sie sind auf Seite 1von 5

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

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

Sommersemester 2008

¨

Universit¨at Bonn Institut fur¨ Informatik II Institut fur¨ Informatik III

17.06.2008

Ubungen zur Vorlesung Objektorientierte Softwareentwicklung (BA-INF-024) Musterl¨osung zum Aufgabenblatt 10

Aufgabe 1 (Generics, Listen - 2 Punkte)

¨

Uberlegen Sie sich fur¨ jede Aussage ein Argument, mit dem Sie eindeutig bestimmen k¨onnen, ob die Aussage wahr oder falsch ist. Fur¨ jede richtig angekreuzte Antwort werden 0,5 Punkte angerechnet, fur¨ jede falsch angekreuzte Antwort 0,5 Punkte abgezogen. Nicht angekreuzte Antworten geben keinen Punktabzug.

wahr

falsch

 

X

 

Alle Java-Klassen sind Unterklassen von java.lang.Object.

 

X

Set<Object> ist Obertyp von Set<String>. Es besteht keine Typ-Beziehung zwischen verschiedenen Instanzen desselben generischen Typs fur¨ verschiedene konkrete Argumente.

 

X

Der Zugriff auf ein spezielles Element erfolgt in einer Liste schneller als in ei- nem Array. Wahlfreier Zugriff im Array vs. Durchhangeln durch die Elemente einer Liste.

   

Anders als in Arrays lassen sich in Listen verschiedene Datentypen mitein- ander verknupfen.¨ Auch Listen sind zun¨achst Aggregationen von Objekten desselben Typs, allerdings erlaubt die generische Programmierung die Ver- knupfung¨ verschiedener Datentypen.

Aufgabe 2 (Wildcard - 2 Punkte) Was versteht man im Zusammenhang mit Java Generics unter dem Begriff Wildcard ? Musterl¨osung: Wildcards k¨onnen als anonyme Typparameter verstanden werden: Parameter, die nicht weiter referenziert werden mussen.¨ Wildcards als L¨osung des Problems der Invarianz bei Ge- nerics (Ableitungsbeziehung zwischen Typargumenten ubertr¨ ¨agt sich nicht auf generische Klassen). Beispiel fur¨ Syntax: Box<?> b;

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

delete(int

insert(T

i), die das i -te Element der Liste zuruckgibt,¨

elem,

i), die das i -te Element aus der Liste entfernt,

int

i), die das Element elem an der i -ten Stelle der Liste einfugt.¨

Analog zur Array-Indizierung sei hierbei i = 0 die Position des ersten Listenelements. Behandeln Sie jeweils die Ausnahme, dass der Index i die L¨ange der Liste ubersteigt!¨ Musterl¨osung: (bereits generisch)

public

T

get(int

i)

{

TNode<T>

temp

=

head;

 

try

{

for(int

n

=

0;

n

<

i

;

n++)

 

temp

=

temp.next;

 

return

temp.getData();

 

}

1

catch

(NullPointerException

e)

{

System.out.println("get()::Index

return

null;

}

¨ubersteigt

}

public

void

delete(int

i)

{

TNode<T>

if(i

==

temp

0)

{

=

head;

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)

{

Listenl¨ange!");

System.out.println("delete()::Index

¨ubersteigt

Listenl¨ange!");

}

}

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

¨ubersteigt

Listenl¨ange!");

}

}

b) (4 Punkte) Formen Sie die Klassen TNode und TList zu einer generischen Liste mit Typpara-

meter um!

Musterl¨osung:

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 repr¨asentiert. Es sollen also nicht nur quadratische Matrizen behandelt werden k¨onnen, sondern allgemeine Matrizen, die lineare Abbildungen von R m R n darstellen (wobei R durch double approximiert wird und n und m positive Zahlen vom Typ int sind). Imple- mentieren Sie eine Funktion matrixMult zur Durchfuhrung¨ der Matrizenmultiplikation!

Musterl¨osung:

2

/**

* Klasse

zur

Repr¨asentation

allgemeiner

Matrizen

mit

Eintr¨agen

vom

Typ

Double

*

@author

Paul

M¨uller,

Markus

Schmitz,

Aaron

Schmischke,

Jochen

Tautges

*/

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

DoubleMatrix

IllegalArgumentException();

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;

3

public

int

getColumns()

{

return

this.columns;

}

/**

*

*/

Funktion

public

for(

void

int

i

int

for(

zur

Ausgabe

einer

Matrix

Print()

i

=

0;

=

j

0;

{

<

j

rows;

<

i++

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 durchgefuhrt¨ werden kann! Geben Sie als Teil der Ausnahmebehandlung eine Fehlermeldung auf System.err aus! Dokumentieren Sie ihren Quellcode mit javadoc!

Musterl¨osung: siehe Aufgabe 4 a)

c) (3 Punkte) Implementieren Sie eine Klasse GenericMatrix, welche dieselbe Funktionalit¨at besitzt

wie die Klasse DoubleMatrix, jedoch den Datentyp Matrix generisch (Zahltyp) realisiert.

Musterl¨osung:

public

class

GenericMatrix<T

int

rows;

int

columns;

Number[][]

values;

//

Konstruktoren

public

GenericMatrix(

int

extends

zeilen,

Number>

{

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;

4

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 L¨osen dieser Aufgabe k¨onnen Sie sich zus¨atzliche Bonuspunkte verdienen!

a) (4 Punkte) Bei der Multiplikation zweier Matrizen k¨onnen offensichtlich alle Eintr¨age der Ergeb-

nismatrix unabh¨angig voneinander berechnet werden. Nutzen Sie diese Erkenntnis aus und versuchen Sie Ihre Implementierung aus der vorigen Aufgabe mithilfe von Multithreading zu beschleunigen!

Musterl¨osung: (zur Verfugung¨

gestellt von Paul Muller,¨

Markus Schmitz, Aaron Schmischke)

https://sewiki.iai.uni-bonn.de/ media/teaching/lectures/oose/2008/aufgaben/Blatt10Aufgabe05.rar

b) (2 Punkte) Ist es sinnvoll, fur¨ jeden Eintrag der Ergebnismatrix einen eigenen Thread zu starten?

Oder l¨asst sich mit weniger Threads eine optimale Rechenzeit erreichen? Testen Sie verschiedene Implementierungen und diskutieren Sie die Ergebnisse! Geben Sie an, wie viele Prozessoren die von Ihnen verwendeten Rechner besitzen! Hinweis: Den Zeitbedarf (in Millisekunden) eines Anweisungs- blocks k¨onnen Sie sich folgendermaßen anzeigen lassen 1 :

long

tix

=

System.currentTimeMillis();

{

 

//

Anweisungen

}

System.out.println(System.currentTimeMillis()-tix);

Musterl¨osung: (zur Verfugung¨ gestellt von Paul Muller,¨ Markus Schmitz, Aaron Schmischke)

von Paul Muller,¨ Markus Schmitz, Aaron Schmischke) 1 Die Genauigkeit h¨angt von der Aktualisierungsrate der

1 Die Genauigkeit h¨angt von der Aktualisierungsrate der Systemzeit und damit vom Betriebssystem ab. Um aussa-

große Anzahlen an hintereinander ausgefuhrten¨

gekr¨aftige Ergebnisse zu erzielen sollten Sie daher die Rechenzeiten fur¨ Multiplikationen vergleichen.

5