#include using namespace std; bool istSchaltjahr(int jahreszahl) // Aufbau der Kopfzeile einer Funktion ist immer wie folgt: // () // 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; }