Implementieren Sie die Klassen Date
. Sie soll ganzzahlige konstante Felder mit Namen day
, month
und year haben.
- Schreiben Sie eine Methode:
fun isEarlierThan(that: Date): Boolean
die testet, ob das Datumsobjekt im Kalender vor einem anderen Datum liegt.
- Schreiben Sie eine Methode:
fun isLaterThan(that: Date): Boolean
die testet ob das Datumsobjekt im Kalender nach einem anderen Datum liegt.
- Schreiben Sie eine Methode:
fun isSameDate(that: Date): Boolean
die testet, ob zwei Datumsobjekte den gleichen Tag bezeichnen, also Tag, Monat und Jahr identisch haben.
- Schreiben Sie ein Getter-Feld:
val isLeapYear: Boolean
das angibt, ob das Datum in einem Schaltjahr liegt.
- Schreiben Sie ein Getter-Feld:
val absoluteDaysInYear: Int
die zurück gibt, wie viel Tage das Jahr des Datums hat.
- Schreiben Sie eine Methode:
fun dayOfWeek(): Int
Das Ergebnis sei eine Zahl zwischen 0 und 6 für die Wochentage von Sonntag, Montag,... bis Sonnabend.
Ein Algorithmus zur Wochentagsberechnung finden Sie z.B. auf Wikipedia.
Sie können entweder schrittweise vorgehen und die Tagesziffer, die Monatsziffer, die Jahresziffer, die Jahrhundertziffer und der Schaltjahrskorrektur, wie in dem Algorithmus spezifiziert, berechnen. Sie können aber auch die Formel direkt in Java umzuformulieren.
- Schreiben Sie eine Methode:
fun easter(): Date
Sie soll das Datum für den Ostersonntag im Jahr für das Datumsobjekt berechnen.
- Schreiben Sie eine Methode:
fun nextDay(): Date
Es soll der nächste Kalendertag erzeugt werden.
- Schreiben Sie eine Methode:
fun mothersDay(): Date
Es soll der Muttertag für das entsprechende Jahr des Kalenderdatums berechnet werden.
- Schreiben Sie eine Methode:
fun monthAsHTML(): String
Es soll für den Monat in Form einer HTML Tabelle eine wochenweise Anzeige erzeugt, genau 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>21</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>
So sieht der Monat dann auf einer HTML-Seite wie folgt aus:
Mo |
Di |
Mi |
Do |
Fr |
Sb |
So |
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
- Schreiben Sie eine Methode
toString
, die ein Datumsobjekt wie folgt als Zeichenkette darstellt: "Fr 30.11.2018".
Der Konstrukor lässt auch zu, dass man unsinnige Datumsokjekte erzeugt, wie zum Beispiel einen 32.12.1812 ider einen 1.13.1714. In Kotlin gibt es eine Anweisung assert. Diese bekommt einen Ausdruck, der zu einen Wahrheitswert auswertet als Argument. Starten Sie Ihr Kotlinprogramm mit der zusätzlichen Option -ea (oder -enableassertions) auf der Kommandozeile gestartet, so werden diese boolchen Ausdrücke während der Laufzeit ausgewertet. Wertet einer zu false aus, dann bricht das Programm ab.
Ergänzen Sie die Klasse Date jetzt einen Initialisierungsblock mit assert-Anweisungen, die zumindest checken, weder Monat noch Tag kleiner als 1, sowie kein Tag größer 31 und kein Monatswert größer 12 zum Initialisieren verwendet wird.
package name.panitz.kotlin.date;
class Date(val day: Int, val month: Int, val year: Int) {
val isLeapYear: Boolean
val absoluteDaysInYear: Int
fun nextDay(): Date
fun daysInMonth(): Int
fun monthAsHTML(): String
fun mothersDay(): Date
fun dayOfWeek(): Int
fun easter(): Date
fun isEarlierThan(that: Date): Boolean
fun isLaterThan(that: Date): Boolean
fun isSameDate(that: Date): Boolean
override fun toString(): String
}