» Wochentagserrechnung nach Gauss oder Butcher

Beispielprogramm Umwandlung zwischen Zahlensystemen mit selbsgeschriebener Funktion itoaNeuen Thread eröffnenNeue Antwort erstellenInformationen aus Webseite herausfiltern
AutorNachricht
Junior 
Name: Voller Name als Anagramm: Fitje Weshoms
Geschlecht:
Fahrzeug: Yamaha YZF R6 Thundercat
Anmeldedatum: 15.07.2012
Beiträge: 92
Wohnort: Amberg, Oberpfalz
29.06.2014, 16:29
zitieren

Hallo Leute!
Hier ein kleines Programmchen, was für ein eingegebenes Datum den dazugehörigen
Wochentag errechnet. Beispielsweise interessant, wenn man wissen will, an welchen
Wochentag man geboren ist, oder ob Datumsangaben in Dokumenten stimmen. Dies
kann man zum Beispiel am Datum 1.9.1939 testen. Da begann der zweite Weltkrieg.
Es war ein Freitag.
Geschrieben wurde das ganze mit zwei Funktionen, einen nach Butcher die andere
nach einem älteren Vorschlag von Gauss. Der nach Gauss reicht nur von 1589 bis 2399.
Das dürfte aber auch reichen.

Quellennachweis:
Heinrich Hemme
Das Buch der Ziffern, Zahlen, Maße und Symbole
Anaconda Verlag GmbH
ISBN 978-3-86647-396-6


Seit der Version SUSE Leap 42.1 hat sich in Punkto Text ausschneiden, kopieren und
einsetzen viel getan. Die "goto"-Anweisungen wurden nun herausgenommen

#include <iostream>

using namespace std;

/* Programm kalender.c zum ausrechnen, welcher
* Wochentag auf welches Datum fällt*/

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "kalender.h"

using namespace std;

struct Jahresdaten
{
int jahr;
int sp;
int monat;
int tag;
}
Jadat;

int getch(){
    struct termios oldt, newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}

/*Butcher'sche Osteralgorithmus */
void ostern(int jahr, int (*tag), int (*monat))
{
int a,b,c,d,e,f,g,h,i,k,l,m,n,p;

a = jahr % 19;
b = jahr / 100;
c = jahr % 100;

d = b / 4;
e = b % 4;
f = (b + 8 ) / 25;

g = (b - f + 1) / 3;
h = ((19*a) + b -d -g +15) % 30;
i = c / 4;

k = c % 4;
l = (32 +(2*e) + (2*i) -h -k) % 7;
m = (a + (11*h) + (22*l))/ 451;

n = (h+l-(7*m)+114)/31;
p = ((h+l-(7*m)+114) % 31) + 1;
*tag = p;
*monat = n;
}

//errechnet das Datum fuer den Ostersonntag
void geteastern(int j, int *monat, int *t)
{
int q, a, b, c, d, m, i;
*monat = 3;
if (( j >= 1582) && (j <= 1699))  {d = 10; m = 202; i = 1;}
if (( j >= 1700) && (j <= 1799))  {d = 11; m = 203; i = 0;}
if (( j >= 1800) && (j <= 1899))  {d = 12; m = 203; i = 0;}
if (( j >= 1900) && (j <= 2099))  {d = 13; m = 204; i = 2;}
if (( j >= 2100) && (j <= 2199))  {d = 14; m = 204; i = 2;}
if (( j >= 2200) && (j <= 2299))  {d = 15; m = 205; i = 1;}
if (( j >= 2300) && (j <= 2399))  {d = 16; m = 206; i = 0;}

q = j / 4;
a = j % 19;
b = (m - (11*a)) % 30;
if ((i = 1) && (b == 29)) b = 28;
if ((i = 2) && (b <=29) && (b >=28)) --b;
c = (j + q + b - d) %7;
*t = 28 + b - c;
if (*t > 31) { *t = *t -31; *monat = 4;}
}
void Erstertag(struct Jahresdaten *Jadat, int (*monlen)[12], int (*fita)[12], int (*letzta)[12], int (*mondat)[12][31]);
void Schaltjahr(int jhr, int (*sp), int (*monlen)[12]);

