#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
void printMonth(int year, int month);
void printMonthBody(int year, int month);
int getStartDay(int year, int month);
int getTotalNumOfDays(int year, int month);
int getNumOfDaysInMonth(int year, int month);
bool isLeapYear(int year);
int main()
{
int year, month;
printf("请输入要查询的年份:\n");
scanf_s("%d", &year);
printf("请输入要查询的月份:\n");
scanf_s("%d", &month);
printMonth(year, month);
return 0;
}
void printMonth(int year,int month)
{
printf("%d年%d月份的日历\n",year,month);
printf("--------------------------------\n");
printf("日\t一\t二\t三\t四\t五\t六\n");
printMonthBody(year, month);
}
void printMonthBody(int year,int month)
{
int week = getStartDay(year, month);
int days = getNumOfDaysInMonth(year, month);
int i;
int date = 1;
int circulation = 0;
for (i = week % 7; i > 1; i--)
printf(" \t");
for (i = week; i <= 7; i++)
{
printf("%d\t", date++);
}
printf("\n");
for (i = date; i <= days; i++)
{
if (circulation == 7)
{
printf("\n");
circulation = 0;
}
printf("%d\t", i);
circulation++;
}
}
int getStartDay(int year,int month)
{
int week;
week = (getTotalNumOfDays(year, month) + 3) % 7;
if (week == 0)
return 7;
else
return week;
}
int getTotalNumOfDays(int year,int month)
{
int i;
int yearChange = year;
int sum1 = 0, sum2 = 0, sum = 0, daysOfYear;
for (i = year - 1800; i > 0; i--)
{
if (isLeapYear(yearChange))
daysOfYear = 366;
else
daysOfYear = 365;
sum1 += daysOfYear;
yearChange--;
}
for (i = month - 1; i > 0; i--)
sum2 += getNumOfDaysInMonth(year, i);
sum = sum1 + sum2;
return sum;
}
int getNumOfDaysInMonth(int year,int month)
{
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
return 31;
else if (month == 4 || month == 6 || month == 9 || month == 11)
return 31;
else if (month == 2)
{
if (isLeapYear(year))
return 29;
else
return 28;
}
}
bool isLeapYear(int year)
{
if (year % 4 == 0)
return true;
else
return false;
}