diff --git a/uebungen/u23/Jahreszeit.class b/uebungen/u23/Jahreszeit.class new file mode 100644 index 0000000..56386c7 Binary files /dev/null and b/uebungen/u23/Jahreszeit.class differ diff --git a/uebungen/u23/Jahreszeit.java b/uebungen/u23/Jahreszeit.java new file mode 100644 index 0000000..89b26cb --- /dev/null +++ b/uebungen/u23/Jahreszeit.java @@ -0,0 +1,136 @@ +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"; + } + +}