Wochentag berechnen



  • Hallo,
    ich muss ein Programm schreiben, dass bei Eingabe des Datums (ab 1.1.1900) den Wochentag ausgibt.
    Kann mir da jemand helfen?
    Habe bis jetzt nur das:
    #include <iostream.h>
    #include <conio.h>
    #include <math.h>

    void main()
    {
    int j, s, v, monat,tag;

    cout<<"Bitte geben Sie eine Jahreszahl ein: ";
    cin>>j;

    j=j-1900;
    s=j/4;
    v=j+s;
    tag=v%7;

    if (tag==0)
    {cout<<"Montag";}
    if (tag==1)
    {cout<<"Dienstag";}
    if (tag==2)
    {cout<<"Mittwoch";}
    if (tag==3)
    {cout<<"Donnerstag";}
    if (tag==4)
    {cout<<"Freitag";}
    if (tag==5)
    {cout<<"Samstag";}
    if (tag==6)
    {cout<<"Sonntag";}

    getch();
    }



  • ist nicht ganz so trivial. guck mal hier http://de.wikipedia.org/wiki/Ewiger_Kalender



  • xmx schrieb:

    ...
    Kann mir da jemand helfen?
    Habe bis jetzt nur das:
    ...

    Was stört Dich denn daran ?

    Gruß,

    Simon2.



  • Ich kann damit nur den 1.1. eines Jahres berechnen....
    und das mit "zellers kongruenz" haut bei mir leider nicht ganz hin 😞



  • xmx schrieb:

    und das mit "zellers kongruenz" haut bei mir leider nicht ganz hin 😞

    Och, zeig doch mal den Code dafür, ist ja nur eine (wenn auch lange) Berechnung 🙂

    Du musst halt dein Datum in die entsprechenden Variablen

    Jh 	:= 	Jahrhundert (die ersten beiden Stellen der Gesamt-Jahreszahl)
    J 	:= 	Jahreszahl innerhalb des Jahrhunderts (die letzten beiden Stellen der Gesamt-Jahreszahl)
    M 	:= 	Monat
    Die Monate Januar und Februar werden als 13. bzw. 14. Monat des Vorjahres betrachtet. Das Jahr J ist dann auch um Eins zu reduzieren.
    T 	:= 	Tag
    

    aufteilen, dann nach der Formel rechnen und je nach herauskommender Zahl hast du den Wochentag. Übrigens finde ich's recht erstaunlich, dass schon 1882 die Formel gefunden hat 👍



  • #define     YEAR_DAYS           (365)                   // days in   1 year
    #define     YEAR_DAYS_4         (YEAR_DAYS*4+1)         // days in   4 years
    #define     YEAR_DAYS_100       (YEAR_DAYS_4*25-1)      // days in 100 years
    #define     YEAR_DAYS_400       (YEAR_DAYS_100*4+1)     // days in 400 years
    
    //*****************************************************************************
    //*
    //*     SysWeekday
    //*
    //*****************************************************************************
    //  Returns the Weekday of a Date
    //  uDay    : day of month (1-31)
    //  uMounth : mounth of the year (1=Jan ... )
    //  uYear   : year, values i.e. 2007
    //  Returns 1=Mo 2=Di 3=Mi 4=Do 5=Fr 6=So 7=So
    unsigned SysWeekday(unsigned uDay,unsigned uMonth,unsigned uYear)
    {
    static const unsigned char  ucYearDays[16] = {0%7,306%7,337%7,0%7,31%7,61%7,92%7,122%7,153%7,184%7,214%7,245%7,275%7,365%7,365%7,365%7};
    unsigned                    uVal;
    
        uMonth   = uMonth&0x0F;
        uDay    &= 0x1F;
    
        if(uMonth<3)uYear--;
    
        uVal     =  1;                                      // 1.March.0000 = Mo
        uVal    += (uYear% 4)*YEAR_DAYS;    uYear/=4;
        uVal    += (uYear%25)*YEAR_DAYS_4;  uYear/=25;
        uVal    += (uYear% 4)*YEAR_DAYS_100;uYear/=4;
        uVal    += (uYear   )*YEAR_DAYS_400;
        uVal    += ucYearDays[uMonth];
        uVal    += uDay;
        uVal    %= 7;
    
    return  uVal+1;
    }
    


  • So....die Aufgabenstellung hat sich nun geändert. Jetzt MUSS ich mit "Zellers Kongruenz" die Aufgabe lösen....
    Ich hab da aber ein Problem, dass ich einfach nicht gelöst bekomme, das Schaltjahr!

    a=j%100;
          b=j-a;
          jh=b/100;
    
          wt=(t+((m+1)*26/10)+j+(j/4)+(jh/4)-2*jh)%7;
    
          if (m<=2)
          {wt=wt+1;}
          else {wt=wt-1;}
    
          if (wt==2)
          {cout<<"Montag";}
          if (wt==3)
          {cout<<"Dienstag";}
          if (wt==4)
          {cout<<"Mittwoch";}
          if (wt==5)
          {cout<<"Donnerstag";}
          if (wt==6)
          {cout<<"Freitag";}
          if (wt==0)
          {cout<<"Samstag";}
          if (wt==1)
          {cout<<"Sonntag";}
    


  • Hier steht alles dazu.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Hier steht alles dazu.

    Gruß,

    Simon2.

    Danke! Zwar hab ich das schon gewusst, nur hab ich die Bedingung etwas falsch festgesetzt gehabt. Naja...immerhin hab ich's jetzt 🙂



  • xmx schrieb:

    ...
    Danke! ...immerhin hab ich's jetzt 🙂

    Gern geschehen ! 😉

    Gruß,

    Simon2.


Anmelden zum Antworten