#include<iostream>
using namespace std;

bool istSchaltjahr(int jahreszahl)
// Aufbau der Kopfzeile einer Funktion ist immer wie folgt:
// <Datentyp des Rückgabewerts> <Name der Funktion>(<Variablenliste>)
// Datentyp bool kann die Werte true und false annehmen
{
	if (jahreszahl % 4 == 0)
	{
		if (jahreszahl % 100 == 0)
		{
			if (jahreszahl % 400 == 0)
			{
				return true; // an dieser Stelle wird die Funktion
				// istSchaltjahr beendet und das Programm springt an die
				// Stelle zurück, an der istSchaltjahr aufgerufen wurde.
				// An der Stelle wird quasi der Aufruf istSchaltjahr(...)
				// durch den Wert ersetzt, der hier mittels return
				// zurückgegeben wird.
			}
			else
			{
				return false;
			}
		}
		else
		{
			return true;
		}
	}
	else // jahreszahl %4 != 0
	{
		return false;
	}
} // Ende istSchaltjahr


bool tageszahlOK(int tage, int tageImMonat)
// gibt true zurück wenn der Parameter tage zwischen 1 und tageImMonat liegt
{
	if (1 <= tage && tage <= tageImMonat)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void ausgabeDatumIstGueltig(void)
// nur als Beispiel für eine Funktion ohne Parameter und ohne Rückgabewert
{
	cout << "Das Datum ist gültig!" << endl;
}

int main(void)
{
	int tag, monat, jahr;
	cout << "Gib bitte einen Tag Monat und Jahr ein: ";
	cin >> tag >> monat >> jahr;

	if (1 <= monat && monat <= 12) // && verknüpft zwei boolsche Werte
		// in diesem Fall das Ergebnis des Vergleichs 1 <= monat und
		// das Ergebnis des Vergleichs monat <= 12
		// das Ergebnis ist wahr, wenn beide Vergleich sich zu wahr auswerten
	{
		if (monat == 2)
		{
			if (istSchaltjahr(jahr))
			{
				if (tageszahlOK(tag,29))
				{
					ausgabeDatumIstGueltig();
				}
				else
				{
					cout << "Das Datum ist nicht gültig!" << endl;
				}
			}
			else // Februar, aber kein Schaltjahr
			{
				if (1 <= tag && tag <= 28)
				{
					cout << "Das Datum ist gültig!" << endl;
				}
				else
				{
					cout << "Das Datum ist nicht gültig!" << endl;
				}
			}
		} // Ende Februar
		else if (monat == 4 || monat == 6 || monat == 9 || monat == 11)
			// das || ist eine logische ODER-Verknüpfung
			// wertet sich zu wahr aus, wenn wenigstens ein Operand wahr ist
		{
			if (1 <= tag && tag <= 30)
			{
				cout << "Das Datum ist gültig!" << endl;
			}
			else
			{
				cout << "Das Datum ist nicht gültig!" << endl;
			}
		}
		else // es ist ein Monat mit 31 Tagen
		{
			if (1 <= tag && tag <= 31)
			{
				cout << "Das Datum ist gueltig!" << endl;
			}
			else
			{
				cout << "Das Datum ist nicht gültig!" << endl;
			}
		}
	} // Monat liegt zwischen 1 und 12
	else
	{
		cout << "Das Datum ist nicht gültig (Monat out of range)!" << endl;
	}




 //   if (istSchaltjahr(jahreszahl))
	//{
	//	cout << jahreszahl << " ist ein Schaltjahr!" << endl;
	//}
	//else
	//{
	//	cout << jahreszahl << " ist kein Schaltjahr!" << endl;
	//}

    cout << "Demonstration von Zählschleifen" << endl;
    // Aufgabe: Quadratzahlen von 1 bis 10

	int zaehler;
	for (zaehler = 1; zaehler <= 10; zaehler = zaehler + 1)
	// generelle Aufbau einer for-Schleife ist wie folgt:
	// for (<Initialisierung> ; <Abbruchbedingung> ; <"Inkrement">)
	// die Initialisierung wird EINMALIG VOR Eintritt in die Schleife ausgeführt
	// die Abbruchbedingung wird zu BEGINN jedes Schleifendurchlaufs getestet
	//     Eintritt in die Schleife SOLANGE die Bedingung erfüllt ist
	// das Inkrement wird am ENDE jedes Schleifendurchlaufs ausgeführt
	{
		// wie bei der if-Anweisung wird das zu wiederholende in geschweifte Klammern eingeschlossen
		cout << "Die Quadratzahl von " << zaehler << " ist " << zaehler * zaehler << endl;
	}



	return 0;
}