programmieren-1-java/uebungen/u23/Jahreszeit.java

137 lines
4.5 KiB
Java

import java.util.Scanner;
/**
* Klasse zum errechnen der Jahreszeit eines eingegebenen Datums
*/
public class Jahreszeit {
public static final int[] MONATSLAENGEN = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public static final int[] FRUEHLINGSANFANG = {3, 20};
public static final int[] SOMMERANFANG = {6, 21};
public static final int[] HERBSTANFANG = {9, 22};
public static final int[] WINTERANFANG = {12, 21};
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.println(bestimmeJahreszeit(datumEinlesen(console)));
}
/**
* Liest nach ausgabe einer Eingabeaufforderung eine Zahl ein
* Bei ungueltiger Eingabe wird so lange wiederholt, bis eine
* guelige Eingabe erfolgt
*/
public static int zahlEinlesen(Scanner console, String prompt) {
while (true) {
System.out.print(prompt);
String eingabe = console.nextLine();
try {
return Integer.parseInt(eingabe);
} catch (NumberFormatException e) {
System.out.println("Bitte eine ganze Zahl eingeben.");
}
}
}
/**
* Liest mittels zahlEinlesen eine Zahl innerhalb eines durch
* min und max definierten bereiches ein
* Bei ungueltiger Eingabe wird so lange wiederholt, bis eine
* gueltige Eingabe erfolgt.
*/
public static int zahlInRangeEinlesen(Scanner console, int min, int max, String prompt) {
prompt = prompt + " (" + min + "-" + max + "): ";
int eingabe = zahlEinlesen(console, prompt);
while (eingabe < min || eingabe > max) {
System.out.println("Nicht im geforderten Bereich.");
eingabe = zahlEinlesen(console, prompt);
}
return eingabe;
}
/**
* Liest ein beliebeiges Datum durch abfrage von Tag
* und Monat von der Konsole ein ohne Ueberpruefung
* auf Gueltigkeit des Datums
* Rueckgabe des Datums erfolgt durch ein Integer Array
* des Formates: {Monat, Tag}
*/
public static int[] beliebigesDatumEinlesen(Scanner console) {
int tag = zahlInRangeEinlesen(console, 1, 31, "Tag");
int monat = zahlInRangeEinlesen(console, 1, 12, "Monat");
int[] datum = {monat, tag};
return datum;
}
/**
* Liest ein Datum durch abfrage von Tag und Monat von der
* Konsole ein
* Bei eingabe eines ungueltigen datums wird die Abfrage
* wiederholt bis ein gueltiges Datum eingegeben wird
* Rueckgabe des Datums erfolgt durch ein Integer Array
* des Formats: {Monat, Tag}
*/
public static int[] datumEinlesen(Scanner console) {
int[] datum = beliebigesDatumEinlesen(console);
while (!istGueltigesDatum(datum[0], datum[1])) {
System.out.println("Datum ist ungültig. Wiederholen");
datum = beliebigesDatumEinlesen(console);
}
return datum;
}
/**
* Ueberprueft ob ein durch monat und tag gegebenes Datum
* Im gueltigen Bereich liegt
*/
public static boolean istGueltigesDatum(int monat, int tag) {
if (monat < 1 || monat > 12) return false;
if (tag < 1 || tag > MONATSLAENGEN[monat - 1]) return false;
return true;
}
/**
* Vergleicht zwei Daten und gibt zurueck ob datum2 groesser oder
* gleich datum1 ist
* datum1 und datum2 sind Interger Arrays im Format: {Monat, Tag}
*/
public static boolean datumIstGroesser(int[] datum1, int[] datum2) {
if (datum1[0] < datum2[0]) { // ist datum1 Monat < datum2 Monat
return true;
} else if (datum1[0] > datum2[0]) { // ist datum1 Monat > datum2 Monat
return false;
} else { // datum1 Monat und datum2 Monat sind gleich
if (datum1[1] > datum2[1]) { // ist datum1 Tag > datum2 Tag
return false;
}
return true;
}
}
/**
* Bestimmt die Jahreszeit eines Datums
* datum ist ein Integer Array im Format: {Monat, Tag}
*/
public static String bestimmeJahreszeit(int[] datum) {
if (datumIstGroesser(WINTERANFANG, datum)) {
return "Winter";
}
if (datumIstGroesser(HERBSTANFANG, datum)) {
return "Herbst";
}
if (datumIstGroesser(SOMMERANFANG, datum)) {
return "Sommer";
}
if (datumIstGroesser(FRUEHLINGSANFANG, datum)) {
return "Frühling";
}
return "Winter";
}
}