万年历即:只要给定一个特定的年份,就能把一整年的日历显示出来,日历包括日期和星期
思路:
第一年的1月1日一定是周一,因此要知道所求的那一年1月1日是周几,就求在那一年之前一共过去了多少天,上一年最后一天的星期+1就是这一年的星期。
那求一共过去了多少天,就得分平年和闰年,平年只有365天,闰年是366天
闰年是指 能被4整除但是不能被100整除的年或者是能被400整除的年。
求星期,就拿天数对7取模,如果说过去了7天,则第一天是周一,那么今天就是7%7+1,还是周一
#include<stdio.h>
int fun(int i)
{
int s;
if(i%4==0&&i%100!=0||i%400==0)
s=366;
else s=365;
return s;
}
void main()
{
int i,j,n,k,m,sum,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
printf("请输入要查询的年份:");
scanf("%d",&n);
printf("\n\n\n%8d年的日历为\n\n\n",n);
printf("=================================================================================================\n\n\n\n");
for(i=1;i<n;i++)
sum+=fun(i); //计算今年之前一共过去了多少天
m=sum%7+1;//计算今年的第一天是周几
if(fun(n)==366)
a[1]=29; //如果是闰年,2月就是29天
for(i=0;i<12;i++)
{
printf("%10d月\n",i+1);
printf("*********************************************************\n");
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for(k=0;k<m;k++)
printf(" "); //确定每月的第一天是星期几,比如说是星期三,星期日星期一星期二那里 就全是空格
for(j=1;j<=a[i];j++)
{
printf("%-4d",j); //输出每个月的日期
m++;
if(m%7==0)
printf("\n"); //一周是7天,所以日期每七天换一次行
}
m=m%7; //计算下一个月的第一天是周几
printf("\n\n");
}
}
运行结果:
心得:做做小项目真的是件让人开心呢的事情,学以致用!
问题:怎样让两个月、三个月、甚至六个月输入在同一行呢?