Objektorientierte Softwareentwicklung Sven Eric Panitz Übungsblatt 4 (13. November 2016) Aufgabe 1 Bei einem Rätsels der Woche auf Spiegel online (http://tinyurl.com/na2l9db) spielt die Quersumme einer Zahl eine Rolle. a) Schreiben Sie eine Methode static long quersumme(long n), die die Quersumme einer ganzen Zahl berechnet. b) Versuchen Sie mit einem Hauruckverfahren eine Lösung für das Rätsel der Woche zu finden. Hierzu schreiben Sie eine Methode: static long solution(); Die Methode soll die kleinste Zahl n mit einer durch 10 teilbaren Quersumme zurückgeben, so dass auch die Quersumme von n + 1 durch 10 teilbar ist. Versuchen Sie dieses mit einer Schleife zu lösen, die alle Zahlen von 1 aufsteigend testet, ob sie die Eigenschaft haben. Und die bei der ersten Zahl mit der gesuchten Eigenschaft abbricht, um diese zurückzugeben. Aufgabe 2 Die beiden eingebauten primitiven Typen für ganze Zahlen int und long haben einen recht kleinen Wertebereich. Will man mit ganzen Zahlen mit beliebig hohen Beträgen rechnen, so kann man die Klasse BigInteger verwenden. Objekte dieser Klasse können beliebig große und kleine ganze Zahlen darstellen. Hierzu hat die Klasse einen Konstruktor, um ganze Zahlen aus ihrer Stringdarstellung zu erzeugen, z.B.: new BigInteger("1567445324654764755675"). Es gibt aber auch zwei konstante Objekte für die Zahlen 0 und 1: BigInteger.ONE. Für Objekte gibt es keine arithmetische Operatoren oder Vergleichsoperatoren. Um mit BigInteger Werten zu rechnen, gibt es Methoden. So gibt es für die Addition die Methode add. Für negative Zahlen die Methode negate() .Die Rechnung 1-1 wird also zu: BigInteger.ONE.add(BigInteger.ONE.negate()). Zum Vergleichen zweier Zahlen gibt es die Methode compareTo, deren genaue Arbeitsweise der Java-Dokumentation zu entnehmen ist. 13. November 2016 (Seite 1) Übungsblatt 4 Objektorientierte Softwareentwicklung Sven Eric Panitz Um mit der Klasse BigInteger zu arbeiten, ist vor der eigenen Klassendefinition folgende Import-Anweisung einzufügen: import java.math.BigInteger; a) Schreiben Sie eine rekursive Implementierung der Fakultätsfunktion für BigInteger-Werte,: static BigInteger facRek(BigInteger n). b) Schreiben Sie eine iterative Implementierung der Fakultätsfunktion für BigInteger-Werte,: static BigInteger facIt(BigInteger n). c) Testen Sie beide Implementierungen mit sehr großen Zahlen aus. Rechnen Sie zum Beispiel die Fakultät von 10000. Aufgabe 3 Schreiben Sie in der Klasse Datum eine Methode String monthAsHTML(), die für den Monat in Form einer HTML Tabelle eine wochenweise Anzeige erzeugt, wie im folgenden Beispiel für November 2013: <table> <tr><th>Mo</th><th>Di</th><th>Mi</th><th>Do</th><th>Fr</th><th>Sb</th><th>So</th></tr> <tr><td></td><td></td><td></td><td></td><td>1</td><td>2</td><td>3</td></tr> <tr><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td></tr> <tr><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td></tr> <tr><td>18</td><td>19</td><td>20</td><td><b>21</b></td><td>22</td><td>23</td><td>24</td></tr> <tr><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td></tr> </table> Aufgabe 4 Schreiben Sie eine Klasse Vertex, die Punkte in einem zweidimensionalen Raum repräsentiert. Es soll hierzu eine x- und eine y-Koordinate geben. Diese haben als Typ eine Fließkommazahl des eingebauten Javatyps double. a) Versehen Sie die Klasse mit einem adäquaten Konstruktor und einer Methode toString. b) Schreiben Sie in der Klasse eine Methode: void move(Vertex v), die den Punkt um die x- und y-Werte des Parameter v verschiebt. c) Schreiben Sie in der Klasse eine Methode: void moveTo(Vertex v), die den Punkt auf die x- und y-Werte des Parameter v setzt. d) Testen Sie Ihre Klasse mit ein paar Aufrufen in einer Hauptmethode. 13. November 2016 (Seite 2) Übungsblatt 4 Objektorientierte Softwareentwicklung Sven Eric Panitz Aufgabe 5 Schreiben Sie eine Klasse GeometricObject. Diese habe ein Feld corner des Typs Vertex, ein Feld width des Typs double und eine Feld height ebenfalls des Typs double. Versehen Sie die Klasse mit einem geeigneten Konstruktor und einer Methode toString. Aufgabe 6 Ergänzen Sie die Klasse GeometricObject um folgende Methoden: a) double size() Es soll das Produkt aus Höhe und Weite errechnet werden. b) boolean isLargerThan(GeometricObject that) Soll ausdrücken, dass die Größe von this größer ist als vom that-Objekt. c) boolean isAbove(GeometricObject that) das Ergebnis soll wahr sein, wenn das übergebene Objekt eine y-Position hat die größer ist als die Summe aus der y-Position des this-Objektes und dessen Höhe. d) boolean isUnderneath(GeometricObject that) das Ergebnis soll wahr sein, wenn die Summer aus y-Position und Höhe des übergebenen Objekt kleiner ist als die y-Position des this-Objektes. e) boolean isLeftOf(GeometricObject that) das Ergebnis soll wahr sein, wenn das this-Objekt auf der x-Achse komplett weiter links als das that-Objekt liegt. f) boolean isRightOf(GeometricObject that) das Ergebnis soll wahr sein, wenn das this-Objekt auf der x-Achse komplett weiter rechts als das that-Objekt liegt. g) boolean touches(GeometricObject that) Soll genau dann wahr sein, wenn die beiden Objekte sich in irgendeiner Weise auf dem Koordinatensystem überschneiden. Aufgabe 7 Ergänzen Sie die Klasse GeometricObject um ein weiteres Feld des Typs Vertex. Dieses soll die Bewegung des Objektes darstellen. 13. November 2016 (Seite 3) Übungsblatt 4 Objektorientierte Softwareentwicklung Sven Eric Panitz a) Überladen Sie den Konstruktor der Klasse GeometricObject. Wenn es nur einen Parameter des Typs Vertex hat, soll dieses die Ecke des Objektes werden. Die Bewegung sei dann in beiden Dimensionen auf 0 gesetzt. b) Ergänzen Sie GeometricObject um eine Methode: void move() Wird sie aufgerufen, soll die Ecke um den Vertex, der die Bewegung ausdrückt, verschoben werden. 13. November 2016 (Seite 4) Übungsblatt 4