Lösungen - Lehr- und Forschungsgebiet Informatik 2
Lösungen - Lehr- und Forschungsgebiet Informatik 2
Lösungen - Lehr- und Forschungsgebiet Informatik 2
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
RHEINISCH-<br />
WESTFÄLISCHE<br />
TECHNISCHE<br />
HOCHSCHULE<br />
AACHEN<br />
LEHR- UND FORSCHUNGSGEBIET<br />
INFORMATIK 2<br />
RWTH Aachen · D-52056 Aachen · GERMANY<br />
http://programmierung.informatik.rwth-aachen.de<br />
LuFG<br />
<strong>Informatik</strong> II<br />
Prof. Dr. Jürgen Giesl<br />
Carsten Fuhs, Peter Schneider-Kamp, Stephan Swiderski<br />
Übung Programmierung WS 2007/08 - Blatt 8<br />
(Lösungsvorschlag)<br />
Aufgabe 1<br />
a)<br />
OUT a.x ((B)a).y b.y<br />
1 4 2<br />
2 2 2<br />
3 2 -2<br />
4 -3 3 3<br />
Es gilt im Folgenden: a.x = b.x = x, da x eine statische Variable der Klasse A<br />
ist. Die in Kästchen dargestellten Ergebnisse sind jeweilige Endergebnisse der<br />
Teilaufgaben.<br />
• Zu OUT 1:<br />
Aufruf des Konstruktors von B mit Argument 5 ⇒<br />
– super(-2) ⇒ x = x + (-2) = -1<br />
– y += x ⇒ y = y + x = 3 + (-1) = 2<br />
– x += z ⇒ x = x + 5 = 4<br />
• Zu OUT 2:<br />
Es wird ((B)a).f(2); ausgeführt. ⇒<br />
Die Typkonversion (B)a ist für die Frage, welche Methodenimplementierung<br />
verwendet wird, unerheblich. Es wird die Methode A.f(int z) mit<br />
Argument 2 aufgerufen. ⇒<br />
x = z; ⇒ x = 2
• Zu OUT 3:<br />
Es wird a = a.toB(); ausgeführt, also wird die Methode toB() aus der<br />
Klasse A auf dem Objekt a aufgerufen. ⇒<br />
– B b = new B(x); ⇒ Aufruf des Konstruktors von B mit Argument 2<br />
⇒<br />
∗ super(-2) ⇒ x = x - 2 = 0<br />
∗ y += x ⇒ y = y + x = 3 + 0 = 3<br />
∗ x += z ⇒ x = x + 2 = 2<br />
– b.y = (int)this.y; ⇒ b.y = (int) a.y = (int) -2.0 = -2<br />
Hier wird auf der rechten Seite der Zuweisung das Attribut y aus der<br />
Klasse A betrachtet. Der double-Wert -2.0 wird explizit nach int<br />
konvertiert <strong>und</strong> als -2 dem Attribut B.y des Objektes zugewiesen,<br />
das in toB() mit b bezeichnet ist.<br />
Die folgende Anweisung return this; <strong>und</strong> die Zuweisung der Rückgabewertes<br />
von a.toB() an a bewirken, dass a nun auf in toB() erzeugte<br />
Objekt zeigt, also a.y = -2<br />
• Zu OUT 4:<br />
Es werden folgende Anweisungen ausgeführt:<br />
– B b = new B(-3); ⇒<br />
∗ super(-2) ⇒ x = x - 2 = 0<br />
∗ y += x ⇒ y = y + x = 3 + 0 = 3<br />
∗ x += z ⇒ x = x + (-3) = -3<br />
– a = b ⇒ a zeigt nun auf b.<br />
b) Das Programm beinhaltet folgende Compilierfehler:<br />
• B r = new A();<br />
Einem Objekt der UnterklasseB kann kein Objekt einer seiner Oberklassen<br />
(hier: A) zugewiesen werden.<br />
• int i = s.y;<br />
Der Wert des Attributes s.y hat den Typ double <strong>und</strong> kann ohne explizite<br />
Konvertierung nicht einer int-Variablen zugewiesen werden.<br />
• Dem implizit angelegten Konstruktor C() fehlt der implizit aufgerufene<br />
Konstruktor B() der Oberklasse.
Aufgabe 2<br />
a)
)<br />
Listing 1: Gewaesser.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Gewaesser modelliert ein Gewaesser , welches<br />
3 ∗ ueber seinen Namen i d e n t i f i z i e r t wird.<br />
4 ∗<br />
5 ∗ Erstellt : 10.12.2007 <br />
6 ∗ Letzte Aenderung : 11.12.2007 <br />
7 ∗<br />
8 ∗ @author Carsten Fuhs<br />
9 ∗/<br />
10 public class Gewaesser {<br />
11<br />
12 /∗ Die Klasse Gewaesser s o l l t e sinnvollerweise abstrakt sein , jedoch war<br />
13 ∗ dieses Konzept zum Zeitpunkt der Aufgabenstellung noch nicht in<br />
14 ∗ der Vorlesung behandelt worden .<br />
15 ∗/<br />
16<br />
17 // Name des Gewaessers<br />
18 private String name ;<br />
19<br />
20 /∗∗<br />
21 ∗ Erzeugt ein neues Gewaesser mit dem Namen name.<br />
22 ∗<br />
23 ∗ @param name Name fuer das neue Gewaesser<br />
24 ∗/<br />
25 public Gewaesser (String name ) {<br />
26 this .name = name ;<br />
27 }<br />
28<br />
29 /∗∗<br />
30 ∗ @return den Namen des aktuellen Gewaessers<br />
31 ∗/<br />
32 public String getName () {<br />
33 return this .name ;<br />
34 }<br />
35<br />
36 /∗∗<br />
37 ∗ Berechnet die Anzahl von Meeren in einem Array .<br />
38 ∗<br />
39 ∗ @param gs Array von Gewaessern<br />
40 ∗ @return wieviele der Elemente von gs vom Typ<br />
41 ∗ Meer sind<br />
42 ∗/<br />
43 public static int anzahlMeere (Gewaesser [ ] gs ) {<br />
44 int ergebnis = 0;<br />
45 for ( int i = 0; i < gs .length ; i++) {<br />
46 if (gs [i] instanceof Meer ) {<br />
47 ergebnis++;
48 }<br />
49 }<br />
50 return ergebnis ;<br />
51 }<br />
52<br />
53 /∗∗<br />
54 ∗ Gibt das Gewaesser zurueck , in dem das Wasser des aktuellen Gewaessers<br />
55 ∗ l e t z t l i c h endet .<br />
56 ∗<br />
57 ∗ @return das Gewaesser , in dem das Wasser des aktuellen Gewaessers<br />
58 ∗ l e t z t l i c h endet<br />
59 ∗/<br />
60 protected Gewaesser senke () {<br />
61 return this ;<br />
62 }<br />
63<br />
64 /∗∗<br />
65 ∗ @return eine textuelle Repraesentation des aktuellen Gewaessers ,<br />
66 ∗ aus der alle Attribute hervorgehen .<br />
67 ∗/<br />
68 public String toString () {<br />
69 return ”Das Gewaesser heisst ” + this .name ;<br />
70 }<br />
71<br />
72 /∗∗<br />
73 ∗ @param g mit dem aktuellen Gewaesser auf Gleichheit zu<br />
74 ∗ ueberpruefen<br />
75 ∗ @return ob das aktuelle Gewaesser gleich g is t ;<br />
76 ∗ als Kriterium wird hier allein der Name verwendet<br />
77 ∗/<br />
78 protected boolean gleich (Gewaesser g) {<br />
79 return g != null && this .name .equals (g .name ) ;<br />
80 }<br />
81 }<br />
Listing 2: Stehgewaesser.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Stehgewaesser modelliert ein Stehgewaesser.<br />
3 ∗<br />
4 ∗ Erstellt : 10.12.2007 <br />
5 ∗ Letzte Aenderung : 11.12.2007 <br />
6 ∗<br />
7 ∗ @author Carsten Fuhs<br />
8 ∗/<br />
9 public class Stehgewaesser extends Gewaesser {<br />
10<br />
11 /∗ Die Klasse Stehgewaesser s o l l t e sinnvollerweise abstrakt sein , jedoch<br />
12 ∗ war dieses Konzept zum Zeitpunkt der Aufgabenstellung noch nicht in<br />
13 ∗ der Vorlesung behandelt worden .<br />
14 ∗/
15<br />
16 // die Flaeche des Stehgewaessers<br />
17 private double flaeche ;<br />
18<br />
19 // enthaelt das Stehgewaesser salzwasser<br />
20 private boolean salzwasser ;<br />
21<br />
22 /∗∗<br />
23 ∗ Erzeugt ein neues Stehgewaesser .<br />
24 ∗<br />
25 ∗ @param name Name fuer das neue Gewaesser<br />
26 ∗ @param flaeche Oberflaeche des neuen Stehgewaessers<br />
27 ∗ @param salzwasser Enthaelt das neue Gewaesser Salzwasser<br />
28 ∗/<br />
29 public Stehgewaesser (String name , double flaeche , boolean salzwasser ) {<br />
30 super(name ) ;<br />
31 this . flaeche = flaeche ;<br />
32 this . salzwasser = salzwasser ;<br />
33 }<br />
34<br />
35 public String toString () {<br />
36 return super .toString () + ” , hat die Flaeche ” + this .flaeche +<br />
37 ” qkm, enthaelt ” + ( this .salzwasser ”” : ”kein ”) + ” Salzwasser” ;<br />
38 }<br />
39 }<br />
Listing 3: Fluss.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Fluss modelliert einen Fluss .<br />
3 ∗<br />
4 ∗ Erstellt : 10.12.2007 <br />
5 ∗ Letzte Aenderung : 11.12.2007 <br />
6 ∗<br />
7 ∗ @author Carsten Fuhs<br />
8 ∗/<br />
9 public class Fluss extends Gewaesser {<br />
10<br />
11 /∗ Die Klasse Fluss s o l l t e sinnvollerweise abstrakt sein , jedoch war<br />
12 ∗ dieses Konzept zum Zeitpunkt der Aufgabenstellung noch nicht in<br />
13 ∗ der Vorlesung behandelt worden .<br />
14 ∗/<br />
15<br />
16 // Laenge des Flusses in km<br />
17 private int laenge ;<br />
18<br />
19 /∗∗<br />
20 ∗ Erzeugt einen neuen Fluss .<br />
21 ∗<br />
22 ∗ @param name Name des Flusses<br />
23 ∗ @param laenge Laenge des Flusses in km
24 ∗/<br />
25 public Fluss (String name , int laenge ) {<br />
26 super(name ) ;<br />
27 this .laenge = laenge ;<br />
28 }<br />
29<br />
30 /∗∗<br />
31 ∗ @param f ein weiterer Fluss ; darf nicht null sein<br />
32 ∗ @return ob der aktuelle Fluss die gleiche Senke hat wie der Fluss<br />
33 ∗ f <br />
34 ∗/<br />
35 public boolean fliesstInGleicheSenkeAb (Fluss f) {<br />
36 Gewaesser ziel1 , ziel2 ;<br />
37 ziel1 = this .senke ( ) ;<br />
38 ziel2 = f .senke ( ) ;<br />
39 return ziel1 .gleich (ziel2 ) ;<br />
40 }<br />
41<br />
42 public String toString () {<br />
43 return super .toString () + ” , i s t ein Fluss der Laenge ” +<br />
44 this .laenge + ” km” ;<br />
45 }<br />
46 }<br />
Listing 4: Binnensee.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Binnensee modelliert einen Binnensee.<br />
3 ∗<br />
4 ∗ Erstellt : 10.12.2007 <br />
5 ∗ Letzte Aenderung : 11.12.2007 <br />
6 ∗<br />
7 ∗ @author Carsten Fuhs<br />
8 ∗/<br />
9 public class Binnensee extends Stehgewaesser {<br />
10<br />
11 // Ist der Binnensee kuenstlich<br />
12 private boolean kuenstlich ;<br />
13<br />
14 /∗∗<br />
15 ∗ Erzeugt einen Binnensee .<br />
16 ∗<br />
17 ∗ @param name Name des neuen Binnensees<br />
18 ∗ @param flaeche Oberflaeche des neuen Binnensees in qkm<br />
19 ∗ @param salzwasser Ist das Wasser des neuen Binnensees Salzwasser<br />
20 ∗ @param kuenstlich Ist der neue Binnensee kuenstlich<br />
21 ∗/<br />
22 public Binnensee (String name , double flaeche ,<br />
23 boolean salzwasser , boolean kuenstlich ) {<br />
24 super(name , flaeche , salzwasser ) ;<br />
25 this . kuenstlich = kuenstlich ;
26 }<br />
27<br />
28 public String toString () {<br />
29 return super .toString () + ” <strong>und</strong> i s t ein ” +<br />
30 ( this .kuenstlich ” kuenstlicher ” : ” natuerlicher ”) +<br />
31 ”Binnensee ” ;<br />
32 }<br />
33 }<br />
Listing 5: Meer.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Meer modelliert ein Meer.<br />
3 ∗<br />
4 ∗ Erstellt : 10.12.2007 <br />
5 ∗ Letzte Aenderung : 11.12.2007 <br />
6 ∗<br />
7 ∗ @author Carsten Fuhs<br />
8 ∗/<br />
9 public class Meer extends Stehgewaesser {<br />
10<br />
11 // der Salzgehalt des Meeres<br />
12 private double salzwasser ;<br />
13<br />
14 /∗∗<br />
15 ∗ Erzeugt ein neues Meer.<br />
16 ∗<br />
17 ∗ @param name Name fuer das neue Meer<br />
18 ∗ @param flaeche Oberflaeche des neuen Meeres in qkm<br />
19 ∗ @param salzwasser Salzgehalt des neuen Meeres in Prozent<br />
20 ∗/<br />
21 public Meer (String name , double flaeche , double salzwasser ) {<br />
22 super(name , flaeche , true ) ;<br />
23 this . salzwasser = salzwasser ;<br />
24 }<br />
25<br />
26 public String toString () {<br />
27 return super .toString () + ” <strong>und</strong> i s t ein Meer mit ”<br />
28 + this . salzwasser + ”% Salzgehalt ” ;<br />
29 }<br />
30 }<br />
Listing 6: Hauptfluss.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Hauptfluss modelliert einen Fluss ,<br />
3 ∗ der in ein Stehgewaesser muendet.<br />
4 ∗<br />
5 ∗ Erstellt : 10.12.2007 <br />
6 ∗ Letzte Aenderung : 11.12.2007 <br />
7 ∗
8 ∗ @author Carsten Fuhs<br />
9 ∗/<br />
10 public class Hauptfluss extends Fluss {<br />
11<br />
12 // dort muendet der Hauptfluss<br />
13 private Stehgewaesser ziel ;<br />
14<br />
15 /∗∗<br />
16 ∗ Erzeugt einen neuen Hauptfluss .<br />
17 ∗<br />
18 ∗ @param name Name des Hauptflusses<br />
19 ∗ @param laenge Laenge des Hauptflusses in km<br />
20 ∗ @param z i e l Dort muendet der Hauptfluss .<br />
21 ∗/<br />
22 public Hauptfluss (String name , int laenge , Stehgewaesser ziel ) {<br />
23 super(name , laenge ) ;<br />
24 this .ziel = ziel ;<br />
25 }<br />
26<br />
27 protected Gewaesser senke () {<br />
28 return this .ziel .senke ( ) ;<br />
29 }<br />
30<br />
31 /∗∗<br />
32 ∗ @return die Flussordnungszahl des aktuellen Hauptflusses<br />
33 ∗/<br />
34 public int floz () {<br />
35 return 1;<br />
36 }<br />
37<br />
38 public String toString () {<br />
39 return super .toString () + ” <strong>und</strong> muendet als Hauptfluss in das Stehgewaesser ” +<br />
40 this .ziel . getName ( ) ;<br />
41 }<br />
42 }<br />
Listing 7: Nebenfluss.java<br />
1 /∗ ∗<br />
2 ∗ Die Klasse Nebenfluss modelliert einen Fluss ,<br />
3 ∗ der in einen anderen Fluss muendet.<br />
4 ∗<br />
5 ∗ Erstellt : 10.12.2007 <br />
6 ∗ Letzte Aenderung : 11.12.2007 <br />
7 ∗<br />
8 ∗ @author Carsten Fuhs<br />
9 ∗/<br />
10 public class Nebenfluss extends Fluss {<br />
11<br />
12 // der Fluss , in den der aktuelle Fluss muendet<br />
13 private Fluss ziel ;
14<br />
15 /∗∗<br />
16 ∗ Erzeugt einen neuen Nebenfluss .<br />
17 ∗<br />
18 ∗ @param name Name des neuen Nebenflusses<br />
19 ∗ @param laenge Laenge des neuen Nebenflusses<br />
20 ∗ @param z i e l Dort muendet der neue Nebenfluss .<br />
21 ∗/<br />
22 public Nebenfluss (String name , int laenge , Fluss ziel ) {<br />
23 super(name , laenge ) ;<br />
24 this .ziel = ziel ;<br />
25 }<br />
26<br />
27 /∗∗<br />
28 ∗ @return in welches Stehgewaesser der aktuelle Fluss a b f l i e s s t<br />
29 ∗/<br />
30 protected Gewaesser senke () {<br />
31 return this .ziel .senke ( ) ;<br />
32 }<br />
33<br />
34 /∗∗<br />
35 ∗ @return die Flussordnungszahl des aktuellen Nebenflusses<br />
36 ∗/<br />
37 public int floz () {<br />
38 int flozVonZiel = 0;<br />
39 if ( this .ziel instanceof Hauptfluss ) {<br />
40 flozVonZiel = ((Hauptfluss ) this .ziel ) . floz ( ) ;<br />
41 }<br />
42 else if ( this .ziel instanceof Nebenfluss ) {<br />
43 flozVonZiel = ((Nebenfluss ) this .ziel ) . floz ( ) ;<br />
44 }<br />
45 return 1 + flozVonZiel ;<br />
46 /∗ Diese Methode is t mit einer /abstrakten/ Methode<br />
47 ∗ int floz ()<br />
48 ∗ in der Klasse Fluss wesentlich eleganter in einer Zeile<br />
49 ∗ zu implementieren:<br />
50 ∗ return 1 + this . z i e l . f l oz ();<br />
51 ∗/<br />
52 }<br />
53<br />
54 public String toString () {<br />
55 return super .toString () + ” <strong>und</strong> muendet als Nebenfluss in den Fluss ” +<br />
56 this .ziel . getName ( ) ;<br />
57 }<br />
58 }