OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th....

10
1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen Objekt können in einer Abbildung als Zuordnung von Attribut und zugehörigem Wert gespeichert werden: Objekt : Eigenschafts-Name Eigenschaftswert In Java können dazu Maps verwendet werden. Statt Maps können auch Klassen zur Modellierung von strukturierten Informationen verwendet werden. Angenommen wir haben folgenden Code in dem mit Informationen zu zwei Personen gearbeitet wird: package oop.blatt_10.aufgabe_1.vorgabe; import java.util.Map; import java.util.TreeMap; public class ZweiPersonen { private ZweiPersonen() {} public static void main(String[] args) { Map<String, String> hugo = new TreeMap<>(); Map<String, String> karla = new TreeMap<>(); Map<Integer, Map<String, String>> verzeichnis = new TreeMap<>(); hugo.put("name", "Balder"); hugo.put("vorname", "Hugo Egon"); hugo.put("telefon", "4711"); karla.put("name", "Kahl"); karla.put("vorname", "Karla"); karla.put("telefon", "4712"); verzeichnis.put(1, hugo); verzeichnis.put(2, karla); for (int nr: verzeichnis.keySet()) { Map<String, String> person = verzeichnis.get(nr); System.out.println("Person Nr. " + nr); for (String attr: person.keySet()) { String value = person.get(attr); System.out.println("\t" + attr + " -> " + value); } System.out.println(); } } }

Transcript of OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th....

Page 1: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

1

Prof. Dr. Th. Letschert

OOP Aufgabenblatt 10 15. Januar 2014

Aufgabe 1

Informationen zu einem beliebigen Objekt können in einer Abbildung als Zuordnung von Attribut und zugehörigem Wertgespeichert werden:

Objekt : Eigenschafts-Name→ Eigenschaftswert

In Java können dazu Maps verwendet werden.

Statt Maps können auch Klassen zur Modellierung von strukturierten Informationen verwendet werden.

Angenommen wir haben folgenden Code in dem mit Informationen zu zwei Personen gearbeitet wird:

package oop.blatt_10.aufgabe_1.vorgabe;

import java.util.Map;import java.util.TreeMap;

public class ZweiPersonen {

private ZweiPersonen() {}

public static void main(String[] args) {

Map<String, String> hugo = new TreeMap<>();Map<String, String> karla = new TreeMap<>();

Map<Integer, Map<String, String>> verzeichnis = new TreeMap<>();

hugo.put("name", "Balder");hugo.put("vorname", "Hugo Egon");hugo.put("telefon", "4711");

karla.put("name", "Kahl");karla.put("vorname", "Karla");karla.put("telefon", "4712");

verzeichnis.put(1, hugo);verzeichnis.put(2, karla);

for (int nr: verzeichnis.keySet()) {Map<String, String> person = verzeichnis.get(nr);System.out.println("Person Nr. " + nr);for (String attr: person.keySet()) {

String value = person.get(attr);System.out.println("\t" + attr + " -> " + value);

}System.out.println();

}}

}

Page 2: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

2

Stellen Sie diese Anwendung um auf eine objektorientierte Modellierung der Daten: Definieren Sie dazu die KlassenPerson und Verzeichnis und eine Klasse Main in der die Personen angelegt, das Verzeichnis gefüllt und der Inhaltdes Verzeichnisses ausgegeben wird.

Ihre Lösung sollte dabei folgende Main–Klasse umfassen:

package oop.blatt_10.aufgabe_1.loesung;

public class Main {

public static void main(String[] args) {Person hugo = new Person("Balder", "Hugo Egon", "4711");Person karla = new Person("Kahl", "Karla", "4712");

Verzeichnis.eintrage(1, hugo);Verzeichnis.eintrage(2, karla);

for (int nr: Verzeichnis.alleNr()) {Person person = Verzeichnis.hole(nr);System.out.println("Person Nr. " + nr + ": " + person);System.out.println();

}

}

}

Die beiden anderen Klassen sollen folgenden Vorgaben entsprechen:

