codice:
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
double JulianDay(int year, int month, int day)
{
double retValue;
double Y, M, D;
double A, B;
D = day;
if ( month <= 2 )
{
Y = year - 1;
M = month + 12;
}
else
{
Y = year;
M = month;
}
A = (int)(Y/100);
B = 2 - A + (int)(A/4);
retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;
return retValue;
}
void CalendarDate(double jd, int *year, int *month, int *day)
{
double num = jd + 0.5;
int Z = (int)num;
double F = num - Z;
double A, B, C, D, E;
int alpha;
if ( Z < 2299161 )
{
A = Z;
}
else
{
alpha = (int)( (Z - 1867216.25) / 36524.25 );
A = Z + 1 + alpha - (int)(alpha / 4);
}
B = A + 1524;
C = (int)( (B - 122.1) / 365.25 );
D = (int)( 365.25 * C );
E = (int)( (B - D) / 30.6001 );
*day = B - D - (int)(30.6001 * E) + F;
if ( E < 14 )
{
*month = E - 1;
}
else if ( E == 14 || E == 15 )
{
*month = E - 13;
}
if ( *month > 2 )
{
*year = C - 4716;
}
else if ( *month == 1 || *month == 2 )
{
*year = C - 4715;
}
}
int DayOfTheWeek(double jd, char *strDay)
{
int num = (int)(jd + 1.5);
int retValue = num % 7;
switch ( retValue )
{
case 0:
strcpy(strDay, "Domenica");
break;
case 1:
strcpy(strDay, "Lunedì");
break;
case 2:
strcpy(strDay, "Martedì");
break;
case 3:
strcpy(strDay, "Mercoledì");
break;
case 4:
strcpy(strDay, "Giovedì");
break;
case 5:
strcpy(strDay, "Venerdi");
break;
case 6:
strcpy(strDay, "Sabato");
break;
}
return retValue;
}
int IsLeapYear(int year)
{
if ( year % 4 != 0 )
{
return 0;
}
else
{
if ( year % 100 != 0 )
return 1;
else if ( year % 400 != 0 )
return 0;
else
return 1;
}
}
int DayOfTheYear(int year, int month, int day)
{
int N, K;
K = IsLeapYear(year) ? 1 : 2;
N = (int)( (275 * month)/9 ) - K * (int)( (month + 9)/12 ) + day - 30;
return N;
}
int main ()
{
int d1, m1, y1;
int d2, m2, y2;
int d3, m3, y3;
int d4, m4, y4;
double jd1, jd2, jd3, jd4;
int diff;
int addDays;
int DayOfYear;
char szDay[256];
d1 = 5;
m1 = 2;
y1 = 1995;
d2 = 31;
m2 = 8;
y2 = 2014;
jd1 = JulianDay(y1, m1, d1);
jd2 = JulianDay(y2, m2, d2);
diff = (int)(jd2 - jd1);
cout << endl;
cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;
cout << "Differenza in giorni: " << diff << endl << endl;
CalendarDate(jd1, &y3, &m3, &d3);
cout << std::setprecision(21) << "jd -> " << jd1 << " = " << d3 << "/" << m3 << "/" << y3 << endl << endl;
d3 = 30;
m3 = 6;
y3 = 1954;
jd3 = JulianDay(y3, m3, d3);
DayOfTheWeek(jd3, szDay);
cout << d3 << "/" << m3 << "/" << y3 << " -> " << szDay << endl << endl;
addDays = 89;
jd4 = jd3 + addDays;
CalendarDate(jd4, &y4, &m4, &d4);
DayOfTheWeek(jd4, szDay);
DayOfYear = DayOfTheYear(y4, m4, d4);
cout << d3 << "/" << m3 << "/" << y3 << " + " << addDays << " giorni = " << d4 << "/" << m4 << "/" << y4 << " " << szDay << "; " << DayOfYear << "° giorno dell'anno." << endl << endl;
return 0;
}