C# :: Aufgabe #348
1 Lösung

Feiertage in Deutschland
Anfänger - C#
von JKooP
- 03.01.2021 um 15:06 Uhr
Die Feiertage sind vorüber – doch die nächsten stehen schon vor der Tür.
Da kann es nicht schaden, mal einen Blick in die Zukunft zu werfen.
Es soll ein Programm entwickelt werden, mit dem es möglich ist,
alle Feiertage (mit Bezeichnung und Datum) eines gewählten Bundeslandes für eine bestimmte Jahreszahl auszugeben.
Dabei sollen sowohl die festen als auch die beweglichen Feiertage berücksichtigt werden.
Ebenfalls soll es die Möglichkeit geben, die gesetzlichen Feiertage für alle Bundesländer auszugeben.
Wer möchte, kann natürlich auch noch die regionalen Feiertage wie z.B. Rosenmontag oder die - wie für einige Beamte üblichen - Feiertage wie z.B. Heilig Abend und Silvester einbringen.
Beispiel für Aufruf:
[datum, bezeichnung] FEIERTAGE(jahr, bundesland, optional: beamter/rosenmontag)
Eine Übersicht zu den einzelnen Bundesländern und den gesetzlichen Feiertagen gibt es hier.
Da kann es nicht schaden, mal einen Blick in die Zukunft zu werfen.
Es soll ein Programm entwickelt werden, mit dem es möglich ist,
alle Feiertage (mit Bezeichnung und Datum) eines gewählten Bundeslandes für eine bestimmte Jahreszahl auszugeben.
Dabei sollen sowohl die festen als auch die beweglichen Feiertage berücksichtigt werden.
Ebenfalls soll es die Möglichkeit geben, die gesetzlichen Feiertage für alle Bundesländer auszugeben.
Wer möchte, kann natürlich auch noch die regionalen Feiertage wie z.B. Rosenmontag oder die - wie für einige Beamte üblichen - Feiertage wie z.B. Heilig Abend und Silvester einbringen.
Beispiel für Aufruf:
[datum, bezeichnung] FEIERTAGE(jahr, bundesland, optional: beamter/rosenmontag)
Eine Übersicht zu den einzelnen Bundesländern und den gesetzlichen Feiertagen gibt es hier.
Lösungen:
NET 5.x; C# 9.x; VS-2019
C#-Code
C#-Code
C#-Code
C#-Code
C#-Code
C#-Code
C#-Code

