山东胶南天气预:我用c语言编了一个万年历的程序,不知道什么地方错了,请高手们帮我看看,谢谢!

来源:百度文库 编辑:神马品牌网 时间:2024/05/02 07:25:01
#include<stdio.h>
#define x "Mon Tue Wed Thu Fri Sat Sun "
int IsleapYear(int);
void main()
{int i,j,cont[10000],month,year,
a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},
c,s,s1=0,day=0,k,n=0;
scanf("%d,%d",&year,&month);
for(i=1;i<=year;i++)
{if(IsleapYear(i))
cont[i]=366;
else
cont[i]=365;
s1=cont[i]+s1;}
if(IsleapYear(year)&&month>=2)
a[2]++;
for(j=0;j<month;j++)
day=a[j]+day;
s=s1+day;
c=s%7;
printf(x);
printf("\n");
for(k=0;k<c;k++)
printf(" ");
for(k=1;k<=a[month];k++)
{printf("%3d ",k);
n=n+4+c*4;
if(n%28==0)
printf("\n");
}
printf("\n");
}
int IsleapYear(int year)
{if((year%4==0)&&(year%100!=0)||(year%400==0))
return 1;
else return 0;}

1.首先,我们得知道日历的一些变化:

“西方历法的第一次改革是罗马朱利乌斯·凯撒大帝引进的。他采用的四年一闰的闰年方式。由于一个太阳年不刚好是365.25天,而是 365.242199…天。到16世纪,每年11分14秒的误差已经累积成10天,也就是历法上多了10天。于是教皇格利戈里八世进行了一次校正。他在1582年2月24日以教皇训令颁布,将1582年10月5日至14日抹掉,并且对原来的闰年方法进行了校正。经过校正的历法叫格利戈里历法,也就是我们现在用的公历。1752年,英国人决定采用格利戈里历法,不过从1582年到那时,历法又多出了1天,所以英国议会在1752年作出决定,抹掉11天——1752年9月3日至13日。”
--这就影响了上面日历算法的精度了~

还有,公元1年1月1日是星期几必须考虑进来.可参考
http://zhidao.baidu.com/question/5562953.html

2.将s1,s定义成整形变量,会造成溢出.
for(i=1;i<=year;i++)
{if(IsleapYear(i))
cont[i]=366;
else
cont[i]=365;
s1=cont[i]+s1;}
这部分语句中可以看出如果输入了一个四位数年份,那么s1将超过365000,很显然会溢出.造成错误.

3.for(k=0;k<c;k++)
printf(" ");
这个语句在输出格式上会造成字符错位,后面”%d ”占了4个字符,所以,空格应该每次输出4个

4.if(n%28==0)
n=n+4+c*4;
printf("\n");
应该是换行语句吧,也产生了输出错位.不妨换成:
if ((k+c)%7==0)
printf("\n");

5.if(IsleapYear(year)&&month>=2)
建议在month>=2两边加上括号.

总之,这个万年历程序不是很好编写的,需要考虑很多呢~