Rechnen
-
Ich schreibe gerade ein konsolen Programm und möchte den Wochentag berechnen... hier auf der seite habe ich die formel dafür gefunden welche wie folgt lautet:
W = (T + [2.61 * M - 0.2] + J + [J/4] + [H/4] - 2 * H) modulo 7 Dabei steht am Beispiel 12.11.2003 - W für den Wochentag = ? - H für das Jahrhundert = 20 - J für das Jahr im Jahrhundert = 3 - M für den Monat = 11 - T für den Tag = 12
so weit so gut... nun lese ich die ganzen Einträge ein und habe sie als Variable... nun habe ich die oben genannte formel meinen bedürfnissen "angepasst" aber ich habe ein Problem wie schreibe ich das in den quell code??? welche Klammern muss ich nehmen??? welches zeichen ist modulo???
mein abgeänderter code sieht so ausw = [tag + [2.61 * monat - 0.2] + jahr + [jahr/4] + [jahrhund/4] - 2 * jahrhund] modulo 7;
-
Roosevelt schrieb:
quell code??? welche Klammern muss ich nehmen??? welches zeichen ist modulo???
mein abgeänderter code sieht so ausw = [tag + [2.61 * monat - 0.2] + jahr + [jahr/4] + [jahrhund/4] - 2 * jahrhund] modulo 7;
a module b wird zu a%b
[a] wird zu int(a)
-
Weil ich sowas rumliegen hab und grad an guten Tag hab.
Hier der Code:enum { dSunday, dMonday, dTuesday, dWednesday, dThirsday, dFriday, dSaturday }; // berechnet den Wochentag aus einem Datum // Quelle: http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap17.html#17.27 int dayOfWeek(int d, int m, int y) { if (y < 100) { // alles was unter 80 ist, // als 20xx interpretieren if (y < 80) {y += 100;} // Jahrangabe vierstellig y += 1900; } 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; }
-
anonymus schrieb:
Hier der Code:
zu dem hab ich sogar ne erklärung rumliegen.
int wochentag(int jahr, int monat, int tag) { if (monat<3) jahr--; return (jahr+jahr/4-jahr/100+jahr/400+"-bed=pen+mad."[monat]+tag)%7; } ich zerleg mal in einzelschritte int wochentag(int jahr, int monat, int tag) { if (monat<3) --jahr; int tage=0; tage+=365*jahr;//logo, ein jahr hat 365 tage tage+=jahr/4;//logo, es gab so viele Schaltjahre tage-=jahr/100;//hehe, die durch 100 teilbaren waren keine schaltjahre tage+=jahr/400;//hehehe, die durch 400 waren aber doch welche int monatstage[]={4711,31,30,31,30,31,31,30,31,30,31,31,28}; tage+=der wochentag da wo am anfang halt war tage+=monatestage[monat]; return tage; } 2 Tricks sind zu beachten: a) mein Jahr beginnt am 1. März! wenn Monat 1 oder 2 war, ist es für mich das Vorjahr jewesen. Hat den Vorteil, daß der Schalttag am Ende ist, ich also mit tage+=jahr/4; genau zählen kann, wieviele Schalttage meine Berechnung beeinflussen müssen. b) monatstage hat 13 Elemente, das Element bei 0 verwende ich net, damit ich indizes von 1 bis 12 nehmen kann. Und nu umbasteln. int wochentag(int jahr, int monat, int tag) { if (monat<3) --jahr; int tage=0; tage+=1*jahr;//hehe, ob 1 oder 365 ist nach dem %7 am ende ja egal tage+=jahr/4; tage-=jahr/100; tage+=jahr/400; char monatestage[]={4711,31,30,31,30,31,31,30,31,30,31,31,28}; tage+=monatestage[monat]; return tage%7; } Und noch trixen mit den Monatstagen. Na, ob ich 31 oder 84 schreibe ist egal, denn nach %7 sind 31 und 84 gleich. Und ich kann jedem arrayelement gleich schon "der wochentag da wo am anfang halt war" dazufügen. Also statt 84 gleich 98. Das ist 'b'. Oder 'b'+7 oder 'b'+14 oder so. ist egal, hab viel Auswahl. Dann fummel ich mal nen string zusammen, der cool klingt: int wochentag(int jahr, int monat, int tag) { if (monat<3) --jahr; int tage=0; tage+=1*jahr;//hehe, ob 1 oder 365 ist nach dem %7 am ende ja egal tage+=jahr/4; tage-=jahr/100; tage+=jahr/400; char monatestage[]="-bed=pen+mad."; tage+=monatestage[monat]; return tage%7; } so, und nur einfach zusammenfassen alles in möglichst wenige Zeilen stopfen. int wochentag(int jahr, int monat, int tag) { if (monat<3) --jahr; return (jahr+jahr/4-jahr/100+jahr/400+"-bed=pen+mad."[monat]+tag)%7; } Die erste Zeile ist zu lesbar. int wochentag(int jahr, int monat, int tag) { return jahr-=monat<3,(jahr+jahr/4-jahr/100+jahr/400+"-bed=pen+mad."[monat]+tag)%7; } Das mit dem Array auch. int wochentag(int jahr, int monat, int tag) { return jahr-=monat<3,(jahr+jahr/4-jahr/100+jahr/400+monat["-bed=pen+mad."]+tag)%7; }
-
WTF.