GIP 11

#include 

using namespace std;

void datumEinlesen(short &tag, short &monat, short &jahr);

short codewertMonat(short monat, short jahr);

bool schaltjahr(short jahr);

string ermittleWochentag(short ergebnis);


int main(void)
{
	short tag, monat, jahr;
	double ret;

	datumEinlesen( tag, monat, jahr );

	ret = jahr + (int)(jahr / 4);
		
	ret = ret + codewertMonat( monat, jahr ) + tag;
	ret = (int)ret%7;

	cout << "Dieser Tag war ein " << ermittleWochentag(ret) << endl << endl;

	return 0;
}

void datumEinlesen(short &tag, short &monat, short &jahr)
{
	int tage[] = { 	31, 28, 31, 30, 31, 30, 
					31, 31, 30, 31, 30, 31 };
	if( schaltjahr(jahr) )
	{
		tage[1] = tage[1] + 1;
	}

	do 
	{
		cout << "Datum eingeben:\nTag   = ? ";
		cin >> tag;
	
		cout << "Monat = ? ";
		cin >> monat;
	
		cout << "Jahr  = ? ";
		cin >> jahr;

		if(jahr <= 99 && jahr >= 1)
			if( monat <= 12 && monat >= 1 )	
				if(tag <= tage[monat - 1] && tag >= 1)
					break;
	} 
	while(true);		
}

short codewertMonat(short monat, short jahr)
{
	// Codewert des Monats 
	// Juni                0 Mai                     4
	// September, Dezember 1 August                  5
	// April, Juli         2 Februar, März, November 6
	// Januar, Oktober     3
	int cwm[] = {3,6,6,2,4,0,2,5,1,3,6,1};
	
	if( schaltjahr(jahr) )
	{
		cwm[0] = cwm[0] -1;
		cwm[1] = cwm[1] -1;
	}
	 
	return cwm[monat - 1];
}

bool schaltjahr(short jahr)
{
	if(jahr%4 == 0 && jahr%100 != 0)
	{
		return true;
	}
	return false;
}

string ermittleWochentag(short ergebnis)
{
	// Donnerstag 0
	// Freitag    1
	// Samstag    2
	// Sonntag    3
	// Montag     4
	// Dienstag   5
	// Mittwoch   6

	string wochentag[] = {	"Donnerstag", "Freitag", "Samstag", "Sonntag", 
						 	"Montag", "Dienstag", "Mittwoch" };
	return wochentag[ergebnis];
}