#include "iostream.h"
typedef struct DATEINFO
{
int Day;
int Month;
int Year;
char* DayWeek;
} _DATEINFO;
char* arrDayWeek[7] = {"Chu Nhat", "Thu Hai", "Thu ba", "Thu tu", "Thu nam", "Thu sau", "Thu bay"};
int ngayOfthang[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int namNhuan(int nam)
{
if (!(nam % 400)) return 1;
if (!(nam % 4) && (nam % 100)) return 1;
return 0;
}
int Hople(int ngay, int thang, int nam)
{
int res = 0;
if ((ngay <= 0) || (thang <= 0) || (nam <= 0) || (thang > 12)) return 0;
ngayOfthang[2] += namNhuan(nam);
if (ngay <= ngayOfthang[thang]) res = 1;
ngayOfthang[2] = 28;
return res;
}
int PreviousDay(int &ngay, int &thang, int &nam)
{
if (ngay == 1)
{
if (thang == 1)
{
ngay = 31;
thang = 12;
nam--;
}
else if (thang == 3)
{
thang--;
ngay = 28 + namNhuan(nam);
}
else
{
thang--;
ngay = ngayOfthang[thang];
}
}
else ngay--;
return 0;
}
// Cong thuc tinh weekday:
// _ Y - 1 _ _ Y - 1 _ _ Y - 1 _ //
// F(Y) = Y - 1 ++ | ----- | -- | ----- | ++ | ----- | ++ C
// |_ 4 _| |_ 100 _| |_ 400 _|
// NOTE: Y: Current year
// C: so ngay tu ngay dau nam den ngay can tinh
// F(Y) mod 7 = 1 : thu hai
// = 2 : thu ba
// = ...
// = 0 : chu nhat
bool Day_of_week(DATEINFO* dayInfo)
{
int y = dayInfo->Year;
int C = dayInfo->Day;
ngayOfthang[2] += namNhuan(y);
for (int i = 1; i < dayInfo->Month; ++i)
C += ngayOfthang[i];
int res = (y - 1) + (y - 1) / 4 - (y - 1) / 100 + (y - 1) / 400 + C;
dayInfo->DayWeek = arrDayWeek[res % 7];
ngayOfthang[2] = 28;
return true;
}
int main()
{
DATEINFO date;
cout <<"Nhap vao ngay thang nam: "; cin >> date.
Day >> date.
Month >> date.
Year;
if (Hople(date.Day, date.Month, date.Year))
{
cout << "Day la ngay thang nam hop le" << endl
;
Day_of_week(&date);
cout << "Ngay " << date.
Day << "/" << date.
Month << "/" << date.
Year << " la ngay " << date.
DayWeek << endl
;
PreviousDay (date.Day, date.Month, date.Year);
cout << "Ngay truoc do la: " << date.
Day << "/" << date.
Month << "/" << date.
Year << endl
; }
else cout << "Day la ngay thang nam khong hop le" << endl
; return 0;
}