免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2053 | 回复: 9
打印 上一主题 下一主题

我想了很久的一个问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-03 12:25 |只看该作者 |倒序浏览
如何编制一个可以打印任何一年日历的程序。我想了很久都没有结果。求助高手给我指点一下,可以不用具体的语言描述,只要用自然语言把具体的实现算法给我指一下既可。谢谢了。

[ 本帖最后由 alizee2219 于 2006-5-16 19:24 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-03-03 12:34 |只看该作者
学Basic 的时候 打印过。
好象可以算出 任何一年的 1月 1 日 是星期几,这个算法得找一下了,
然后就可以根据是否闰年、月末日期、星期 来循环 控制 打印定位、 换行就行。

[ 本帖最后由 wenlq 于 2006-3-3 12:42 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-03-03 13:06 |只看该作者
搜 万年历  得几个程序,供参考
http://www.kehui.net/index.php?o ... =read&aid=33549
http://www.kehui.net/html/article/26/26072.html

#include <stdio.h>

int main(void)
{
int year, month;

int leap(int year);
int get_days(int year, int month, int date);
int get_week(int year, int month, int date);
void calendar(int year, int month);

printf("Enter a year: ");
scanf("%d", &year);
while(year<0)
{
  printf("! illegal year value: year must > 0\n");
  printf("Enter a year: ");
  scanf("%d", &year);
}
printf("Enter a month: ");
scanf("%d", &month);
while(month<1||month>12)
{
  printf("! illegal month value: use 1-12\n");
  printf("Enter a month: ");
  scanf("%d", &month);
}
calendar(year, month);
return 0;
}

/*  判断润年  */
int leap(int year)
{
int leap=0;
if(year%4==0&&year%100!=0||year%400==0)
  leap=1;
return(leap);
}
/*  天数  */
int get_days(int year, int month, int date)
{
int i, days=0;
int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(leap(year))
  m[2]=29;
for(i=1;i<month;i++)
  days+=m;
days+=date;
return(days);
}
/*  星期几  */
int get_week(int year, int month, int date)
{
int week;
week=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400;
week+=get_days(year, month, date);
week%=7;
return(week);
}
/** calendar  **/
void calendar(int year, int month)
{
int i, j;
int m[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(leap(year))
  m[2]=29;
printf("\n%d.%d", year, month);
printf("\n***************************\n");
printf("Sun Mon Tue Wen Thu Fri Sat \n");
for(j=1; j<=get_week(year, month, 1)*4; j++)
  printf(" ");
for(i=1;i<=m[month];i++)
{
  printf("%d",i);
  if(i>=10)
   printf("  ");
  else
   printf("   ");
  if(get_week(year, month, i)==6)
   printf("\n");
}
printf("\n***************************\n");
}

[ 本帖最后由 wenlq 于 2006-3-3 13:20 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-03-03 14:28 |只看该作者
man cal

refer to it's source code.

论坛徽章:
0
5 [报告]
发表于 2006-03-03 16:30 |只看该作者
根据time结构中相对秒参数值进行计算,应该可以。

论坛徽章:
0
6 [报告]
发表于 2006-03-03 19:53 |只看该作者
写过一个很笨的
从公元0年1月1号开始算起
一天一天的加
可以推历史上的任意一天
如果要这么做的话有两个地方要注意
1900年以前的闰年和之后的闰年算法不一样
还有就是1752年的9月。。。

论坛徽章:
0
7 [报告]
发表于 2006-03-05 22:41 |只看该作者
week=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400;
是什么意思。

[ 本帖最后由 alizee2219 于 2006-5-16 19:25 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-03-06 14:38 |只看该作者
原帖由 alizee2219 于 2006-3-5 22:41 发表
week=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400;
是什么意思。


公元元年1月1日刚好是 星期一, 所以星期的基数 可以设定为0

365 % 7 = 1 , 52*7 = 364
所以只要算年份中多出364天的天数就可以了。
week=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400 刚好就是算这个数的。
year -1  是 元年到去年 多出 364 天的 那一天累加。
(year-1)/4-(year-1)/100+(year-1)/400  是算去年前的所有闰年数,就是有几个2月29日了。
在加上 年初 到 要算那日的天数 再 用7 取模 就是星期几了。

我是倒推的,哈哈。

[ 本帖最后由 wenlq 于 2006-3-6 14:43 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-03-06 21:55 |只看该作者

回复 8楼 wenlq 的帖子

楼上大哥,太感谢您了,这句话我已经想了好几天都不能理解,现在听您一说,我才恍然大悟,真是太妙了。

[ 本帖最后由 alizee2219 于 2006-5-16 19:25 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-03-09 16:12 |只看该作者
各种语言(C除外)中都有求日期、年份、月份、星期的函数,直接用就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP