Hier Demo 1, wie man zu einem Datum den Wochentag erhalten kann. Die Formel ist kompliziert, aber kann nachgeschlagen werden. Es ist jedenfalls sehr viel einfacher, als das von Hand zu programmieren. Zum Programmieren gehört eben auch Recherche, wie man am besten vorgeht, anstatt einfach blind los zu legen. Besonders bei Problemen, die sicherlich schon Millionenfach von anderen Leuten gelöst wurden. Die Demo zeigt auch Trennung von Zuständigkeiten: Die Datumsfunktion macht wirklich nichts anderes, als den Wochentag zu berechnen. Die Ausgabefunktion macht nichts anderes als Ausgeben. Wenn der Wochentag jemals in einem anderen Kontext gebraucht wird (was ziemlich gut vorstellbar ist), dann kann man sie dadurch unverändert erneut benutzen.
Der Code demonstriert auch die von Nirvash vorgeschlagene Tabelle für die Wochentage, anstatt umstandliche switches zu nutzen.
#include <stdio.h>
const char* const weekdays[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
int get_day_of_the_week(int year, int month, int day)
{
return (day // Siehe Wikipedia für Formel
+ ((153 * (month + 12 * ((14 - month) / 12) - 3) + 2) / 5)
+ (365 * (year + 4800 - ((14 - month) / 12)))
+ ((year + 4800 - ((14 - month) / 12)) / 4)
- ((year + 4800 - ((14 - month) / 12)) / 100)
+ ((year + 4800 - ((14 - month) / 12)) / 400)
- 32045
) % 7;
}
void date_query(int year, int month, int day)
{
printf("%d-%d-%d ist ein %s\n", year, month, day, weekdays[get_day_of_the_week(year, month, day)]);
}
int main()
{
date_query(2013,8,22);
date_query(2013,1,1);
date_query(2013,12,31);
date_query(1629,5,22);
}
Der zweite Democode entspricht der Kalenderdruckfunktion. Wieder ist ausgelagert, was noch irgendwo anders benutzbar sein könnte und mit dem Kalenderdruck nicht direkt zu tun hat. Demonstriert wird auch richtiger Umgang mit Kontrollsturkturen ohne for-switch, wie es ohnehin selbstverständlich sein sollte. Wieder ersetzen 5 Minuten Recherche 300 Zeilen unnötigen Code, da man leicht bessere Formeln findet, als man sich selber aus dem Stand ausdenken kann.
#include <stdio.h>
const char* const weekdays[] = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
int first_day_of_the_year(int year)
{
// Formel wieder von Wikipedia
return ((year-1) + (year-1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;
}
int is_leap_year(int year)
{
// Sollte bekannt sein, ansonsten: Wikipedia!
return ( !(year % 4) && (year % 100 || !(year % 400)));
}
void print_calendar(int year)
{
int days_in_month[] = {31, is_leap_year(year) ? 29:28, 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31};
int current_day_of_the_week = first_day_of_the_year(year);
int month, day;
for (month = 0; month < 12; ++month)
for(day = 0; day < days_in_month[month]; ++day)
{
printf("%d-%d-%d ist ein %s\n", year, month+1, day+1, weekdays[current_day_of_the_week]);
current_day_of_the_week = (current_day_of_the_week + 1) % 7;
}
}
int main()
{
print_calendar(2013);
}