Hi,
ich hab aus dem Buch
"Das C# Codebook" den Code für die Ermittlung der Feiertage in einem bestimmten Jahr.
Das Programm gibt soweit alle Feiertage aus, doch nun steh ich vor folgendem Problem. Ich möchte erreichen, dass der Nutzer den Monat als Zahl und den Tag als Zahl angeben kann. Dabei soll beachtet werden, dass nur die Monate:
1, 3, 5,7,8,10,12 -> max. 31 Tage
4,6,9,11 -> max. 30 Tage
und je nachdem ob es ein Schaltjahr ist oder nicht
2 -> max. 28 oder max. 29 Tage
haben.
mein bisheriger Versuch scheiterete daran, dass day innerhalb einer if und do-while -Anweisung war. Und deshalb konnte es immer nicht ermittelt werden. Hier mal der Codeauszug
[highlight=c#] //diese Methode dient zur Ermittlung ob ein Tag ein Feiertag ist oder nicht.
public static bool IsGermanHoliday(DateTime date, out string name, out bool nationWide)
{
//out-Argumente initialisieren
name = null;
nationWide = false;
///summary
///Auflistung der besonderen Tage des angegeben Jahres erzeugen,
///durchgehen und das Datum der Feiertage mit dem angegebenen Datum vergleichen
///summary
foreach (GermanSpecialDay gsd in GetGermanSpecialDays(date.Year).Values)
{
if (date.Day == gsd.Date.Day && date.Month == gsd.Date.Month)
{
//Dateum gefunden
if (gsd.Holiday)
{
//Es ist ein Feiertag: Infos definierten und true zurückgeben
name = gsd.Name;
nationWide = gsd.Nationwide;
return true;
}
else
//kein Feiertag
return false;
}
}
// Tag wurde nicht gefunden
return false;
}
[/highlight]
hier der Main-Teil
[highlight=c#]
int month;
int day;
string name;
bool nationWide;
do
{
Console.WriteLine("Welcher Monat? (Zahl)");
month = Convert.ToInt32(Console.ReadLine());
} while (month > 12);
//if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
}while (day > 31);
/*if (month == 4 || month == 6 || month == 9 || month == 11 )
{
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
} while (day > 30);
}
if (month == 2)
{
if (DateTime.Now.Year % 4 == 0)
{
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
} while (day > 29);
}
else
{
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
} while (day > 28);
}
}*/
DateTime date = new DateTime(DateTime.Now.Year, month, day);
if(IsGermanHoliday(date, out name, out nationWide))
{
if(nationWide)
Console.WriteLine("Der {0} ist ein bundesweiter Feiertag: {1}", date.ToShortDateString(), name);
else
Console.WriteLine("Der {0} ist ein lokaler Feiertag: {1}", date.ToShortDateString(), name);
}
else
Console.WriteLine("Der {0} ist kein Feiertag", date.ToShortDateString());
Console.WriteLine();
Console.ReadLine();
[/highlight]
//Edit: so wie der Main-Teil auskommentiert ist funktionierts, aber die Gefahr einen 30. Februar zu bekommen ist sehr groß.
ich hab aus dem Buch
"Das C# Codebook" den Code für die Ermittlung der Feiertage in einem bestimmten Jahr.
Das Programm gibt soweit alle Feiertage aus, doch nun steh ich vor folgendem Problem. Ich möchte erreichen, dass der Nutzer den Monat als Zahl und den Tag als Zahl angeben kann. Dabei soll beachtet werden, dass nur die Monate:
1, 3, 5,7,8,10,12 -> max. 31 Tage
4,6,9,11 -> max. 30 Tage
und je nachdem ob es ein Schaltjahr ist oder nicht
2 -> max. 28 oder max. 29 Tage
haben.
mein bisheriger Versuch scheiterete daran, dass day innerhalb einer if und do-while -Anweisung war. Und deshalb konnte es immer nicht ermittelt werden. Hier mal der Codeauszug
[highlight=c#] //diese Methode dient zur Ermittlung ob ein Tag ein Feiertag ist oder nicht.
public static bool IsGermanHoliday(DateTime date, out string name, out bool nationWide)
{
//out-Argumente initialisieren
name = null;
nationWide = false;
///summary
///Auflistung der besonderen Tage des angegeben Jahres erzeugen,
///durchgehen und das Datum der Feiertage mit dem angegebenen Datum vergleichen
///summary
foreach (GermanSpecialDay gsd in GetGermanSpecialDays(date.Year).Values)
{
if (date.Day == gsd.Date.Day && date.Month == gsd.Date.Month)
{
//Dateum gefunden
if (gsd.Holiday)
{
//Es ist ein Feiertag: Infos definierten und true zurückgeben
name = gsd.Name;
nationWide = gsd.Nationwide;
return true;
}
else
//kein Feiertag
return false;
}
}
// Tag wurde nicht gefunden
return false;
}
[/highlight]
hier der Main-Teil
[highlight=c#]
int month;
int day;
string name;
bool nationWide;
do
{
Console.WriteLine("Welcher Monat? (Zahl)");
month = Convert.ToInt32(Console.ReadLine());
} while (month > 12);
//if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
}while (day > 31);
/*if (month == 4 || month == 6 || month == 9 || month == 11 )
{
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
} while (day > 30);
}
if (month == 2)
{
if (DateTime.Now.Year % 4 == 0)
{
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
} while (day > 29);
}
else
{
do
{
Console.WriteLine("Welcher Tag? (Zahl)");
day = Convert.ToInt32(Console.ReadLine());
} while (day > 28);
}
}*/
DateTime date = new DateTime(DateTime.Now.Year, month, day);
if(IsGermanHoliday(date, out name, out nationWide))
{
if(nationWide)
Console.WriteLine("Der {0} ist ein bundesweiter Feiertag: {1}", date.ToShortDateString(), name);
else
Console.WriteLine("Der {0} ist ein lokaler Feiertag: {1}", date.ToShortDateString(), name);
}
else
Console.WriteLine("Der {0} ist kein Feiertag", date.ToShortDateString());
Console.WriteLine();
Console.ReadLine();
[/highlight]
//Edit: so wie der Main-Teil auskommentiert ist funktionierts, aber die Gefahr einen 30. Februar zu bekommen ist sehr groß.
Comment