看到好多人都在问万年历,我就完整的写了一个
鉴于多数人都在问万年历的问题。我就索性写了一个,给大家参考。方法都已封装好,直接调用display(int year)就可以了。如果大家有更好的方案,可以提出。假如我能想到更好的方法,我会直接修改,供大家学习。int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int first_day = 0;
int add_value;
char *week[7] = {"周日", "周一","周二","周三","周四","周五","周六"};
//计算输入年份是否为闰年
bool isLeap(int year)
{
return ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0));
}
//计算输入年份第一天是星期几
void Init(int year)
{
add_value = isLeap(year);
day[1] = 28 + add_value;//如果输入年为闰年,2月份的天数为29
first_day = (year + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) % 7;//计算出输入年第一天为周几
}
//计算到输入年份的当前月的距离
int get_distance(int month)
{
int distance[12] = {0, 31, 59 + add_value, 90 + add_value, 120 + add_value,
151 + add_value, 181 + add_value, 212 + add_value,
243 + add_value, 273 + add_value, 304 + add_value, 334 + add_value};
return distance[month - 1];
}
void display(int year)
{
Init(year);
printf(" %d年年历 \n",year);
printf(" 周日 周一 周二 周三 周四 周五 周六 \n");
for(int i = 1; i <= 12; i++)
{
printf(" %d月份 \n", i);
for(int j = 0; j < first_day; j++)
{
printf(" ");
}
for(int start = 1; start <= day[i - 1]; start++)
{
printf("%6d", start);
first_day++;
if(first_day == 7)
{
first_day = 0;
printf("\n");
}
}
printf("\n");
}
}