void DatumZeigen(struct Jahresdaten Jadat, char wotag[7][4], int mondat[12][31])
{
char monam[14][20] = { "Januar", "Februar", "März", "April", "Mai", "Juni",\
"Juli", "August", "September", "Oktober", "November", "Dezember" };
int mnt = Jadat.monat;
int tg = Jadat.tag;

cout << "Jahreszahl..............: " << Jadat.jahr << endl;
cout << "Monat...................: " << monam[mnt -1] << endl;
cout << "Tag im Monat............: " <<  Jadat.tag << " " << wotag[ mondat[mnt -1][tg-1]] << endl;
cout << "Jahresbeginn 1.Januar...: " << wotag[mondat[0][0]] << endl;;
cout << "Jahresende: 31.Dezember.: " << wotag[mondat[11][30]] << endl;
if (Jadat.sp == 0)
 cout << endl;
else
cout << "Schaltjahr " << endl;

}


int main(void)
{
int mondat[12][31], fita[12], letzta[12];
int wouhi = 5, jahr, tag, monat, otag, omon;
char wotag[7][4] = { "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So" };
int monlen[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
/*char monam[14][20] = { "Januar", "Februar", "März", "April", "Mai", "Juni",\
"Juli", "August", "September", "Oktober", "November", "Dezember" };*/
struct jadat;

time_t t;
struct tm *tmp;
t = time(NULL);
tmp = localtime(&t);
if (tmp == NULL)
{
//perror("localtime");
cout << "Fehler";
goto finito;
}
// printf("\n\nDatum %d.%d.%d", tmp->tm_mday, tmp->tm_mon, tmp->tm_year + 1900);
// printf("\nZeit %d:%d:%d", tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

jahr = Jadat.jahr = tmp->tm_year + 1900;
monat = Jadat.monat = tmp->tm_mon + 1;
tag = Jadat.tag = tmp->tm_mday;

do
switch(wouhi)
{
  default:
       cout << "Errechnet den Wochentag eines Datums" << endl << endl;
       cout << "Heutiges Datum: " << tag << "." << monat << "." << jahr << endl;
       cout << "Programmende:....1" << endl;
       cout << "Datumseingabe....2" << endl;
       cout << "Ihre Wahl:  " << endl;
       cin >> wouhi;
     break;

   case 1:
      return 0;
     break;


   case 2:
      cout << "Jahreszahl..: ";
      scanf("%d", &jahr);
      Jadat.jahr = jahr;

      cout << "Monat.......: ";
      scanf("%d", &monat);
      Jadat.monat = monat;

      cout << "Tag im Monat: ";
      scanf("%d", &tag);
      Jadat.tag = tag;

      Erstertag(&Jadat, &monlen, &fita, &letzta, &mondat);
      DatumZeigen(Jadat, wotag, mondat);
      ostern(jahr, &otag, &omon);
      cout << "Ostern am....: " << otag<<"." <<omon << "." << jahr << endl;
      geteastern(jahr, &omon, &otag);
      cout << "Ostern am....: " << otag<<"." <<omon << "." << jahr << endl << endl;
     wouhi = 7;
   break;
}
while(wouhi != 'e');

finito: return 0;
}



/* Ausser bei Schaltjahren ist der erste Tag im Jahr, also der
* 1te Januar derselbe Wochentag wie der 31te Dezember, weil in
* =========================================
* Jahr Beginn Ende Schaltjahr
* =========================================
* 2004 Do Fr Ja
* 2003 Mi Mi nein
* 2002 Di Di nein
* 2001 Mo Mo nein
* 2000 Sa So Ja
* 1999 Fr Fr nein
* 1998 Do Do nein
* 1997 Mi Mi nein
* 1996 Mo Di ja
* =========================================
*/



void Erstertag (struct Jahresdaten *Jadat, int (*monlen)[12], int (*fita)[12], int (*letzta)[12], int (*mondat)[12][31])
{
int dsp, jahr, jr, wtf, wtl, schritt;
int month, dmmy, moze, a, monatslaenge, monat;
//Jahreseckdaten uebernommen
jahr = Jadat->jahr;
month = monat = Jadat->monat;


if ((month < 1) || (month > 12)) monat = 1;

if(jahr < 2000)
{
jr = 1999;
wtf = wtl = 5;
schritt = -1;
}
if(jahr > 2000)
{
jr = 2001;
wtf = wtl = 6;
schritt = 1;
}
if(jahr == 2000)
{
wtf = 5; /* Rechnungsbeginn ist Samstag[=kennziffer 5] */
dsp = 1;
goto fertig;

}
/* bei jahr < 2000 wotafir = 5[Samstag],
* bei jahr > 2000 wotafir = 6[Sonntag]
* Zwei Schaltjahre können niemals aufeinander folgen!!
*/

schleife: Schaltjahr(jr, &dsp, monlen);

/* ------wenn Schaltjahr und vorher kein schaltjahr------- */
if ((dsp == 1) && (jahr > 2000))
{
wtf += 1;
wtl += 2;
}

if ((dsp == 1) && (jahr < 2000))
{
wtf -= 2;
wtl -= 1;
}

/* wenn kein Schaltjahr ist wtf = wtl, und wenn vorher kein Schaltjahr war
*/

if ((dsp == 0) && (jahr != 2000) && (wtf == wtl))
{
wtf += schritt;
wtl += schritt;
}

/* wenn kein Schaltjahr ist, ist wtf = wtl, aber vorher Schaltjahr war
*/
if ((dsp == 0) && (jahr < 2000) && (wtf != wtl))
{
wtf -= 1;
wtl -= 2;
}

if ((dsp == 0) && (jahr > 2000) && (wtf != wtl))
{
wtf += 2;
wtl += 1;
}

if (wtf < 0)
wtf += 7;
if (wtl < 0)
wtl += 7;

if (wtf > 6)
wtf -= 7;

if (wtl > 6)
wtl -= 7;

if (jr == jahr)
goto fertig;
jr += schritt;
goto schleife;

fertig: /* (*tz) = wtf; alt war wotafir */
Jadat->sp = dsp; /*(*sp) = dsp; */
(*monlen)[1] = 28 + dsp;


dmmy = wtf; /* (*tz); */
(*fita)[0] = dmmy; /* 1.ter Tag im Jahr ist gleich (*taze) */
(*mondat)[0][0] = dmmy; /* 1.ter Januar ist gleich (*taze) */

for(moze = 0; moze < 12; moze++)
{
if ( moze > 0)
(*fita)[moze] = dmmy;
for(a = 0; a < (*monlen)[moze]; a++)
{
monatslaenge = (*monlen)[moze] - 1;

if (a == monatslaenge )
(*letzta)[moze] = dmmy;
(*mondat)[moze][a] = dmmy;
dmmy += 1;
if (dmmy > 6)
dmmy = 0;
}
}
}


void Schaltjahr(int jhr, int (*sp), int (*februar)[12])
{
/*
* Wenn Jahreszahl ohne Rest durch Vier teilbar ist,
* ist die Jahreszahl ein Schaltjahre.
* Ausnahme1:
* Wenn die Jahreszahl ausserdem durch 100 teilbar ist, dann
* liegt kein Schaltjahr vor(sp=0).
* Ausnahme von der Ausnahme1:
* Wenn die Jahreszahl durch 400 teilbar ist, liegt doch
* ein Schaltjahr vor(sp=1).
*/
int dsp, s1, s2, s3;
dsp = 0;
s1 = jhr % 4;
s2 = jhr % 400;
s3 = jhr % 100;

if ((s1 == 0) || (s2 == 0)) dsp = 1;
if ((s2 != 0) && (s3 == 0)) dsp = 0;

(*februar)[1] = 28 + dsp;
//cout << jhr<< " Schaltjahr....:" << dsp<< " s1 " << s1 << " s2" <<s2 <<" s3" << s3;

(*sp) = dsp;
}

Weitere Infos zur Datumsberechnung:
Auf dem Konzil von Nicäa (325 n. Chr.) wurde festgelegt, dass Ostern immer auf den Sonntag
nach dem ersten Frühlingsvollmond fällt. Da die Dauer eines Jahres kein Vielfaches der Dauer
eines Mondumlaufs um die Erde ist, wird Ostern zu einem beweglichen Fest zwischen dem
22. März und 25. April eines jeden Jahres. Weitere kirchliche Feiertage leiten sich aus dem
Ostersonntag ab. So ist Aschermittwoch 46 Tage vor Ostersonntag. Christi Himmelfahrt ist
39 Tage, Pfingstsonntag 49 Tage und Fronleichnam 60 Tage nach Ostersonntag.
Der Dreifaltigkeitstag ist der 1te Sonntag nach dem Pfingstsonntag.
Diese Regeln gelten bis heute!

Zu Beachten ist allerdings:
Die Vollmondrechnung für Ostern basiert auf einer kirchlichen Vollmondrechnung und nicht
auf der astronomischen Vollmondrechnung!


pn
Gast 
29.06.2014, 16:29
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Wochentagserrechnung nach Gauss oder Butcher" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Nebelscheinwerfer nach außen oder innen?
Hey leute. bin am überlegen, wo ich meine nebler anbaue. habe da drei varianten (nach innen, nach außen, oder hinter ein schwarzes racegitter). Was findet ihr besser? Hier sind die bilder (unten auf der seite dieses...
von CIVIC - Christian
19
964
11.12.2006, 19:39
Kordova
Frechen 01.02.08.... oder der Tag nach Tomeks Geburtstag
So dann fangen wir doch schon mal wieder an zu sammeln, wer so alles vorbei kommt :-) ! Denkt dran Donnerstag hat der liebe Tomek Geburtstag, also zahlreich Freitag anwesend sein ^^...
von Chanelle85
80
3.083
05.02.2008, 00:03
Chanelle85
Frechen 15.02.08.... oder der Tag nach Rike´s Geburtstag
Joa .... der Threadtitel wurde ja schon vorgeschlagen und ist auch ganz passend :D Ein Anlass... ein Kuchen :hrhr: Wir werden sehen was uns erwartet ..... es darf wieder gespammt werden .... wer ist dabei...
von oeschie
172
5.027
20.02.2008, 15:54
Jacoby
schaut ziemlich nach betrug aus,oder???
http://cgi.ebay.de/Tuning-Chip-HONDA-CRX-SOHC-VTEC-Eprom-Upgrade-/370417905082?pt=Autoteile_Zubeh%C3%B6r sieht das so ausa als könnts funktionieren? und wie soll man das bitte verbauen??? für mich sieht dass nach sinnloser geldmache...
von kyngamok
30
1.229
02.09.2010, 19:07
kyngamok
Antennenverstärker funktionslos nach Radioumbau! Oder was ist da los ?
Hallo, habe das Werksradio aus meinem FN2 rausgeschmissen und durch das Sony XAV602-BT ersetzt. Damit man nun die Antenne wieder anschließen kann, habe ich einen GT13 Adapter verbaut. Seitdem ist der Empfang wirklich sehr sehr schlecht, sodass ich quasi...
von Madax
4
277
02.08.2017, 19:44
Madax
S2000 240 PS Werksangabe nach EG oder DIN Norm
Hallo, ich hab mal ne frage an euch. Die PS Werksangabe des S2000 ist die nach DIN Norm oder der neueren EG Norm? Habe jetzt nen Prüfstandslauf gemacht und habe beide Daten bekommen. Einmal 250 PS (EG Norm) und 257 PS (DIN) Norm. Jetzt würde ich nämlich...
von dust
2
574
21.12.2012, 11:45
dust
nachschulung nach auffahrunfall ja oder nein ???
hatte ja nun diesen scheiß auffahrunfall letzten dienstag. ja nun bin ich noch in der probezeit. wie is des da mit nachschulung??? bekommt man die auf alle fälle ??? und die 2 jahre probezeitverlängerung ??? also ich muss sagen wurde noch nie belangt von...
von BERRY
34
1.378
16.11.2010, 19:10
BERRY
Anlasser oder Lima? Geräusche nach Start
Mahlzeit! FR-V, Diesel. Seit 2 Tagen macht er nach Kaltstart komische Geräusche, ich hätte mal darauf getippt daß der Anlasser versucht nochmal einzuspuren, zumindest hört sich die Sache so an. Nach ein paarmal Kratzen verschwindet das Geräusch. Was mir...
von jockelSZJ
6
262
18.04.2018, 11:01
jockelSZJ
Nach der Explosion nun neues oder gebrauchtes Gartenhäuschen
Liebe Gartenfreunde, Letztes Jahr ist mir mein Gartenhäuschen abgebrannt. Ich will euch ja nicht erzählen, was mit all den Gartenmittel so alles passiert ist. Feuerwehr musste kommen und die Nachbarn hatten einen Riesenschock als das DIng in die Luft...
von firmin.firmin
25
1.520
10.06.2011, 06:49
Transit
 EJ9 nach Unfall aufbauen, verkaufen oder schlachten ?
Hallo! Ich hatte am Fr. einen Unfall mit meinem Civic. Nun stellt sich die Frage was man weiter mit dem Auto anstellt. Zum Auto: Bj. 97 Km: 156Tkm Ausstattung und Tuning: -Klima (vorletzten Sommer eingebaut) -el. Spiegel (Spiegelheizung vorbereitet, noch...
von AF_89
14
879
16.02.2013, 20:16
civic26
© 2004 - 2024 www.programmierer-forum.de | Communities | Impressum |