Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Wochentag/Musterlösung

#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;
}