#include <stdio.h>
/*dump_line per copy paste, leert den Puffer von scanf() */
void dump_line( FILE * fp )
{
int ch;
while( (ch = fgetc(fp)) != EOF && ch != '\n' )
/* null body */;
}
/* prüft, ob ein Jahr Schaltjahr ist 0 für false, 1 für true
http://www.schnelle-online.info/Wann-ist-ein-Schaltjahr.html */
int schaltjahr(int jahr){
if((jahr%400 == 0) || ((jahr%100 != 0)&&(jahr%4 == 0))){
return 1;
}
return 0;
}
int main(){
printf("Willkommen zum Wochentagsprogramm.\n");
int day = 1;
int month = 1;
int year = 1;
/* Eingabe Jahr */
int check = 0;
while (check != 1) {
printf("Bitte geben Sie das Jahr ein (Format JJJJ):\t");
check = scanf("%d", &year);
dump_line(stdin);
if ( (check == 1) && (year <= 0) ){
check = 0;
printf("Sie haben ein ungültiges Jahr angegeben.\n");
}
}
/* Eingabe Monat */
check = 0;
while (check != 1){
printf("Bitte geben Sie den Monat ein (Format MM):\t");
check = scanf("%d", &month);
dump_line(stdin);
if ( (check == 1) && ((month <= 0) || (month >= 13)) ){
check = 0;
printf("Sie haben einen ungültigen Monat angegeben.\n");
}
}
/* Eingabe Tag */
check = 0;
while (check != 1){
printf("Bitte geben Sie den Tag ein (Format TT):\t");
check = scanf("%d", &day);
dump_line(stdin);
if(check == 1){
if((day<=0)||(day>31)){
check = 0;
printf("Sie haben einen ungültigen Tag angegeben.\n");
}
else {
if ((day>30)&&((month==4)||(month==6)||(month==9)||(month==11))){
check = 0;
printf("Sie haben einen ungültigen Tag angegeben.\n");
}
else{
if((day > 29)&&(month==2)&&(schaltjahr(year)==1)){
check = 0;
printf("Sie haben einen ungültigen Tag angegeben.\n");
}
else {
if((day>28)&&(month==2)){
check = 0;
printf("Sie haben einen ungültigen Tag angegeben.\n");
}
}
}
}
}
}
printf("\n");
/* Berechnung der seit dem 1.1.1 vergangenen Tage */
int past_days = 0;
/* Anteil der Jahre */
int schalttage = (year-1)/4 - (year-1)/100 + (year-1)/400;
/* Anzahl der Schalttage in den bisherigen Jahren */
past_days = year * 365 + schalttage;
/* Anteil der Monate */
switch(month){
case 1: break;
case 2: {
past_days += 31;
break;
}
case 3: { past_days += 31+28;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 4: { past_days += 31+28 + 31;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 5: { past_days += 31+28+31+30;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 6: { past_days += 31+28+31+30+31;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 7: { past_days += 31+28+31+30+31+30;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 8: { past_days += 31+28+31+30+31+30+31;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 9: { past_days += 31+28+31+30+31+30+31+31;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 10: { past_days += 31+28+31+30+31+30+31+31+30;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 11: { past_days += 31+28+31+30+31+30+31+31+30+31;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
case 12: { past_days += 31+28+31+30+31+30+31+31+30+31+30;
if (schaltjahr(year)==1){
past_days++;
}
break;
}
default: {
printf("Es wurde mit einem Monat <0 >12 gerechnet.\n");
return 0;
}
}
/* Anteil der Tage */
past_days += day;
/* Berechnung des Wochentags und Ausgabe */
switch (past_days%7){
case 0: {
printf("Der %d.%d.%d ist ein Samstag.\n", day, month, year);
break;
}
case 1: {
printf("Der %d.%d.%d ist ein Sonntag\n", day, month, year);
break;
}
case 2: {
printf("Der %d.%d.%d ist ein Montag.\n", day, month, year);
break;
}
case 3: {
printf("Der %d.%d.%d ist ein Dienstag.\n", day, month, year);
break;
}
case 4: {
printf("Der %d.%d.%d ist ein Mittwoch.\n", day, month, year);
break;
}
case 5: {
printf("Der %d.%d.%d ist ein Donnerstag.\n", day, month, year);
break;
}
case 6: {
printf("Der %d.%d.%d ist ein Freitag.\n", day, month, year);
break;
}
default: {
printf("Es ist ein Fehler aufgetreten.\n");
return 0;
}
}
return 0;
}