Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Projekt: OS-Development  ::  Funktion zur Berechnung des Wochentages  
Gehen Sie zu Seite 1, 2, 3, 4, 5  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 22:34:22 01.11.2011   Titel:   Funktion zur Berechnung des Wochentages            Zitieren

Bin gerade über diese Funktion gestolpert:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    day += 6; // 1.1.2000 was a saturday
    day += (year-2000)*365.25;
    if (month > 11)
        day+=334;
    else if (month > 10)
        day+=304;
    else if (month > 9)
        day+=273;
    else if (month > 8)
        day+=243;
    else if (month > 7)
        day+=212;
    else if (month > 6)
        day+=181;
    else if (month > 5)
        day+=151;
    else if (month > 4)
        day+=120;
    else if (month > 3)
        day+=90;
    else if (month > 2)
        day+=59;
    else if (month > 1)
        day+=31;

    if (year%4 == 0 && (month < 2 || (month == 2 && day <= 28)))
    {
        day--;
    }

    return (day%7+1);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
day += 6; // 1.1.2000 was a saturday
day += (year-2000)*365.25;
if (month > 11)
day+=334;
else if (month > 10)
day+=304;
else if (month > 9)
day+=273;
else if (month > 8)
day+=243;
else if (month > 7)
day+=212;
else if (month > 6)
day+=181;
else if (month > 5)
day+=151;
else if (month > 4)
day+=120;
else if (month > 3)
day+=90;
else if (month > 2)
day+=59;
else if (month > 1)
day+=31;

if (year%4 == 0 && (month < 2 || (month == 2 && day <= 28)))
{
day--;
}

return (day%7+1);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    day += 6; // 1.1.2000 was a saturday
    day += (year-2000)*365.25;
    if (month > 11)
        day+=334;
    else if (month > 10)
        day+=304;
    else if (month > 9)
        day+=273;
    else if (month > 8)
        day+=243;
    else if (month > 7)
        day+=212;
    else if (month > 6)
        day+=181;
    else if (month > 5)
        day+=151;
    else if (month > 4)
        day+=120;
    else if (month > 3)
        day+=90;
    else if (month > 2)
        day+=59;
    else if (month > 1)
        day+=31;

    if (year%4 == 0 && (month < 2 || (month == 2 && day <= 28)))
    {
        day--;
    }

    return (day%7+1);
}

So richtig elegant sieht das noch nicht aus. Vielleicht hat jemand eine bessere Idee, wie man das kompakt lösen kann.

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
Beitrag dot Mitglied 22:38:58 01.11.2011   Titel:              Zitieren

http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Wochentagsformel
:confused:

_________________
one point of view will never reveal the entire scene.
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 22:45:25 01.11.2011   Titel:              Zitieren

Das sieht ja noch schrecklicher aus. :D

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
Beitrag dot Mitglied 22:49:31 01.11.2011   Titel:              Zitieren

Ist aber korrekt ;) (im Gegensatz zu obiger Funktion)

_________________
one point of view will never reveal the entire scene.
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 22:56:39 01.11.2011   Titel:              Zitieren

Kannst du das nach C übersetzen mit obigen Parametern?

Hier im Forum gefunden:
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
dayofweek(int y, int m, int d)      /* 0 = Sonntag */
                                    /* 1 <= m <= 12,  y > 1752 oder so */

{
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

    y -= m < 3;

  return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
dayofweek(int y, int m, int d) /* 0 = Sonntag */
/* 1 <= m <= 12, y > 1752 oder so */

{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

y -= m < 3;

return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
dayofweek(int y, int m, int d)      /* 0 = Sonntag */
                                    /* 1 <= m <= 12,  y > 1752 oder so */

{
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};

    y -= m < 3;

  return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}


Zitat:
im Gegensatz zu obiger Funktion

Bisher wurde der Wochentag korrekt berechnet, aber ich traue der sache auch nicht.

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm


Zuletzt bearbeitet von Erhard Henkes am 23:02:54 01.11.2011, insgesamt 2-mal bearbeitet
dot
Mitglied

Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
Beitrag dot Mitglied 23:01:36 01.11.2011   Titel:              Zitieren

Erhard Henkes schrieb:
Bisher wurde der Wochentag korrekt berechnet, aber ich traue der sache auch nicht.

Im Jahr 2100 stimmts nimmer, soweit ich das sehen kann, das ist nämlich kein Schaltjahr ;)

_________________
one point of view will never reveal the entire scene.


Zuletzt bearbeitet von dot am 23:02:24 01.11.2011, insgesamt 2-mal bearbeitet
neuer_user
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.12.2010
Beiträge: 210
Beitrag neuer_user Mitglied 23:22:48 01.11.2011   Titel:              Zitieren

ich hab mal so angefangen:
EDIT: (angefangen heißt nicht fertig :D )
EDIT2: ist auch irgendwie falsch
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    //1.1.2000 was Saturday
    size_t day_ = 0;
   
    int32_t diff_day = 1-day;
    int32_t diff_year = 2000-year;


    uint8_t schaltjahr[diff_year+1];
    for(int i = 0;i < diff_year+1;i++)
    {
        if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
            schaltjahr[i] = 1;
        else
            schaltjahr[i] = 0;
    }
    if(diff_year > 0)
    {
        for(int i = 0;i < diff_year;i++)
        {
            day_ += 365+schaltjahr[i];
        }
    }
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 0;

