Witam,
wydaje mi się że nazwa DAY była by nieprecyzyjna w stosunku do tego problemu. Lepiej by było nazwać to Data(Date), która by reprezentowała dzień/miesiąc/rok. Na przykład:
struct Date
{
int day, month, year;
Date(int _day, int _month, int _year) : day(_day), month(_month), year(_year) {}
};
Dzięki takiej strukturze bez problemu można przedstawić dzień.
Następnie należy zdefiniować funkcję, która sprawdza czy dany rok jest przestępny. Za ( https://pl.wikibooks.org/wiki/Kody_%C5%BAr%C3%B3d%C5%82owe/Rok_przest%C4%99pny ).
bool isLeapYear(int _year)
{
return (_year % 4 == 0 && _year % 100 != 0 || _year % 400 == 0);
}
Kolejną rzeczą, którą należałoby zdefiniować są poszczególne dni w danym miesiącu. Dni tygodnia można przypisać do tablicy dla roku nieprzestępnego. Za( https://pl.wikipedia.org/wiki/Szablon:Miesi%C4%85ce_i_dni_roku)
static int daysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Mając wszystkie dane można przystąpić do napisania funkcji days, która zwraca różnicę liczb.
int days(Date d1, Date d2)
{
//rok i miesiąc jest ten sam
if(d1.year == d2.year && d1.month == d2.month)
{
int retVal =d1.day - d2.day;
return retVal;
}
//rok jest taki sam
else if(d1.year == d2.year)
{
if(isLeapYear(d1.year)) daysOfMonth[1] = 29;
int summary = 0;
for(int idx = d2.month - 1 ;
idx < d1.month - 1;
++idx)
{
summary += daysOfMonth[idx];
}
summary += (d1.day - d2.day);
daysOfMonth[1] = 28;
return summary;
}
//roki są różne
else
{
int summary = 0;
for(int idxY = d2.year; idxY != (d1.year - 1) ; ++idxY)
{
if( isLeapYear(idxY) )
{
summary += 366; // rok przestepny
}
else
{
summary += 365; // normalny rok
}
}
//roki są taki same więc bazujemy na liczbach dni w miesiącach
if(isLeapYear(d1.year)) daysOfMonth[1] = 29;
for(int idx = d2.month - 1 ;
idx < d1.month - 1;
++idx)
{
summary += daysOfMonth[idx];
}
//miesiące są takie same więc bazujemy na liczbach dni
summary += (d1.day - d2.day);
daysOfMonth[1] = 28;
return summary;
}
}
Ta funkcja ma kilka wad. Np. d1 zawsze musi być większe niż d2. Można również poprawić strukturę dodając nowe funkcje składowe.