using System; namespace CS_NET5_Feiertage_Bundeslaender { class Program { static void Main(string[] args) { // ist 01.05.2021 in Bayern ein Feiertag? var ft_by = new FeiertageEinzel(new DateTime(2021, 5, 1), BL.BY); Console.WriteLine(ft_by); // alle Feiertage in Rheinland-Pfalz für 2021 var ft_rp = new FeiertageAlle(2021, BL.RP); Console.WriteLine($"\nFeiertage Rheinland-Pfalz 2021:\n{ft_rp}"); // alle gesetzlichen Feiertage in Deutschland var ft_all = new FeiertageAlle(2021, BL.ALL); Console.WriteLine($"\ngesetzliche Feiertage 2021:\n{ft_all}"); // alle Feiertage für Beamte in NRW inklusive Rosenmontag var ft_nw_br = new FeiertageAlle(2021, BL.NW, true, true); Console.WriteLine($"\nFeiertage Beamte NRW 2021:\n{ft_nw_br}"); } } }

using System; namespace CS_NET5_Feiertage_Bundeslaender { [Flags] public enum BL { BB = 1, BE = 2, BW = 4, BY = 8, HB = 16, HE = 32, HH = 64, MV = 128, NI = 256, NW = 512, RP = 1024, SH = 2048, SL = 4096, SN = 8192, ST = 16384, TH = 32768, ALL = 65535 } }

namespace CS_NET5_Feiertage_Bundeslaender { public enum FT { Neujahr, Heilige_Drei_Koenige, Rosenmontag, Frauentag, Karfreitag, Ostermontag, Maifeiertag, Christi_Himmelfahrt, Pfingstmontag, Fronleichnam, MariäHimmelfahrt, Weltkindertag, Tag_Der_Dt_Einheit, Reformationstag, Allerheiligen, Buss_Und_Bettag, Heilig_Abend, Erster_Weihnachtstag, Zweiter_Weihnachtstag, Silvester } }

using System; using System.Collections.Generic; namespace CS_NET5_Feiertage_Bundeslaender { public static class FeiertageBerechnen { public static DateTime Ostersonntag(int Jahr) { var a = Jahr % 19; var b = Jahr / 100; var c = (8 * b + 13) / 25 - 2; var d = b - (Jahr / 400) - 2; var e = (19 * (Jahr % 19) + ((15 - c + d) % 30)) % 30; if (e == 28) if (a > 10) e = 27; else if (e == 29) e = 28; var f = (d + 6 * e + 2 * (Jahr % 4) + 4 * (Jahr % 7) + 6) % 7; return new DateTime(Jahr, 3, 1).AddDays(Convert.ToDouble(e + f + 21)); } public static DateTime BussUndBettag (int Jahr) { var datum = new DateTime(Jahr, 12, 25); var day = (int)datum.DayOfWeek; return datum.AddDays(-4 * 7).AddDays((day == 0) ? -11 : -day - 4); } public static List<(DateTime datum, FT feiertag, BL bundesland)> Feiertagsliste(int jahr) { var os = Ostersonntag(jahr); return new() { (new DateTime(jahr, 1, 1), FT.Neujahr, BL.ALL), (new DateTime(jahr, 1, 6), FT.Heilige_Drei_Koenige, BL.BW | BL.BY | BL.ST), (new DateTime(jahr, 3, 8), FT.Frauentag, BL.BE), (os.AddDays(-2), FT.Karfreitag, BL.ALL), (os.AddDays(1), FT.Ostermontag, BL.ALL), (new DateTime(jahr, 5, 1), FT.Maifeiertag, BL.ALL), (os.AddDays(39), FT.Christi_Himmelfahrt, BL.ALL), (os.AddDays(50), FT.Pfingstmontag, BL.ALL), (os.AddDays(60), FT.Fronleichnam, BL.BW | BL.BY | BL.HE | BL.NW | BL.RP | BL.SL), (new DateTime(jahr, 8, 15), FT.MariäHimmelfahrt, BL.SL), (new DateTime(jahr, 9, 20), FT.Weltkindertag, BL.TH), (new DateTime(jahr, 10, 3), FT.Tag_Der_Dt_Einheit, BL.ALL), (new DateTime(jahr, 10, 31), FT.Reformationstag, BL.BB | BL.HB | BL.HH | BL.MV | BL.NI | BL.SN | BL.ST | BL.SH | BL.TH), (new DateTime(jahr, 11, 1), FT.Allerheiligen, BL.BW | BL.BY | BL.NW | BL.RP | BL.SL), (BussUndBettag(jahr), FT.Buss_Und_Bettag, BL.SN), (new DateTime(jahr, 12, 25), FT.Erster_Weihnachtstag, BL.ALL), (new DateTime(jahr, 12, 26), FT.Zweiter_Weihnachtstag, BL.ALL) //ALL => BL.BB | BL.BE | BL.BW | BL.BY | BL.HB | BL.HE | BL.HH | BL.MV | BL.NI | BL.NW | BL.RP | BL.SH | BL.SL | BL.SN | BL.ST | BL.TH }; } } }

using System; using System.Collections.Generic; using System.Linq; namespace CS_NET5_Feiertage_Bundeslaender { abstract class Feiertage { protected List<(DateTime datum, FT feiertag, BL bundesland)> _dicFT; public Feiertage(DateTime datum, BL bundesland, bool beamter = false, bool rosenmontag = false) { Datum = datum; Jahr = Datum.Year; Bundesland = bundesland; Beamter = beamter; Rosenmontag = rosenmontag; _dicFT = FeiertageBerechnen.Feiertagsliste(Jahr); ListeFeiertageErgaenzen(); } private int Jahr { get; set; } protected BL Bundesland { get; } protected DateTime Datum { get; } private bool Beamter { get; } private bool Rosenmontag { get; } private void ListeFeiertageErgaenzen() { if (Rosenmontag) _dicFT.Add((FeiertageBerechnen.Ostersonntag(Jahr).AddDays(-48), FT.Rosenmontag, Bundesland)); if (Beamter) { _dicFT.Add((new DateTime(Jahr, 12, 24), FT.Heilig_Abend, Bundesland)); _dicFT.Add((new DateTime(Jahr, 12, 31), FT.Silvester, Bundesland)); } _dicFT = _dicFT.OrderBy(x => x.datum).ToList(); } } }

using System; namespace CS_NET5_Feiertage_Bundeslaender { class FeiertageEinzel : Feiertage { public FeiertageEinzel(DateTime datum, BL bundesland, bool beamter = false, bool rosenmontag = false) : base(datum, bundesland, beamter, rosenmontag) { } public (bool b, FT? ft) IstFeiertag { get { foreach (var (datum, feiertag, bundesland) in _dicFT) if (datum == Datum && bundesland.HasFlag(Bundesland)) return (true, feiertag); return (false, null); } } public override string ToString() { var (b, ft) = IstFeiertag; return $"{Datum.ToShortDateString()} ist {(b ? "" : "kein ")}Feiertag in {Bundesland} ({ft})"; } } }

using System; using System.Collections.Generic; using System.Text; namespace CS_NET5_Feiertage_Bundeslaender { class FeiertageAlle : Feiertage { public FeiertageAlle(int jahr, BL bundesland, bool beamter = false, bool rosenmontag = false) : base(new DateTime(jahr, 1, 1), bundesland, beamter, rosenmontag) { } public IEnumerable<(FT ftag, DateTime datum)> AlleFeiertage { get { foreach (var (datum, feiertag, bundesland) in _dicFT) if (bundesland.HasFlag(Bundesland)) yield return (feiertag, datum); } } public override string ToString() { var sb = new StringBuilder(); foreach (var (ftag, datum) in AlleFeiertage) sb.Append($"{datum.ToShortDateString()} {ftag}\n"); return sb.ToString(); } } }