求一篇c语言的万年历程序,要求输入年份和月份就会自动打印出当月的日历,且要用到调用函数。谢谢。
2个回答
展开全部
不难
先说道理
公元一年一月一日是周一,计算到这一天有多少天再除以7,余下的余数就是周几
不过这个可以简化,一年365天,364是7的倍数,那么下一年的第一天就是这一年加上一天
闰年再加上一天。这样就一个循环判断闰年即可
还可以简化一下,400年是一个轮回。400年多出400天,再加上闰年的个数,也就是97个,这样400+97=497,这个也是7的倍数。所以就计算400年以内的就可以
子函数这样
int ye(int year)
{
int y=year%400;
int i,day=y;
for(i=0;i<y;i++)
if(y%4==0&&y%100!=0)
day++;
return day%7;
}
这个是计算year的第一天是周几的
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //这个做为全局变量来用
int mo(int year,int mouth)
{
int i,day=ye(year);
if(闰年判断)
m[1]=29;
else
m[1]=28;
for(i=0;i<nouth-1)
day+=m[i];
return day%7;
}
这个是计算year年mouth月的第一天是周几的
这两个子函数返回值可能差一天,自己调整一下吧
打印子函数
void pr(int mm,int x)
{
int i;
printf("%d\n日 一 二 三 四 五 六\n",mm);
for(i=0;i<k;i++)
printf(" "); //打印前面的空缺
for(i=1;i<=m[mm-1];i++)
{
printf("%4d',i);
k++;
if(k==7)
{
printf("\n");
k=0;
}
}
if(k!=0)
printf("\n");
}
主函数
main()
{
int y,m,k;
scanf("%d %d",&y,&m);
k=mo(y,m);
pr(m,k);
}
先说道理
公元一年一月一日是周一,计算到这一天有多少天再除以7,余下的余数就是周几
不过这个可以简化,一年365天,364是7的倍数,那么下一年的第一天就是这一年加上一天
闰年再加上一天。这样就一个循环判断闰年即可
还可以简化一下,400年是一个轮回。400年多出400天,再加上闰年的个数,也就是97个,这样400+97=497,这个也是7的倍数。所以就计算400年以内的就可以
子函数这样
int ye(int year)
{
int y=year%400;
int i,day=y;
for(i=0;i<y;i++)
if(y%4==0&&y%100!=0)
day++;
return day%7;
}
这个是计算year的第一天是周几的
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //这个做为全局变量来用
int mo(int year,int mouth)
{
int i,day=ye(year);
if(闰年判断)
m[1]=29;
else
m[1]=28;
for(i=0;i<nouth-1)
day+=m[i];
return day%7;
}
这个是计算year年mouth月的第一天是周几的
这两个子函数返回值可能差一天,自己调整一下吧
打印子函数
void pr(int mm,int x)
{
int i;
printf("%d\n日 一 二 三 四 五 六\n",mm);
for(i=0;i<k;i++)
printf(" "); //打印前面的空缺
for(i=1;i<=m[mm-1];i++)
{
printf("%4d',i);
k++;
if(k==7)
{
printf("\n");
k=0;
}
}
if(k!=0)
printf("\n");
}
主函数
main()
{
int y,m,k;
scanf("%d %d",&y,&m);
k=mo(y,m);
pr(m,k);
}
追问
不好意思我还想问一下,那么要打印月的第一天离1800年1月1日的总天数又要怎么求呢?O(∩_∩)O谢谢了。。
追答
计算天数的问题,就是用循环来做
一般来说,两个日子之间的天数就是求三个数
一个是前面的日子这一年省下的天数,
一个是中间年的天数
后面日子到一月一日的天数
这三个天数相加就可以
这三个数都可以做成子函数
第一个和第三个用月份当循环条件,最后加上日所占的天数
中间年这个用年做循环条件,判断闰年,加一天,所有的用365乘以年数即可
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询