#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;
	}
}

// Forward declaration - vorweggenommene/vorwärts Deklaration
// diese gibt dem Compiler an, dass es Funktion gibt,
// die den Namen xyz hat und die Parameter abc und def erwartet
int tageImMonat(int, int);
// bei Vorwärtsdeklarationen von Funktionen können wir die Variablennamen
// weglassen (diese werden vom Compiler (an dieser Stelle) ignoriert)
// Wenn dadurch an dieser Stelle der Sinn der Funktion verschleiert wird,
// sollten Sie die Variablennamen jedoch unbedingt angeben
// konkret: in diesem Beispiel hätte man die Variablennamen besser angeben sollen

bool datumIstGueltig(int tag, int monat, int 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 (tageszahlOK(tag,tageImMonat(monat,jahr)))
		{
			return true;
		}
		else
		{
			return false;
		}
	} // Monat liegt zwischen 1 und 12
	else
	{
		return false;
	}
}


int tageImMonat(int monat, int jahr)
// Eingabe: eine Monatszahl, eine Jahreszahl
// Ausgabe: 28/29/30/31 bei gültigen Kombinationen, 31 sonst
{
	if (monat == 2)
	{
		if (istSchaltjahr(jahr))
		{
			return 29;
		}
		else
		{
			return 28;
		}
	} // 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
	{
		return 30;
	}
	else // es ist ein Monat mit 31 Tagen
	{
		return 31;
	}
}

void ausgabeDatumIstGueltig(void)
// nur als Beispiel für eine Funktion ohne Parameter und ohne Rückgabewert
{
	cout << "Das Datum ist gueltig!" << endl;
}

void ausgabeDatumIstNichtGueltig(void)
// nur als Beispiel für eine Funktion ohne Parameter und ohne Rückgabewert
{
	cout << "Das Datum ist nicht gueltig!" << endl;
}

int anzahlDerTageSeitJahresanfang(int tag, int monat, int jahr)
{
	// die Prüfung, ob das Datum tag.monat.jahr gültig ist, wird hier nicht überprüft
	// Rückgabewert: bei gültigem Datum die Anzahl der Tage seit dem 1.1.jahr
	// bei unklarer Sachlage, immer angeben, was genau passiert, hier z.B.
	// Rückgabewert beim 1.1.jahr = 1
	int mm;
	int anzDerTage = 0;
	for (mm = 1; mm < monat; mm = mm + 1)
	// zur Erinnerung: for (Initialisierung; Abbruchbedg.; Inkrement)
	// Beachte: ist die Bedingung schon zu Beginn verletzt, wird die Schleife
	// garnicht betreten, sondern gleich bei der zugehörigen "}" fortgesetzt
	{
		anzDerTage = anzDerTage + tageImMonat(mm, jahr);
	}
	anzDerTage = anzDerTage + tag;
	return anzDerTage;
	// Argumente für/wider for (int xyz= ...) oder int xyz; for (xyz= ...)
	// - im ersten Fall gilt das xyz nur bis zum Ende der for-Schleife
	// - im zweiten Fall auch danach
	// Problematik: so sollte es sein, aber nicht alle Compiler halten sich dran
	// deshalb: keine Variablendeklaration im Initailisierungsteil der for-Schleife
}

int anzahlDerTageZwischenAundB(int tagA, int monatA, int jahrA, int tagB, int monatB, int jahrB)
// liefert für zwei Datumsangaben A und B die Anzahl der Tage zwischen A (exkl.) und B (inkl.)
{
	int anzDerTage = 0;
	if (jahrA == jahrB)
	{
		anzDerTage = anzahlDerTageSeitJahresanfang(tagB,monatB,jahrB)
			       - anzahlDerTageSeitJahresanfang(tagA,monatA,jahrA);
		return anzDerTage;
	}
	else if (jahrA < jahrB)
	{
		int jj;
		if (istSchaltjahr(jahrA))
		{
			anzDerTage = 366 - anzahlDerTageSeitJahresanfang(tagA,monatA,jahrA);
		}
		else
		{
			anzDerTage = 365 - anzahlDerTageSeitJahresanfang(tagA,monatA,jahrA);
		}
		for (jj = jahrA + 1; jj <= jahrB - 1; jj = jj + 1)
		{
			if (istSchaltjahr(jj))
			{
				anzDerTage = anzDerTage + 366;
			}
			else
			{
				anzDerTage = anzDerTage + 365;
			}
		}
		anzDerTage = anzDerTage + anzahlDerTageSeitJahresanfang(tagB,monatB,jahrB);
		return anzDerTage;
		// noch selbst einfügen, was passiert, wenn die Monate/Tage voreinander liegen
	}
	else // jahrA > jahrB
	{
		// return 0; // nur, weil's jetzt schnell geht, nicht, weil es hübsch ist
		return - anzahlDerTageZwischenAundB(tagB,monatB,jahrB,tagA,monatA,jahrA);
		// eine Möglichkeit
	}
}

int main(void)
{
	int tag, monat, jahr, tagB, monatB, jahrB;
	cout << "Gib bitte einen Tag Monat und Jahr ein: ";
	cin >> tag >> monat >> jahr;
	cout << "Gib bitte noch einen Tag Monat und Jahr ein: ";
	cin >> tagB >> monatB >> jahrB;

	//if (datumIstGueltig(tag,monat,jahr))
	//{
	//	ausgabeDatumIstGueltig();
	//}
	//else
	//{
	//	ausgabeDatumIstNichtGueltig();
	//}

	//cout << "Tage seit dem " << tag << "." << monat << "." << jahr
	//	 << " = " << anzahlDerTageSeitJahresanfang(tag,monat,jahr) << endl;

    cout << "Tage zwischen dem " << tag << "." << monat << "." << jahr
		 << " und dem " << tagB << "." << monatB << "." << jahrB << " sind "
		 << anzahlDerTageZwischenAundB(tag,monat,jahr,tagB,monatB,jahrB) << endl;

	return 0;
}