06.02.2015 Aufrufe

Lösungen - Lehr- und Forschungsgebiet Informatik 2

Lösungen - Lehr- und Forschungsgebiet Informatik 2

Lösungen - Lehr- und Forschungsgebiet Informatik 2

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 }

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!