万年历_C语言
想做个年历,根据年份,自动排出该年的年历
思路
- 获得一个合法的年份
- 计算该年份每个月1号所属星期
- 挨月排列打印(显示)出来
一些准备工作
-
根据日期(年月日)得到星期的公式:
w = (d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7
- 判断是闰年的条件: 能被4整除且不能被100整除,或者能被400整除
- IDE: VC++6.0
开始写代码
- 预处理指令:
# include <stdio.h>
- 主函数:
int main(void)
{
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //每月天数,0到12月
int first_day[12] = {0}; //每月第一天是星期几,0到6
int year = 0; //年份
int i = 0;
while(1)
{
//获取年份
printf("Year: ");
scanf("%d", &year);
//检查所给年份的合理性
if ( ! isAvailable(year) )
break;
}
//获取该年每月所属星期
getDay(first_day, year);
//如果年份为闰年,修改2月的天数
if ((year%4==0 && year%100!=0) || (year%400==0))
days[1] = 29;
//画日历
drawCalendar(days, first_day);
return 0;
}
- 自定义函数(isAvailable(),getDay(),drawCalendar()):
int isAvailable(int year)
{
if (year > 0)
return 0;
return 1;
}
void getDay(int first_day[], int y)
{
int m = 0;
int d = 1;
int w = 0;
for (m=3; m<=12; m++)
{
w = (d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
first_day[m-1] = w;
}
y -= 1;
for (m=13; m<=14; m++)
{
w = (d + 1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7;
first_day[m-13] = w;
}
}
void drawCalendar(int days[], int first_day[])
{
int space = 0;
int d = 0, i=0, j = 0;
for (i=0; i<12; i++)
{
space = first_day[i];
//画表头和月份
printf(" %2d 月 \n", i+1);
printf("|----------------------|\n");
printf("| 日 一 二 三 四 五 六 |\n");
printf("|----------------------|\n|");
//画1号前的空格
for (j=0; j<space; j++)
printf(" ");
//开始画号数
for (d=1; d<=days[i]; d++)
{
printf(" %2d", d);
if ((d+space)%7==0)
printf(" |\n|");
}
//画完号数,填补空格
space = 7 - (d-1+space)%7;
for (j=0; j<space; j++)
printf(" ");
//画表尾
printf(" |\n|----------------------|\n");
}
}
如果把此函数写在main函数后面,记得在main函数前面某行处,加上函数声明!
编译链接运行
另外
- 用到“根据日期得到星期的公式”的使用条件
year > 0
,以及如果是求1月2月的1号所属星期需要做的变化y -= 1
、for (m=13; m<=14; m++)
- 注意到闰年2月天数的变化
- 每月日历的排版,包括:1号前的空格、号数、月底之后的空格
- 怎样实现:多月横排显示(如3行4列的排版)?
最后
水平不高,可能还有做得不够好的地方,
希望能和大家交流学习,
转载请注明出处。