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";}
-
-
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 jetztGern geschehen !
Gruß,
Simon2.