int32_t diff_day = 1-day;
int32_t diff_year = 2000-year;


uint8_t schaltjahr[diff_year+1];
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    //1.1.2000 was Saturday
    size_t day_ = 0;
   
    int32_t diff_day = 1-day;
    int32_t diff_year = 2000-year;


    uint8_t schaltjahr[diff_year+1];
    for(int i = 0;i < diff_year+1;i++)
    {
        if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
            schaltjahr[i] = 1;
        else
            schaltjahr[i] = 0;
    }
    if(diff_year > 0)
    {
        for(int i = 0;i < diff_year;i++)
        {
            day_ += 365+schaltjahr[i];
        }
    }
}


Zuletzt bearbeitet von neuer_user am 23:33:51 01.11.2011, insgesamt 2-mal bearbeitet
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 23:30:30 01.11.2011   Titel:              Zitieren

da kommt noch kein Wochentag zurück ^^

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 23:36:55 01.11.2011   Titel:              Zitieren

Es ist interessant, wenn man höhere Jahreszahlen mit Emulatoren oder Windows testen will:

- qemu bricht sofort beim Start zusammen (ganz erbärmlich)
- Datum/Zeit von Win XP endet im Jahr 2099 (Unverschämtheit!)
- der GNU-Compiler gerät aus dem Takt, wenn man 2099 einstellt (merkwürdig)

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm


Zuletzt bearbeitet von Erhard Henkes am 23:56:45 01.11.2011, insgesamt 1-mal bearbeitet
neuer_user
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.12.2010
Beiträge: 210
Beitrag neuer_user Mitglied 23:47:31 01.11.2011   Titel:              Zitieren

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    //1.1.2000 was Saturday
    size_t day_ = 5;
    int32_t diff_year = year-2000;
    uint8_t schaltjahr[diff_year+1];

    //calculate Schaltjahre
    for(int i = 0;i < diff_year+1;i++)
    {
        if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
            schaltjahr[i] = 1;
        else
            schaltjahr[i] = 0;
    }
   
    //add days of diff. of years
    if(diff_year > 0)
    {
        for(int i = 0;i < diff_year;i++)
        {
            day_ += 365+schaltjahr[i];
        }
    }
   
    //Month
    if(month > 1)
    {
        for(int i = 0;i < month-1;i++)
        {
            if(month-1+i == 2)
            {
                if(schaltjahr[year])
                    day_ += 29;
                else
                    day_ += 28;
            }
            else
            {
                if((month-1+i)%2 == 1)
                    day_ += 31;
                else
                    day_ += 30;
            }
        }
    }
   
    //add diff.day
    day_ += day-1;
   
    return day_%7;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
//1.1.2000 was Saturday
size_t day_ = 5;
int32_t diff_year = year-2000;
uint8_t schaltjahr[diff_year+1];

//calculate Schaltjahre
for(int i = 0;i < diff_year+1;i++)
{
if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
schaltjahr[i] = 1;
else
schaltjahr[i] = 0;
}

//add days of diff. of years
if(diff_year > 0)
{
for(int i = 0;i < diff_year;i++)
{
day_ += 365+schaltjahr[i];
}
}

//Month
if(month > 1)
{
for(int i = 0;i < month-1;i++)
{
if(month-1+i == 2)
{
if(schaltjahr[year])
day_ += 29;
else
day_ += 28;
}
else
{
if((month-1+i)%2 == 1)
day_ += 31;
else
day_ += 30;
}
}
}

//add diff.day
day_ += day-1;

return day_%7;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    //1.1.2000 was Saturday
    size_t day_ = 5;
    int32_t diff_year = year-2000;
    uint8_t schaltjahr[diff_year+1];

    //calculate Schaltjahre
    for(int i = 0;i < diff_year+1;i++)
    {
        if((2000+i)%4 == 0 && ((2000+i)%100 != 0 || (2000+i)%400 == 0))
            schaltjahr[i] = 1;
        else
            schaltjahr[i] = 0;
    }
   
    //add days of diff. of years
    if(diff_year > 0)
    {
        for(int i = 0;i < diff_year;i++)
        {
            day_ += 365+schaltjahr[i];
        }
    }
   
    //Month
    if(month > 1)
    {
        for(int i = 0;i < month-1;i++)
        {
            if(month-1+i == 2)
            {
                if(schaltjahr[year])
                    day_ += 29;
                else
                    day_ += 28;
            }
            else
            {
                if((month-1+i)%2 == 1)
                    day_ += 31;
                else
                    day_ += 30;
            }
        }
    }
   
    //add diff.day
    day_ += day-1;
   
    return day_%7;
}


Ich hab das noch nicht überprüft aber bei Montag sollte 0 rauskommen


Zuletzt bearbeitet von neuer_user am 23:49:29 01.11.2011, insgesamt 1-mal bearbeitet
C/C++ Forum :: Projekt: OS-Development  ::  Funktion zur Berechnung des Wochentages  
Gehen Sie zu Seite 1, 2, 3, 4, 5  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.