//日历
//关键是先找出一年中的第一天是这一年中的晚期几
#include <stdio.h>
#include <windows.h>
bool bMonthFlags = false;/*以月来换页*/
//判别闰年
bool IsLeapYear(int iYear)
{
return ((iYear%400 == 0) || ((iYear%4 == 0) && (iYear%100 != 0)));
}
//一年中的第一天是这一年中的星期几
int GetYearDay()
{
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
int iYear = sysTime.wYear-1;
int iDay = ((iYear-1)*365+(iYear-1)/4-(iYear-1)/100+(iYear-1)/400+1)%7;
return iDay;
}
int GetYearDay(int iInputYear)
{
int iDay = ((iInputYear-1)*365+(iInputYear-1)/4-(iInputYear-1)/100+(iInputYear-1)/400+1)%7;
return iDay;
}
void Print(const int iMonthDay, const int iDay)
{
int iYearDay=0; /*一年中的星期几*/
for(int i=1; i<=iDay; ++i)
{
int iTemp = (iMonthDay+i+GetYearDay())%7; //key
if(!bMonthFlags)
{
bMonthFlags = true;
for(int j=0; j<iTemp; ++j)
{
printf("\t");
++iYearDay;
}
}
printf("%d\t", i);
if((iYearDay+1)%7 == 0 )
{
printf("\n");
}
++iYearDay;
}
}
void Show()
{
int iDay;
int iCount;
int iTempDay[11]; //临时保存每月的iDay;
int iSumMonthDay;
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
iSumMonthDay = 0;
iCount = 0;
for(int iMonth=1; iMonth<13; ++iMonth)
{
printf("\t\t\t%d年第%d月\n", sysTime.wYear, iMonth);
printf("日\t一\t二\t三\t四\t五\t六\n");
switch(iMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
iDay=31;break;
case 4:
case 6:
case 9:
case 11:
iDay=30;break;
case 2:
{
if(IsLeapYear(sysTime.wYear))
iDay=28;
else
iDay=29;
}
break;
default:
break;
}
iTempDay[iMonth-1] = iDay;
if(iMonth>1)
iSumMonthDay += iTempDay[iCount++];
Print(iSumMonthDay, iDay);
printf("\n\n");
system("pause");
bMonthFlags = false;
}
}
int main(int argc, char* argv[])
{
Show();
return 0;
}