Resource icon

Kleines Kalenderprogramm in QT 2019-05-07

No permission to download
Programmiersprache(n)
C++, Qt
Betriebssystem(e)
Linux
Hallo Leute!

Habt Ihr euch eigentlich schon mal gefragt, an welchen Wochentag Ihr geboren wurdet? Dieses Kleine Programm in QT geschrieben berechnet euch das. So was kann einem zum Verhängnis werden!

Beispiel:
Als ich in der Zeit meiner Umschulung im Osterurlaub als Fußgänger angefahren wurde und einen Bruch des Felsenbeins erlitt(vertikal UND horizontal!!), inklusive Ertaubung linksseitig mit Verlust des Gleichgewichtsorganes, teilamputierter Zeigefinger rechts, Lappenplastik linke Hand(wege multiresistenter staphylococcus Edidermidis, nun teilweise Steif) , mit Osteochondritis im Knie und Gonathrose, sowie Teilablösung der Netzhaut am Auge, reichte ich bei der Deutschen Rentenversicherung meinen Rentenantrag ein. Dabei hatte ich versehentlich den Tag der mündlichen Prüfung zum Gesellenbrief als Dreher nicht richtig angegeben(klar, nach 27Jahren, wie soll man das dann noch Wissen?). Der Antrag wurde übrigens abgelehnt.
Damit euch das oder ähnliches nicht passiert, dieses Programm.

Zuerst muss aber festgestellt werden, ob das Jahr des gesuchten Datums ein Schaltjahr war oder nicht:
Code:
int Schaltjahr(int jhr)
{
/*
* Wenn Jahreszahl ohne Rest durch Vier teilbar ist,
* ist die Jahreszahl ein Schaltjahre.
* Ausnahme1:
* Wenn die Jahreszahl außerdem 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;

return dsp;
}

int Kalender::leapyear(void)
{
/*
* Wenn Jahreszahl ohne Rest durch Vier teilbar ist,
* ist die Jahreszahl ein Schaltjahre.
* Ausnahme1:
* Wenn die Jahreszahl außerdem 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 = jahr % 4;
s2 = jahr % 400;
s3 = jahr % 100;

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


sjahr = dsp;
return dsp;
}
Erstere Funktion für allgemeine Anwendungen, leapyear für c++ und QT.

Bevor ich auf den Algorithmus von Gauss gestoßen bin, habe ich mir eine eigene Version geschrieben.
Folgendes von Gauss dazu:
Code:
int Kalender::GaussWochentag(int jahr, int m, int d)
{
int c, y, x, w, sj, wo;

/*Feststellen, ob ein Schaltjahr vorliegt*/

/*Wenn Schaltjahr dann sj auf 1 sonst auf 0*/
sj = leapyear();

c = (jahr / 100);       // Die ersten beiden Zahlen der Jahresangabe; die Jahrhunderte
y = jahr - (c * 100);   // Die letzten beiden Jahre der Jahresangabe; die Jahre
if (y == 0) y = 100;
//cout << "\ny="<<y;
if ((m < 3) && (sj == 0)) c -= 1;// alt war ac, nicht sj
m -= 2;                 // Setzt den März auf eins, den Januar auf 11 und Februar auf 12 als Monatszahl

if (m < 1) m+= 12;

if (m > 10) y -= 1;     // Bei Januar oder Februar als Monat y - 1

x = (2.6 * m) - 0.2;
wo = (d + x + y + (y/4) + (c/4)- (2 * c)); //%7;
if (wo < 0) wo += 7;
w = wo %7;

return w;
}
Da mir nicht bekannt ist, in welchen Jahresgrenzen diese arbeitet, habe ich beide Versionen, meine und von Gauss genutzt.
Hier der Osteralgorithmus:
Code:
*Butcher'sche Osteralgorithmus */
void Kalender::ostern(void)
{
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;
ostertag = p;
ostermonat = n;
}
Um die weiteren Feiertag zu bestimmen muss das Datum umgerechnet werden, zum Tag im Jahr:
Code:
// Berechnet an welchen Tag im Jahr das gesuchte Datum ist
int Kalender::DatetoDayofyear(void)
{
int dsp = leapyear();
int slei, rewer = 0;
int monatslaenge[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

monatslaenge[1] += dsp;
rewer += tag;
for (slei = 0; slei < monat - 1; slei++)
  {
    rewer += monatslaenge[slei];
  }

return rewer;
}

int Kalender::DatumzuTagimJahr(int monnum, int tgimmon)
{
// leapyear arbeitet mit einer Klassen-internen Variable(public)
// Daher kein Parameter für die Jahreszahl, kann aber
// umgeschrieben werden.
int dsp = leapyear();
int slei, rewer = 0;
int monatslaenge[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

monatslaenge[1] += dsp;
rewer += tgimmon;

if(monnum > 1)
for (slei = 0; slei < monnum -1; slei++)
  {
   rewer += monatslaenge[slei];
  }

return rewer;
}

//Errechnet aus Datum im welcher Kalenderwoche der gesuchte Tag liegt
void Kalender::Weekofyear(void)
{
int dsp = leapyear();
int rewer = -31, slei;
int monatslaenge[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

monatslaenge[1] += dsp;
rewer += tag;
for (slei = 0; slei < monat; slei++)
  {
  rewer += monatslaenge[slei];
  }

wocheimjahr = ((rewer-1) / 7) + 1; // Kalenderwochen beginnen immer am Montag, da 1ter Arbeitstag
}
Nun müssen wir, um die weiteren Feiertage zu berechnen etwas in der Geschichte der römisch-katholischen Kirche kramen:
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. 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!

Nachdem wir also diese Tage von der Variablen welche aus dem Datum dem Tag im Jahr berechnet, abgezogen oder dazu gezählt haben, müssen wir daraus wieder ein Datum machen:

Code:
int Kalender::TagNummerzuMonat(int jahr, int tagnummer)
{
int monatsnummer, tn, dsp, slei;
int monat[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

monatsnummer = 0;
tn = tagnummer;

dsp = Schaltjahr(jahr);
monat[1] += dsp;

for (slei = 0; slei < 11; slei++)
{
  monatsnummer = slei;
   if(tn <= monat[slei]) break;
tn = tn - monat[slei];
}

return monatsnummer + 1;
}

int Kalender::TagNummerzuTagimMonat(int jahr, int tagnummer)
{
int monatsnummer, tn, dsp, slei;
int monat[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

monatsnummer = 0;
tn = tagnummer;

dsp = Schaltjahr(jahr);
monat[1] += dsp;

for (slei = 0; slei < 11; slei++)
{
  monatsnummer = slei;
   if(tn <= monat[slei]) break;
tn = tn - monat[slei];
}

return tn;
}
Das ist eine grobe Übersicht zu den Methoden.
Für libreoffice habe ich es hier mal schon vorgestellt, aber noch nicht in QT. So entfällt das aufrufen mit libreoffice.

Viel Spaß beim Testen.
Autor
rustyoldguy
Downloads
0
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen

Latest updates

  1. Kleines Kalenderprogramm in QT Version 03

    Die Zeile mitostertagimjahr = DatumzuTagimJahr(4,1); //ostermonat, ostertag); verursachete einen...
Oben