Siehe unten.
public class Monat
{
// Instanzvariablen
private int monat; // 1 == Januar
private int jahr; // Jahr als int, z.B. 2017
private int tageImMonat; // Anzahl der Tage in diesem Monat
// Temperatur Daten
private int[] temp; //Temperatur Tag 1 in temp[1]
private boolean[] valide;
// Konstruktor
public Monat( int monat, int jahr)
{
this.monat = monat;
this.jahr = jahr;
temp = new int[ 32 ] ;
valide = new boolean[ 32 ] ;
switch (monat)
{
case 1, 3, 5, 7, 8, 10, 12 ->
tageImMonat = 31;
case 4, 6, 9, 11 ->
tageImMonat = 30;
case 2 ->
{
if (istSchaltjahr(jahr))
{
tageImMonat = 29;
} else
{
tageImMonat = 28;
}
}
default ->
tageImMonat = 0;
}
}
public boolean istSchaltjahr( int jahr )
{
return ((jahr % 4 == 0) && (jahr % 100 != 0)) || (jahr % 400 == 0);
}
public String toString()
{
return monat + "." + jahr;
}
}
Warum 32???
Das ist ein gängiger Programmiertrick: Es ist praktischer den Arrayindex 1 für den Tag 1, den Arrayindex 2 für den Tag 2 usw. zu verwenden. Also verwenden wir 32. Die Zelle 0 wird nicht verwendet. Ihr könntet einwenden, das ist Vergeudung. Aber es vereinfacht die Programmierung, was immer ein Vorteil ist. Die Programmierlogik, die man bei einem Index, der um 1 kleiner ist als die Tageszahl, bräuchte, würde viel mehr Bytes benötigen als die nicht verwendete 4 Byte große Zelle.
Aber warum verwenden alle Monate 32, auch wenn manche Monate weniger als 31 Tage haben? Aus dem gleichen Grund wie oben. Nicht verwendete Bytes tun nicht weh.
Die Variable tageImMonat enthält die Anzahl der Tage eines bestimmten Monats.
Der Konstruktor berechnet das mit Hilfe seiner Parameter jahr und tag.
Die Methode istSchaltjahr() ermittelt, ob es sich bem jahr um ein Schaltjahr handelt.
Prüft der Konstruktor auf Fehler?