早起无聊没事做,写个年历,大家来品品.有 BUG 的话请指正!
程序代码://画出某一年的年历!
//对比时间为2015年1月1日星期四
//打印某年年历 gcc版 欢迎交流 QQ 87835836 -- Rol
#include <stdio.h>
void make(int year,int data[][6][7],int days[][12]); //函数声明详细在后面
int findfirst(int year);
int pdyunnian(int year);
void print(int data[][6][7]);
int main(void)
{
int year,data[12][6][7]={0};
int days[2][12]={ //闰年与非闰年各月份天数表
{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}
};
printf("请输入要查询年份(>=0)):\n");
scanf("%d",&year);
while(year<0)
{
printf("请输入>=0的年份:\n");
scanf("%d",&year);
}
make(year,data,days);
printf("***********%4d年 年历***********\n",year);
print(data);
return 0;
}
void make(int year,int data[][6][7],int days[][12]) //填年历
{
int kong,i,j,k,num,yun;
kong=findfirst(year); //判断这一年1月1日是星期几
yun=pdyunnian(year)?1:0;
for(i=0;i<12;i++) //12个月份
{
num=1;
for(j=0;j<6;j++) //每月最多6星期
{
for(k=0;k<7;k++) //每周星期
{
if(k<kong&&j==0)continue; //空出前面
if(num<=days[yun][i]) //判断日期是否超过当年当月天数限制
{
data[i][j][k]=num++;
kong=k+1; //记录下月1号是星期几
}
}
}
}
}
int findfirst(int year) //找出这一年1月1日是星期几
{
int days=0;
if(year==2015)return 4; //对比时间为2015年1月1日星期四
else if(year>2015) //如果是2015年以后
{
while(year!=2015)
{
days+=(pdyunnian(year-1)?366:365); //计算这年1月1日到2015年1月1日的总天数
year--;
}
switch(days%7) //计算是星期几
{
case 0:return 4;
case 1:return 5;
case 2:return 6;
case 3:return 7;
case 4:return 1;
case 5:return 2;
case 6:return 3;
}
}
else //如果是2015年以前
{
while(year!=2015)
{
days+=(pdyunnian(year)?366:365); //计算这年1月1日到2015年1月1日的总天数
year++;
}
switch(days%7) //计算是星期几
{
case 0:return 4;
case 1:return 3;
case 2:return 2;
case 3:return 1;
case 4:return 7;
case 5:return 6;
case 6:return 5;
}
}
}
int pdyunnian(int year) //判断是否为闰年
{
return (year%4==0&&year%100!=0)||(year%400==0)?1:0;
}
void print(int data[][6][7]) //打印数据
{
int i,j,k;
for(i=0;i<12;i++)
{
printf("%02d月\nSUN MON TUE WED THU FRI SAT \n",i+1);
printf("---------------------------------\n");
for(j=0;j<6;j++)
{
for(k=0;k<7;k++)
{
if(data[i][j][k]==0)printf(" "); //如果数值为0打印5个空格
else printf("%3d ",data[i][j][k]);
}
printf("\n");
}
printf("---------------------------------\n");
}
}


