显示效果如:
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum bool
{
false, true
}bool;
bool isLeapYear(int year)//判断是否闰年
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
int getMonthDays(int year, int month)//获得该月天数
{
int days = 0;
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if (isLeapYear(year))
{
days = 29;
}
else
{
days = 28;
}
break;
}
return days;
}
void showMonth(int days, int startday)//输出月历
{
const char weeks[][4] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
for (int i = 0; i < 6; i++)
{
printf("%s ", weeks[i]);
}
printf("%s\n", weeks[6]);
for (int i = 1; i <= days; i++)
{
if (i == 1)
{
for (int j = 0; j < startday; j++)
{
printf(" ");
}
printf("%3d ", 1);
}
else
{
printf("%3d ", i);
}
if ((i + startday) % 7 == 0)
{
putchar('\n');
}
}
putchar('\n');
}
int main(void)
{
//以1970年1月1日(星期四)为基准
int year, month, monthDays, startday, days;
const int startYear = 1970;
printf("请输入年月例:2015 8\n");
while (scanf("%d %d", &year, &month) != EOF)
{
monthDays = getMonthDays(year, month);
days = 0;
for (int i = startYear; i < year; i++)
{
if (isLeapYear(i))
{
days += 366;
}
else
{
days += 365;
}
}
for (int i = 1; i < month; i++)
{
days += getMonthDays(year, i);
}
startday = (days + 4) % 7;
//printf("%d\n", startday);
showMonth(monthDays, startday);
printf("请输入年月例:2015 8\n");
}
return 0;
}
输出:
请输入年月例:2015 8
2005 7
SUN MON TUE WED THU FRI SAT
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
请输入年月例:2015 8