Übungsblatt 4

Werbung
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
Herunterladen