Funktion zur Berechnung des Wochentages
-
Aber ich glaube, es wird doch
static uint8_t calculateWeekday(uint16_t year, uint8_t month, int8_t day){ return (calculateDaysFromDate(year,month,day)+3)%7; }
Man will ja auch die Differenz zwischen zwei Daten ausrechnen können. DIe +3 ist geraten. Das %7, damit Tage bei 0 beginnen wie rechtschaffene enums und Arrayindizes.
-
@Volkard: vielen Dank!
http://www.c-plusplus.net/forum/p2139077#2139077Hier sieht man sehr schön die Repetition:
http://de.wikipedia.org/w/index.php?title=Datei:Ewiger_Kalender_gregorianisch.svg&filetimestamp=20110916201156
-
Oder so: Die Schaltjahre wiederholen sich alle 400 Jahre.
Diese 400 Jahre haben 365.2425*400=146097 Tage.
Und 146097 ist zufällig durch 7 teilbar.
-
Right Sir!
-
... und nun für Fanatiker:
http://de.wikipedia.org/wiki/Schaltsekunde
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
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.
-
Erhard Henkes schrieb:
Jetzt muss ich dich in die Schranken weisen.
Das ist ja ein Denken wie bei "1984".So machen wir es, damit wir die Zeit vor 2000 auch korrekt abdecken:
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?
-
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.
-
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
(Bitte nicht nach Orbitalen fragen )Zu Deinem Datumsproblem, empfehl ich Dir:
http://manfred.wilzeck.de/Datum_berechnen.html
-
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.
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.
-
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
Chemie ist die Physik der ersten Elektronenschale
-
Physiker sehen das im Allgemeinen auch so.
Besonders Feststoffphysiker.
Aber Physiker pflegen auch ein spezielles Verhältnis zu Chemikern.
-
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.
-
einer von denen glaube ich nicht
-
MrX hat auf integer umgebaut:
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:
#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.