Það er ekkert voðalega pent að renna svona í gegnum öll ár í while lykkju.
þú getur fundið fyrsta vikudaginn í ári svona (java kóði):
private static int FirstDayOfYear(int year)
{
int offset = 0; // initial conditions
int leapyears = (year/4 - year/100 + year/400 ); // number of previous leap years
if (IsLeapYear(year)) leapyears--; //subtract current year's leap day
int weekday = (year + leapyears + offset) % 7;
return weekday;
}
Af kóðanum þínum að dæma virðistu vita að ef tiltekinn mánaðardagur er á mánudegi ár x, þá er hann á þriðjudegi ár x+1, o.s.fr, nema hlaupaársdagur komi þarna á milli.
Maður getur þá einfaldlega reiknað út fjölda hlaupársdaga og bætt þeim við
.
(offset breytan er í raun óþörf en ég hef hana með því að það þarf að taka með í reikninginn offsetið á vikudögunum í dagatalinu, (líka ef maður skilgreinir mánudag sem dag 0 frekar en Sunnudag þá þarf offset breytan annað gildi)).
Annað sem maður getur gert er að reikna út númer hvað dagurinn í árinu er.
public static final short[] monthdays = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
private static int NumberOfDayInYear(int month, int day, boolean leap)
{
int daynumber = monthdays[month] + day;
if (leap && month > 1)
daynumber++;
return daynumber;
}
þarna nota ég array með föstum þar sem ég er búinn að leggja saman fjölda daga í mánuðum sem koma á undan. Þá sleppur maður við að vera með stórar switch-case segðir.
Með þessum föllum er síðan frekar einfalt að finna vikudag dagsetningar:
private static int FindWeekday(int year, int month, int day)
{
int first_day = FirstDayOfYear(year);
int day_number = NumberOfDayInYear(month, day, IsLeapYear(year));
return ((day_number-1) + first_day) % 7;
}
(ég tel mánuði frá 0 (janúar) upp í 11 (desember)).