package oop.blatt_10.aufgabe_1.loesung;

/*** Instanzen dieser Klasse modelliert Personen.

*/public class Person {

// ???

public Person(String name, String vorName, String telefon) {// ??

}

@Overridepublic String toString() {

// ??}

}

package oop.blatt_10.aufgabe_1.loesung;

import java.util.Map;import java.util.Set;import java.util.TreeMap;

/*** Diese Klasse modelliert ein Personenverzeichnis.

*/public class Verzeichnis {

private Verzeichnis() {}

Page 3: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

3

private static Map<Integer, Person> daten = new TreeMap<>();

public static void eintrage(int nr, Person person) {// ??

}

public static Person hole(int nr) {// ??

}

public static Set<Integer> alleNr() {// ???

}

}

Aufgabe 2

Betrachten Sie folgende Main-Klasse:

package oop.blatt_10.aufgabe_2;

public class Main {

public static void main(String[] args) {Person hugo = new Person("Balder", "Hugo Egon", "4711");Person karla = new Person("Kahl", "Karla", "4712");

Person karl = new Person("Dall", "Karl", "4713");Person cindy = new Person("von Marzan", "Cindy", "4714");

Verzeichnis programmierer = new Verzeichnis();Verzeichnis management = new Verzeichnis();

programmierer.eintrage(1, hugo);programmierer.eintrage(2, karla);

management.eintrage(1, karl);management.eintrage(2, cindy);

for (int nr: programmierer.alleNr()) {Person person = programmierer.hole(nr);System.out.println("Person Nr. " + nr + ": " + person);System.out.println();

}System.out.println();for (int nr: management.alleNr()) {

Person person = management.hole(nr);System.out.println("Person Nr. " + nr + ": " + person);System.out.println();

}

}

}

1. Definieren Sie – auf Basis der Lösung von Aufgabe 1 – zwei passende Klassen Person und Verzeichnis sodass diese Main–Klasse ausgeführt werden kann.

Page 4: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

4

2. Vergleichen Sie die Modellierung von Daten mit Hilfe von Klassen mit der mit Hilfe von Maps. Was sind jeweilsdie Vorteile, was die Nachteile, was die Unterschide und was die Gemeinsamkeiten?

3. Welchem Zweck dient die Methode toString. Wird dies in der API beschrieben? Wenn ja: wo? wenn nein:Suchen Sie weiter!

4. Was ist das Kennzeichen einer statischen Klasse?

5. Wann setzt man statische Klassen ein, wann nicht?

6. Was ist das Kennzeichen einer statischen Methode?

7. Wann setzt man statische Methoden ein, wann nicht?

Aufgabe 3

Objektorientierung mit Dingen aus der realen Welt wie Autos oder Kühen ist recht einfach. Leider werden Autos oderKühe nur selten in Software modelliert. (Software allein fährt nun mal nicht und gibt auch keine Milch). Im realen Lebenist es so, dass mindestens 99,9 Prozent aller Klassen sich mit Dingen befassen, die es nicht, oder nicht in dieser Form,real gibt. Hier ist die Frage, welche Methoden es geben soll und ob diese denn nun statisch oder nicht-statisch sein sollen,nicht offensichtlich, sondern eine Entwurfsentscheidung. Man kann es so oder so machen und die bessere Variante ist inder Regel von der Art der Nutzung abhängig.

Dies soll hier mit einer einfachen Polynomberechnung demonstriert und geübt werden.

Eine Polynomfunktion (kurz ein Polynom, auch ganzrationale Funktion) ist eine Funktion der Form:

p(x) =

n∑i=0

ai ∗ xi = an ∗ xn + an−1 ∗ xn−1 + · · · a1 ∗ x+ a0

Die Polynomfunktion wird durch die die Koeffizienten a0 · · · an bestimmt und dann kann der Wert des Polynoms an derStelle x berechnet werden.1

Zur Berechnung eines Polynoms hat ein “Informatiker” folgenden Code abgeliefert:2

package oop.blatt_10.aufgabe_3.vorgabe;

import javax.swing.JOptionPane;

public class Polynom {public double[] a;

public double valueAt(double x, double[] a) {double val = 0.0;for (double ai : a) {val = ai + val*x;

}return val;

}

public static void main(String[] args) {Polynom p = new Polynom();int grad = Integer.parseInt(

JOptionPane.showInputDialog("Grad des Polynoms ?"));p.a = new double[grad+1];for (int i=0; i<grad+1; i++) {String kS = JOptionPane.showInputDialog("Koeffizient " + i + " ?");kS = kS.replace(’,’, ’.’);

1Siehe bei Bedarf http://de.wikipedia.org/wiki/Polynom.2Das Beispiel zeigt echten, wirklich gefunden Code eines Erwachsenen mit der illusionären Vorstellung programmieren zu können!

Page 5: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

5

double k = Double.parseDouble(kS);p.a[i] = k;

}String xS = JOptionPane.showInputDialog("x ?");xS = xS.replace(’,’, ’.’);double x = Double.parseDouble(xS);JOptionPane.showMessageDialog(null, "Ergebnis. " + p.valueAt(x, p.a));

}

}

Unser “Informatiker” war leider mit den Prinzipien der Objektorientierung völlig überfordert. Zeigen Sie dass Sie esbesser können: Bringen Sie den Murks in Form.

Betrachten Sie dazu zunächst den Code und klassifizieren Sie seine Bestandteile Zeile für Zeile: was ist Benutzerinterak-tion und gehört in die Klasse Klasse UI und was ist Geschäfts–/Rechen–Logik und gehört in die Klasse Polynom.

Die Klasse Polynom kann auf unterschiedliche Art gestaltet werden:

1. Eine statische Klasse Polynom_A ohne Konstruktor und mit einer einer einzigen statischen Methode value, diedie Koeffizienten und x als Parameter hat und den Polynomwert berechnet.

2. Eine statische Klasse Polynom_B mit einer statischen Methode init die die Koeffizienten des Polynoms an-nimmt und speichert und und einer statischen Methode valueAt zur Berechnung des Polynomwertes an der Stellex.

3. Eine Klasse Polynom_C mit einem Konstruktor der die Koeffizienten des Polynoms annimmt und speichert undund einer Methode valueAt zur Berechnung des Polynomwertes an der Stelle x.

4. Eine Klasse Polynom_D mit einem Konstruktor der den x annimmt und speichert und und einer MethodevalueWith zur Berechnung des Polynomwertes mit Hilfe der übergebenen Koeffizienten.

Implementieren Sie jede dieser Varianten mit passender Benutzerinteraktion UI_A ... UI_D (siehe Vorgabe).

Erläutern Sie den Ablauf einer Berechnung bei jeder Varianten: Welche Klassen und Objekte sind zur Laufzeit im Speichervorhanden?

Erläutern Sie welche Variante unter welchen Umständen (oder eventuell auch niemals) sinnvoll ist.

Aufgabe 4

Beim Entwurf einer Klasse hat man immer die Wahl zwischen

• Klasse mit Zustand

• Klasse ohne Zustand

Eine Klasse ohne Zustand merkt sich nichts. Sie hat nur Methoden, keine Variablen. Warum sollte eine Klasse ohneZustand immer statisch sein? Oder: wenn ein Klasse nur Methoden enthält, warum sollten diese dann immer statischsein?

Bei einer Klasse mit Zustand hat man die Wahl zwischen

• statisch (Zustandsinformation in der Klasse (im Klassenobjekt) und

• nicht–statisch (Zustandsinformation in den Exemplaren)

Eine nicht–statische Klasse enthält mindestens eine Methode die nicht statisch ist. Eine Klasse sollte dann und nur dannnicht–statisch sein, wenn sie etwas modelliert das in beliebig vielen Exemplaren existieren kann. Warum? Erläutern Sie.

Page 6: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

6

Aufgabe 5 – Hausaufgabe Nr 8 (klein)

Eine zweistellige Relation über einer Menge M ist eine Teilmenge des kartesischen Produkts M ×M . Eine Relationüber Strings kann in Java mit Hilfe des Datentyps Set<Paar> implementiert werden. Der Typ Paar repräsentiert dabeiPaare (= Tupel der Länge 2).

Wenn noch spezielle Operationen für Relationen hinzukommen, dann kann eine Klasse Relation als “Hülle” umSet<Paar>definiert werden:

package oop.blatt_10.aufgabe_5;

import java.util.Set;import java.util.TreeSet;

public class Relation {

public static class Paar implements Comparable<Paar> {private int left;private int right;

public Paar(int left, int right) {this.left = left;this.right = right;

}public int getLeft() {

return left;}public int getRight() {

return right;}

@Overridepublic boolean equals (Object o) {

if (o == null) { return false; }if (this == o) { return true; }if (! (o instanceof Paar)) {

return false;}Paar that = (Paar) o;return this.left == that.left && this.right == that.right;

}

@Overridepublic int compareTo(Paar that) {

int v1 = this.left - that.left;return v1 != 0 ? v1 : this.right - that.right;

}

@Overridepublic String toString() {

return "(" + left + ", " + right + ")";}

}

private Set<Paar> pairSet = new TreeSet<>();

/*** Erzeuge eine leere Relation.

* @param s

Page 7: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

7

*/public Relation() {

pairSet = new TreeSet<Paar>();}

/*** Erzeugt eine Relation aus einer Paarmenge.

* @param s die Paarmenge

*/private Relation(Set<Paar> s) {

pairSet = new TreeSet<Paar>(s);}

/*** Erweitert eine Relation um ein weiteres Paar.

* @param p das Paar.

* @return die Relation selbst

* @post this ist um p erweitert

*/public Relation add(Paar p) {

pairSet.add(p);return this;

}

@Overridepublic String toString() {

return pairSet.toString();}

@Overridepublic boolean equals(Object o) {

if (o == null) { return false; }if (this == o) { return true; }if (!(o instanceof Relation)) { return false; }Relation that = (Relation) o;return this.pairSet.equals(that.pairSet);

}

/*** Berechnet die Verknuepfung dieser mit einer anderen Relation.

* @param that die andere Relation

* @return this kringel that

*/public Relation kringel(Relation that) {

// TODO implementierenreturn null;

}

/*** Berechnet das Inverse dieser Relation.

* @return die inverse Relation zu this.

*/public Relation invers() {

// TODO implementierenreturn null;

}

/*** Berechnet die reflexive Huelle dieser Relation.

* @return die reflexive Huelle von this.

*/

Page 8: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

8

public Relation hReflexiv() {// TODO implementierenreturn null;

}

/*** Berechnet die Vereinigung dieser mit einer anderen Relationen.

* @return this vereinigt mit that.

*/public Relation vereinigt(Relation that) {

Relation res = new Relation(pairSet);res.pairSet.addAll(that.pairSet);return res;

}

/*** Berechnet die transitive Huelle dieser Relation.

* @return die transitive Huelle von this.

*/public Relation hTransitiv() {

// TODO implementierenreturn null;

}

}

Füllen Sie die fehlenden Codeteile auf. Nutzen Sie dazu die Möglichkeiten der Typs Set!

Implementierten Sie die Operationen so einfach wie möglich! Es ist beispielsweise möglich und erlaubt sich einen Algo-rithmus zur Berechnung des transitiven Abschlusses zu ergugeln, es ist aber möglich, sinnvoller und es macht mehr Spaßdie mathematischen Definitionen (z.B. aus dem Mathematik-Skript) quasi direkt in Code umzusetzen! Bei Verständins-problemen sprechen Sie Ihren Mathe-Prof an!3

Ihre Lösung soll folgenden Testfall bestehen:

package oop.blatt_10.aufgabe_5;

import static org.junit.Assert.*;

import org.junit.Test;

public class RelationTest {

@Testpublic void test() {

Relation r = new Relation().add(new Relation.Paar(1, 2)).add(new Relation.Paar(1, 3)).add(new Relation.Paar(2, 3)).add(new Relation.Paar(2, 4)).add(new Relation.Paar(3, 1));

Relation s = new Relation().add(new Relation.Paar(2, 1)).add(new Relation.Paar(3, 1)).add(new Relation.Paar(3, 2))

3In den meisten Quellen die Sie eventuell im Internet oder an sonstigen Stellen finden, wird davon ausgegangen, dass Relationen mit Hilfe vonMatrizen selbst implementiert werden. Das ist bei kleinen Relationen und Anwendungen bei denen es nicht auf besonderen Effizient ankommt unnötig.Der Datentyp Set kann bereits vieles das nicht mehr mühsam und fehlerträchtig nach-implementiert werden muss.

Page 9: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

9

.add(new Relation.Paar(4, 2));

Relation t = new Relation().add(new Relation.Paar(1, 1)).add(new Relation.Paar(1, 2)).add(new Relation.Paar(2, 1)).add(new Relation.Paar(2, 2));

assertEquals(t, r.kringel(s)); // assert 1

r = new Relation().add(new Relation.Paar(1, 3)).add(new Relation.Paar(2, 1)).add(new Relation.Paar(2, 2)).add(new Relation.Paar(2, 3)).add(new Relation.Paar(4, 4));

t = new Relation().add(new Relation.Paar(1, 2)).add(new Relation.Paar(2, 2)).add(new Relation.Paar(3, 1)).add(new Relation.Paar(3, 2)).add(new Relation.Paar(4, 4));

assertEquals(t, r.invers()); // assert 2

r = new Relation().add(new Relation.Paar(1,2)).add(new Relation.Paar(2,3)).add(new Relation.Paar(2,5)).add(new Relation.Paar(3,4)).add(new Relation.Paar(4,6)).add(new Relation.Paar(5,4));

t = new Relation().add(new Relation.Paar(1, 2)).add(new Relation.Paar(1, 3)).add(new Relation.Paar(1, 4)).add(new Relation.Paar(1, 5)).add(new Relation.Paar(1, 6)).add(new Relation.Paar(2, 3)).add(new Relation.Paar(2, 4)).add(new Relation.Paar(2, 5)).add(new Relation.Paar(2, 6)).add(new Relation.Paar(3, 4)).add(new Relation.Paar(3, 6)).add(new Relation.Paar(4, 6)).add(new Relation.Paar(5, 4)).add(new Relation.Paar(5, 6));

assertEquals(t, r.hTransitiv()); // assert 3

assertEquals( // assert 4r.hReflexiv().hTransitiv(),r.hTransitiv().hReflexiv() );

assertEquals( // assert 5t.vereinigt(

new Relation().add(new Relation.Paar(1,1)).add(new Relation.Paar(2,2)).add(new Relation.Paar(3,3))

Page 10: OOP Aufgabenblatt 10 - homepages.thm.dehg51/Veranstaltungen/OOP_WS13_14/... · 1 Prof. Dr. Th. Letschert OOP Aufgabenblatt 10 15. Januar 2014 Aufgabe 1 Informationen zu einem beliebigen

10

.add(new Relation.Paar(4,4))

.add(new Relation.Paar(5,5))

.add(new Relation.Paar(6,6))),r.hTransitiv().hReflexiv()

);}

}

Bitte gestalten Sie Ihre Lösung als Erweiterung der Vorgabe und so dass der vorgegebene Testfall bestanden wird.

Ausgabe: 6.1.2014

Abgabe: 21.1.2014

Lernziele: Klassenentwurf, Datenmodellierung mit Klassen und Kollektionstypen.

Bewertungskriterien:0 Punkte keine Abgabe oder Abgabe mit formalen Mängeln (kein Quellcode oder nicht ausführbar).

je 2 Punkte für jeden der 5 Assert–Tests, der bestanden wird.