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 Zurück  1, 2, 3, 4, 5
  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 03:15:42 02.11.2011   Titel:              Zitieren

... und nun für Fanatiker:

http://de.wikipedia.org/wiki/Schaltsekunde
Zitat:
Die Anweisung, eine Schaltsekunde einzufügen, wird immer dann gegeben, wenn für die nächste Zukunft zu erwarten ist, dass der Unterschied zwischen UTC und UT1 über 0,9 Sekunden anwächst. Nach 23:59:59 UTC der genannten Tage wird eine zusätzliche Sekunde bei 23:59:60 eingefügt, bevor die Uhr auf 00:00:00 des Folgetages vorrückt. Das bedeutet, dass der Tag mit der Schaltsekunde aus 86401 Atomsekunden, statt der üblichen 86400, besteht.


http://de.wikipedia.org/wiki/Erdrotation
Zitat:
Die durchschnittliche Dauer einer Umdrehung bezüglich des als ruhend angenommenen kosmischen Hintergrundes – der mittlere siderische Tag – beträgt 23 h 56 min 4,10 s ... Die Zeitspanne, die die Erde braucht, um nach einer Umdrehung wieder dieselbe Stellung bezüglich des Frühlingspunktes einzunehmen, ist ein Sterntag. Deshalb dauert ein Sterntag nur 23 h 56 min 4,09 s. Die Präzession der Erde hingegen ist der Grund dafür, dass ein siderischer Tag etwa 8 Millisekunden länger ist als ein Sterntag.

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

Benutzerprofil
Anmeldungsdatum: 18.09.2007
Beiträge: 1076
Beitrag Mr X Mitglied 10:19:56 02.11.2011   Titel:              Zitieren

Erhard Henkes schrieb:
Jetzt muss ich dich in die Schranken weisen. :D
Das ist ja ein Denken wie bei "1984".

