Abfrage Datum



  • Ich bin noch ein Anfänger.
    Ich soll das Programm in C++ schreiben.
    Ich weiß nicht was du meinst?



  • @dooni && und || haben auch eine Vorangregelung wie Punkt vor Strichrechnung.

    Deine Februarberechnng ist zu kompliziert.

    Wenn du zu allererst mal die Monate auf Gültigkeit testest, wird der Rest auch einacher.

    packe alles in eine Funktion, die du dann aus main aufrufst.



  • Und diese Funktion sollte einfach nur bool zurückliefern und keine Ausgaben machen.

    PS: Da sind auch noch ein paar logische Fehler in deinem Code.
    Wenn du die Funktion isValidDate geschrieben hast, dann kannst du auch einfache Tests dafür schreiben:

    #include <exception>
    
    void checkDate(bool isValid, int tag, int monat, int jahr)
    {
      if (isValidDate(tag, monat, jahr) != isValid)
        throw std::logic_error("error in isValidDate logic!");
    }
    
    void testDates()
    {
      checkDate(false, 29, 2, 2018);
      checkDate(true, 31, 12, 2018);
    }
    


  • @Th69 Ich soll die Aufgabe mit if Anweisung betrachten.

    #include <iostream>
    
    
    using namespace std;
    
    int main()
    {
    
          int  Tag, Monat, Jahr, tageMonat;
    
          cout <<" Geben Sie einen Tag ein:"<<endl ;
        cin>> Tag;
        cout <<" Geben Sie einen Monat ein:"<<endl ;
        cin>> Monat;
        cout <<" Geben Sie ein Jahr ein:"<<endl ;
        cin>> Jahr;
    
         cout<< " Ueberpruefung des Datums...."<< endl;
    
    if (Tag>=1 && Tag<=tageMonat  )
          {
           if (Monat==4 || Monat==6 || Monat==9 || Monat==11)
          {
          tageMonat=30;
          }
           if (Monat==1 || Monat==3 || Monat==5 || Monat==7 || Monat==8|| Monat==10 || Monat==12)
          {
          tageMonat=31;
          }
            if(Monat==2 && Jahr%4==0 && Jahr%100!=0 || Jahr%400==0)
          {
          tageMonat=29;
          }
          if(Monat==2 && Jahr%4!=0 || Jahr%100==0 && Jahr%400!=0)
          {
          tageMonat=28;
          }
    
    
    
          cout<<"gueltig"<<endl;
          }
    
     else{
    
        cout<<" Ungueltiges Datum! "<<endl;
          }
    
    
    return 0;}
    
    

    Was ich immer eingebe, kommt raus, das der Datum gültig ist.
    Habe ich da einen Denkfehler?



  • @dooni sagte in Abfrage Datum:

    Habe ich da einen Denkfehler?

    Ja.
    Welchen Wert hat tageMonat in Zeile 20?



  • @dooni sagte in Abfrage Datum:

    @Th69 Ich soll die Aufgabe mit if Anweisung betrachten.

    Ja und? Informiere dich, wie Funktionen funktionieren und in diesen kannst du dann jede mögliche Anweisung (also auch if) benutzen.

    Und welche IDE benutzt du? Am besten du gehst mal Zeile für Zeile mit dem Debugger durch deinen Code.



  • @DirkB
    In der Zeile 20 hat tageMonat keine Zahl
    er vergleicht nur ob die Zahl des Tages kleiner gleich als der Wert des tageMonates



  • @Th69
    Ich verwende Code::Blocks



  • @dooni

    #include <iostream>
    using namespace std;
    int main()
    {
    
    
    
        int Jahr;
        int Monat;
        int Tag;
    
        cout <<" Geben Sie einen Tag ein:"<<endl ;
        cin>> Tag;
        cout <<" Geben Sie einen Monat ein:"<<endl ;
        cin>> Monat;
        cout <<" Geben Sie ein Jahr ein:"<<endl ;
        cin>>Jahr;
    
           if ((Monat==4 || Monat==6 || Monat==9 || Monat==11)&&( Tag>=1)&&(Tag<=30))
          {
    
          cout<<"gueltig"<< endl;
          }
          else{
            cout<<"ungueltig"<<endl;
          }
    
    return 0;
          }
    
    

    Mit eine Anweisung hat es funktioniert



  • @dooni sagte in Abfrage Datum:

    @DirkB
    In der Zeile 20 hat tageMonat keine Zahl
    er vergleicht nur ob die Zahl des Tages kleiner gleich als der Wert des tageMonates

    Nur hat tageMonates zu dem Zeitpunkt keinen gültigen Wert. Er kann 0 sein, muss es aber nicht.

    @dooni sagte in Abfrage Datum:

    Mit eine Anweisung hat es funktioniert

    if (Tag<1 || Tag > 31) {
       cout<<"ungueltig"<<endl;
    } else if (Monat<1 || Monat>12) {
      cout<<"ungueltig"<<endl;
    } else if (...) {
          .....
    } else 
     cout<<"gueltig"<<endl;
    }
    


  • @DirkB
    Danke für die Hilfe, hat alles soweit geklappt



  • Was hältst Du von folgendem Weg:

    ...
    int erlaubteTage[] = (0, // Dummy
                         31, // Januar
                         29, // Februar
                         31, //usw.
                         30, 31, 30, 31, 31, 30, 31, 30, 31);
    
    if(Monat < 1 || Monat > 12)
      // ungültig
    
    if(Tag < 1 || Tag > erlaubteTage[Monat])
     // ungültig
    
    if(Tag == 29 && Monat == 2)
    {
      if(Jahr % 4 <> 0)
         // ungültig
      else if(Jahr % 100 == 0 && Jahr % 400 <> 0)
        // ungültig
    }
    
    // Was bis hierher nicht ungültig ist, ist gültig!
    


  • Hallo doni!

    Mit dem Schaltjahr verhält es sich so:
    Wenn Jahreszahl ohne Rest durch Vier teilbar ist,
    ist die Jahreszahl ein Schaltjahre.

    Ausnahme 1:
    Wenn die Jahreszahl ausserdem durch 100 teilbar ist, dann
    liegt kein Schaltjahr vor(sp=0). Also zum Beispiel das Jahr 1900 war kein Schaltjahr.
    Es ist durch 4 ohne Rest teilbar, auch durch 100, nicht aber durch 400.

    Ausnahme von der Ausnahme1:
    Wenn die Jahreszahl durch 400 teilbar ist, liegt doch
    ein Schaltjahr vor(sp=1). Das Jahr 2000 war ein solches Jahr, Durch 400, 100 und durch 4 teilbar.

    Erstens hast du ein UND(Bitoperation in Zeile 49.
    Sie dir zum Beispiel folgende Funktion dafür an:

    int leapyear(int jhr)
    {
    /**
    * Wenn Jahreszahl ohne Rest durch Vier teilbar ist,
    * ist die Jahreszahl ein Schaltjahre.
    * Ausnahme1:
    * Wenn die Jahreszahl ausserdem durch 100 teilbar ist, dann
    * liegt kein Schaltjahr vor(sp=0).
    * Ausnahme von der Ausnahme1:
    * Wenn die Jahreszahl durch 400 teilbar ist, liegt doch
    * ein Schaltjahr vor(sp=1).
    */
    int dsp = 0, s1, s2, s3;
    
    s1 = jhr % 4;
    s2 = jhr % 400;
    s3 = jhr % 100;
    
    if ((s1 == 0) || (s2 == 0))  dsp = 1;     // Bei diesen beiden 
    if ((s2 != 0) && (s3 == 0))  dsp = 0;  // Zeilen liegt der Hund begraben
    
    return dsp;
    }
    
    

    Bei 2016 ist die Jahreszahl nur durch 4, nicht aber durch 400 oder 100 teilbar.
    Nun was für neugierige:
    Auf dem Konzil von Nicäa (325 n. Chr.) wurde festgelegt, dass Ostern immer auf den Sonntag nach dem ersten Frühlingsvollmond fällt. Da die Dauer eines Jahres kein Vielfaches der Dauer eines Mondumlaufs um die Erde ist, wird Ostern zu einem beweglichen Fest zwischen dem 22. März und 25. April eines jeden Jahres. Weitere kirchliche Feiertage leiten sich aus dem Ostersonntag ab. So ist Aschermittwoch 46 Tage vor Ostersonntag. Christi Himmelfahrt ist 39 Tage, Pfingstsonntag 49 Tage und Fronleichnam 60 Tage nach Ostersonntag. Diese Regeln gelten bis heute! Zu Beachten ist allerdings: Die Vollmondrechnung für Ostern basiert auf einer kirchlichen Vollmondrechnung und nicht auf der astronomischen Vollmondrechnung!

    Um Das Osterdatum zu berechnen gibt es den
    Butcher'schen Osteralgorithmus ```cpp
    /*Butcher'sche Osteralgorithmus */
    void ostern(int jahr, int (*tag), int (*monat))
    {
    int a,b,c,d,e,f,g,h,i,k,l,m,n,p;

    a = jahr % 19;
    b = jahr / 100;
    c = jahr % 100;

    d = b / 4;
    e = b % 4;
    f = (b + 8 ) / 25;

    g = (b - f + 1) / 3;
    h = ((19*a) + b -d -g +15) % 30;
    i = c / 4;

    k = c % 4;
    l = (32 +(2e) + (2i) -h -k) % 7;
    m = (a + (11h) + (22l))/ 451;

    n = (h+l-(7m)+114)/31;
    p = ((h+l-(7
    m)+114) % 31) + 1;
    *tag = p;
    *monat = n;
    }

    
    Aber ich will euch nicht die ganze Arbeit abnehmen.


  • Ah, das nennt man Säkularjahrregel! Zum Nachlesen und Verstehen: Säkularjahr



  • Ja!

    Weil Weihnachten vor der Tür steht, noch ein kleiner Tipp.
    Viele haben oft gefragt, wie die Regel zum ersten Advent ist.
    Der erste Sonntag NACH dem 26ten November ist der erste Advent.
    Beispiel letztes Jahr 2017. Da fiel der heilige Abend auf einen Sonntag.
    der erste Advent war der 3te Dezember.
    Genau genommen ist dann bis 12 Uhr der Vormittag des 24ten, der ein Sonntag war
    der vierte Advent. Danach ist Heilig Abend. Deshalb, weil 2017 der 26te November ein
    Sonntag war.

    Das gab es im Internet zu lesen:
    Am Sonntag den 26. November 1038 machte der damalige römisch-deutsche Kaiser Konrad II. (990 bis 1039) auf dem Weg von Burgund nach Goslar Halt in Straßburg. Er besuchte dort den Bischof, seinen Onkel Wilhelm. Der hatte eigentlich geplant, mit der Ankunft des Kaisers den ersten Advent zu feiern. Doch es kam anders.

    "Der Kaiser und seine Umgebung waren damit nicht einverstanden", schreibt der Historiker Herwig Wolfram in seinem Buch "Konrad II.". Dieses Ereignis bestimmt noch heute den Beginn des Advents.

    Hätten Konrad und Wilhelm den 1. Advent bereits am 26. November gefeiert, hätte es insgesamt fünf Adventssonntage gegeben - einen mehr als von Papst Gregor dem Großen gut 400 Jahre zuvor vorgegeben. Bis zum kaiserlichen Besuch bei Bischof Wilhelm stand nur die Zahl der Adventssonntage fest, ein Datum war nicht festgelegt. Das sorgte für Diskussionen über die Länge der Adventszeit. Advent ist die Abkürzung des lateinischen "Adventus Domini" - die "Ankunft des Herrn" und bezeichnet die Zeit, in der sich die Christen auf das Fest der Geburt Jesu vorbereiten.

    Damit lassen sich alle christlichen (römisch katholische) Feiertage berechnen.
    Was ich allerdings nicht weis, wie die kirchliche Vollmondrechnung aussieht.

    Da bei mir der Religionsunterricht so um 1976 war, kann ich damit leider nicht dienen.
    Hab ich leider vergessen!



  • PS: Dann kann wenigstens der Glühweinkonsum nicht über Hand nehmen (hi)!


Anmelden zum Antworten