正文

万年历(C描述)2005-12-17 21:16:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/smile/8427.html

分享到:

pro1.

#include"stdio.h"

main()
{int k,y,m,min,max,temp,w,z=2;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long total;
char b[8];
loop:printf("\n\nPlease input year ,month:");     /*请输入年,月*/ 
scanf("%d,%d",&y,&m);
if (y%400==0||(y%100!=0&&y%4==0)){a[1]=29;strcpy(b,"Run Nian");} /*判断是平年还是润年*/
else {a[1]=28;strcpy(b,"PingNian");}
if (y>=1980){min=1980;max=y;k=1;}
else{min=y;max=1980;k=-1;}
total=0;
for (temp=min;temp{if (temp==0)continue;
if (temp%400==0||(temp%4==0&&temp%100!=0)) total=total+366;  /*算星期几*/
else total=total+365; 
}

for (temp=0;tempif (k==1) w=(total+z)%7;
if (k==-1) w=(7-(total-z)%7)%7;

printf("\n%d,%d %s\n",y,m,b);
printf("\nSun Mon Tue Wed Tur Fri Sat\n"); /*输出*/

for (temp=0;tempfor (temp=1;temp<=a[m-1];temp++)
{if ((temp-1+w)%7==0) printf("\n");  /*当d/7余数0时是星期天,余数1时是星期一依此类推*/
printf(" %2d ",temp);

}

goto loop;
}

  (  要退出的话,请将loop :  ,goto loop;   删掉!) 在TC,WinTC 调试OK!

-----------------------------------------------------------------------------------

pro2.

 

#include "stdio.h"
int m_day(int year,int month)
 {
   if((year%4==0 && year%100!=0)||(year%400==0))
  switch(month)
   {
     case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31 ;
     case 4: case 6: case 9: case 11: return 30;
   }
   else

   switch(month)
    {
     case 1: case 3: case 5: case 7: case 8: case 10: case 12 : return 31;
     case 2: return 28;
    }
 }
 int main()
 {
  int year ,month;
  int i ,days=0,d,day=0;
  printf("Enter the year and month:\n");/*请输入年,月份*/
  scanf("%d,%d",&year,&month);
  for(i=1;i  days+=m_day(year,i);
  d=year-1+(year-1)/4-(year-1)/100+(year-1)/400+days+1;  /*算星期几的*/
  printf("%d-%d\n",year,month);
  printf("Sunday  Monday  Tuesday  Wednesday  Thursday  Friday  Saturday\n");
  for(i=0;i  printf(" ");
  for(i=1;i<7-d%7;i++)
   {
    day++;
    printf("%5d",day);
   }
   printf("\n");
  while(1)
   {
     for(i=1;i<=7;i++)
       { day++;
  if(day>m_day(year,month))
   { getch(); return 0 ;}
  printf("%5d",day);
       }
     printf("\n");
    }

}
---------------------------------在TC,WinTC 调试OK!--------------------

归纳算星期几的方法:

1.d=a-1+(a-1)/4-(a-1)/100+(a-1)/400+c;
其中a为年c为该日期在本年中的天数,d取整数,当d/7余数0时是星期天,余数1时是星期一依此类推.

2.(润年*366 + 平年*365)%7

3.W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数.

4.对蔡勒(Zeller)公式的改进作者:冯思琮相比于另外一个通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。不过,笔者给出的通用计算公式似乎更加简洁(包括运算过程)。现将公式列于其下:W=[y/4]+r (y/7)-2r(c/4)+m’+d公式中的符号含义如下,r ( )代表取余,即只要余数部分;m’是m的修正数,现给出1至12月的修正数1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4
(注意:在笔者给出的公式中,y为润年时1’=5;2’=1)。其他符号与蔡勒(Zeller)公式中的含义相同。

蔡勒(Zeller)公式w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1公式中的符号含义如下,w:星期;c:世纪;y:年(两位数); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。相比于通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。

----------------------------------------/总结于2005-12-17 21:14  ^_^ 

阅读(3338) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册