So machen wir es, damit wir die Zeit vor 2000 auch korrekt abdecken:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
static uint16_t days[12] = {  0,  31,  59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

static bool isLeapyear(uint16_t year)
{
    return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}

// Gregorian calender started 15th October 1582
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    day += 6; // 1.1.1600 was a saturday
    day += (year/*-1600*/) * 146097.0/400.0 + days[month-1];   

    if (isLeapyear(year) && (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
static uint16_t days[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

static bool isLeapyear(uint16_t year)
{
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}

// Gregorian calender started 15th October 1582
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
day += 6; // 1.1.1600 was a saturday
day += (year/*-1600*/) * 146097.0/400.0 + days[month-1];

if (isLeapyear(year) && (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
static uint16_t days[12] = {  0,  31,  59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

static bool isLeapyear(uint16_t year)
{
    return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}

// Gregorian calender started 15th October 1582
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    day += 6; // 1.1.1600 was a saturday
    day += (year/*-1600*/) * 146097.0/400.0 + days[month-1];   

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

    return ( day % 7 + 1 );
}


Die Fließkommaoperationen könnte man sich doch bei der Variante sparen, oder?
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 24356
Beitrag volkard Moderator 10:32:18 02.11.2011   Titel:              Zitieren

Mr X schrieb:
Die Fließkommaoperationen könnte man sich doch bei der Variante sparen, oder?

Sagen wir mal, wir wollen nur die Division durch 100 bezahlen. Die anderen sind dann nur /4 und sehr billig.
jhd=jahr/100;//bezahlt
rest=jahr%100;//gibt es kostenlos dazu
Jedes Jahr hat 365 Tage. tage=jahr*365;
Jedes vierte Jahr hat einen mehr. tage+=jahr/4;
Jedes hundertste hat einen weniger. tage-=jhd;
Jedes vierhundertste hat einen mehr. tage+=jhd/4.

Für die Schaltjahresberechnung haben wir schon zwei Divisionen bezahlt. Die könnte man wohl einsparen, wenn man sich die Variablen jhd und rest teilt; es bleibt nur noch eine Division übrig, die man insgesamt bezahlt. Und die wird zu einer Multiplikation, weil der Divisor compilezeitkonstant ist.

_________________
http://www.venganza.info/
plonk fürs Forum v1.02
Shiba
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2002
Beiträge: 199
Beitrag Shiba Mitglied 14:19:27 02.11.2011   Titel:   [OT] @E. Henkes            Zitieren

Auf Deiner Webseite hat Du eine Unterseite zur Chemie.
Meine Anmerkung zum 1. Absatz "Physik liefert die Elementarteilchen für die Chemie":
Nein, so kann man das nicht sehen, sondern:
Chemie ist die Physik der ersten Elektronenschale :D
(Bitte nicht nach Orbitalen fragen :o) )

Zu Deinem Datumsproblem, empfehl ich Dir:
http://manfred.wilzeck.de/Datum_berechnen.html


Zuletzt bearbeitet von Shiba am 14:25:49 02.11.2011, insgesamt 1-mal bearbeitet
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 00:49:34 03.11.2011   Titel:              Zitieren

Zitat:
Chemie ist die Physik der ersten Elektronenschale

Schau dir mal Elektronen in inneren d-Schalen an bei Übergangsmetallkomplexen (Ligandenfeldtheorie), dann siehst du, dass deine Aussage nicht korrekt ist. ;)

Zitat:

Zu Deinem Datumsproblem, empfehl ich Dir:
http://manfred.wilzeck.de/Datum_berechnen.html

... und ich dachte immer meine Homepage wäre schwierig lesbar. Das ist echt der Hammer. Die muss gut sein. ;)

Übrigens haben wir kein Problem, unsere Funktion arbeitet korrekt. Das Hauptproblem ist noch, dass sie zu oft aufgerufen wird. Das werden wir ändern. Wenn diese später einmal pro Tag angesprochen wird und nicht jede Sekunde, benötigen wir da keine ausgefeilte Performance-Optimierung. :)

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


Zuletzt bearbeitet von Erhard Henkes am 00:50:19 03.11.2011, insgesamt 1-mal bearbeitet
neuer_user
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.12.2010
Beiträge: 210
Beitrag neuer_user Mitglied 12:58:57 03.11.2011   Titel:              Zitieren

Zitat:
Zitat:
Chemie ist die Physik der ersten Elektronenschale

Schau dir mal Elektronen in inneren d-Schalen an bei Übergangsmetallkomplexen (Ligandenfeldtheorie), dann siehst du, dass deine Aussage nicht korrekt ist. ;)

in der schule wird aber immer gesagt
Zitat:
Chemie ist die Physik der ersten Elektronenschale
:live: :live: :D
Shiba
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2002
Beiträge: 199
Beitrag Shiba Mitglied 16:46:51 03.11.2011   Titel:              Zitieren

Physiker sehen das im Allgemeinen auch so.
Besonders Feststoffphysiker.
Aber Physiker pflegen auch ein spezielles Verhältnis zu Chemikern. ;)


Zuletzt bearbeitet von Shiba am 16:48:22 03.11.2011, insgesamt 1-mal bearbeitet
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 20:46:48 03.11.2011   Titel:              Zitieren

Zitat:
in der schule wird aber immer gesagt

Da reden Lehrer, die nehmen es nicht so genau und sind zumeist mehrere Jahrzehnte hinter dem aktuellen Wissensstand zurück. :D

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

Benutzerprofil
Anmeldungsdatum: 28.12.2010
Beiträge: 210
Beitrag neuer_user Mitglied 21:15:28 03.11.2011   Titel:              Zitieren

einer von denen glaube ich nicht :D
Erhard Henkes
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2000
Beiträge: 11924
Beitrag Erhard Henkes Mitglied 21:50:12 03.11.2011   Titel:              Zitieren

MrX hat auf integer umgebaut:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    day += 6; // 1.1.1600 was a saturday
    day += (year/*-1600*/ * 146097)/400 + days[month-1];   

    if (isLeapyear(year) && (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
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
day += 6; // 1.1.1600 was a saturday
day += (year/*-1600*/ * 146097)/400 + days[month-1];

if (isLeapyear(year) && (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
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int32_t day)
{
    day += 6; // 1.1.1600 was a saturday
    day += (year/*-1600*/ * 146097)/400 + days[month-1];   

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

    return (day % 7 + 1);
}



Kleine Testvariante:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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
53
54
55
#include "stdio.h"
 
int days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
 
int isLeapyear(int year)
{
    return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}
 
int calculateWeekdayFloat(int year, int month, int day)
{
    day += 6; // 1.1.1600 was a saturday
    day += year/*-1600*/ * 365.2425 + days[month-1];
 
    if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
    {
        day--;
    }
 
    return (day % 7 + 1);
}
 
int calculateWeekdayInteger(int year, int month, int day)
{
    day += 6; // 1.1.1600 was a saturday
    day += (year/*-1600*/ * 146097)/400 + days[month-1];
 
    if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
    {
        day--;
    }
 
    return (day % 7 + 1);
}
 
int main()
{
    int y,m,d;
    for (y=0; y<=12000; y++)
    {
        printf("%u ", y);
        for (m=1; m<=12; m++)
        {
            for (d=1; d<=31; d++)
            {
                if (calculateWeekdayFloat(y,m,d) == (calculateWeekdayInteger(y,m,d))){}
                else
                {
                    printf("fehler ");
                    for(;;);
                }
            }
        }
    }
}
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "stdio.h"

int days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

int isLeapyear(int year)
{
return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}

int calculateWeekdayFloat(int year, int month, int day)
{
day += 6; // 1.1.1600 was a saturday
day += year/*-1600*/ * 365.2425 + days[month-1];

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

return (day % 7 + 1);
}

int calculateWeekdayInteger(int year, int month, int day)
{
day += 6; // 1.1.1600 was a saturday
day += (year/*-1600*/ * 146097)/400 + days[month-1];

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

return (day % 7 + 1);
}

int main()
{
int y,m,d;
for (y=0; y<=12000; y++)
{
printf("%u ", y);
for (m=1; m<=12; m++)
{
for (d=1; d<=31; d++)
{
if (calculateWeekdayFloat(y,m,d) == (calculateWeekdayInteger(y,m,d))){}
else
{
printf("fehler ");
for(;;);
}
}
}
}
}
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "stdio.h"
 
int days[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
 
int isLeapyear(int year)
{
    return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));
}
 
int calculateWeekdayFloat(int year, int month, int day)
{
    day += 6; // 1.1.1600 was a saturday
    day += year/*-1600*/ * 365.2425 + days[month-1];
 
    if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
    {
        day--;
    }
 
    return (day % 7 + 1);
}
 
int calculateWeekdayInteger(int year, int month, int day)
{
    day += 6; // 1.1.1600 was a saturday
    day += (year/*-1600*/ * 146097)/400 + days[month-1];
 
    if (isLeapyear(year) && (month < 2 || (month == 2 && day <= 28)))
    {
        day--;
    }
 
    return (day % 7 + 1);
}
 
int main()
{
    int y,m,d;
    for (y=0; y<=12000; y++)
    {
        printf("%u ", y);
        for (m=1; m<=12; m++)
        {
            for (d=1; d<=31; d++)
            {
                if (calculateWeekdayFloat(y,m,d) == (calculateWeekdayInteger(y,m,d))){}
                else
                {
                    printf("fehler ");
                    for(;;);
                }
            }
        }
    }
}

Dürfte also klappen.

_________________
OS-Development-, C++, Win32-API-, MFC-, Chemie-, Robotik- und Flugsimulator-Tutorials
http://www.henkessoft.de/index.htm
C/C++ Forum :: Projekt: OS-Development  ::  Funktion zur Berechnung des Wochentages  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5
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.