用C写的万年历 | 寒山烟雨
现在的位置: 首页 > 小试身手 > 正文

用C写的万年历

2011年11月29日 小试身手 ⁄ 共 1078字 ⁄ 字号 评论 5 条 ⁄ 阅读 6,811 views 次

算是第一个实用的程序吧,具有一定的实用价值。本以为很简单,但是C毕竟是好久不碰了,在细节上仍然还是没能完善代码。果然,C不是一天两天就能掌握会的。
由于是月历,所以,算法采用每月的第一天是星期几的思路确定1号的位置,然后顺延下来。计算星期的方法采用蔡勒公式,这时的C在整数除法上的特点便显示出来优势了——不用专门取整了。

附上蔡勒公式:w=y+\left[\frac{y}{4}\right]+\left[\frac{c}{4}\right]-2c+\left[13\frac{((m+1)}{5}\right]+d-1

w代表星期,取模得星期数(0为周日,1为周一,以此类推),c是年份前两位数,y是年份后两位数,m是月份(1、2月转换成上一年13月和14月),d表示日期。

 C | 
 
 copy code |
?

01
#include<stdio.h>
02
int Zeller(int y,int m);
03
int run(int n);
04
void main()
05
{
06
	int year,month,i,j,k,n=1,day;
07
	printf("欢迎使用万年历查询工具。\n");
08
	printf("请输入要查询的年份(本程序只支持公元后):\n");
09
	scanf("%d",&year);
10
	printf("请输入月份:\n");
11
	scanf("%d",&month);
12
	i=Zeller(year,month);
13
	switch(month)
14
	{
15
	case 1:
16
	case 3:
17
	case 5:
18
	case 7:
19
	case 8:
20
	case 10:
21
	case 12:day=31;break;
22
	case 4:
23
	case 6:
24
	case 9:
25
	case 11:
26
		day=30;break;
27
	case 2:day=run(year);
28
	}
29
	printf("  S  M  T  W  T  F  S\n");
30
	for(j=0;j<=5;j++)
31
	{
32
		for(k=0;k<=6;k++)
33
		{
34
			if((j==0)&&(j*4+k)<i)
35
				printf("   ");
36
			else
37
				if(n<=day)
38
				{
39
				printf("%3d",n);
40
				n++;
41
				}
42
		}
43
		printf("\n");
44
	}
45
}
46
 
47
int Zeller(int y,int m)
48
{
49
	int w,c,d;
50
	c=y/100;
51
	d=y-c*100;
52
	if(m<=2)
53
	{
54
		d-=1;
55
		m+=12;
56
	}
57
	w=d+d/4+c/4-2*c+26*(m+1)/10;
58
	while(w<0)
59
	{
60
		w+=7;
61
	}
62
	return w%7;
63
}
64
 
65
int run(int n)
66
{
67
	if(n%100==0)
68
	{
69
		if(n%400==0)
70
			return 29;
71
		else
72
			return 28;
73
	}
74
	else
75
	{
76
		if(n%4==0)
77
			return 29;
78
		else
79
			return 28;
80
	}
81
}

PS:高亮的滚动条成了鸡肋了。。。。

0

目前有 5 条留言    访客:5 条, 博主:0 条

  1. MaskRay 2012年01月30日 下午11:40  @回复  Δ-49楼 回复
    Firefox Firefox GNU/Linux GNU/Linux

    Ruby吧……说的极端点,Perl->Ruby是个野蛮->开化的过程

  2. tusooa 2011年12月03日 下午1:35  @回复  Δ-48楼 回复
    Firefox Firefox GNU/Linux GNU/Linux

    看下cal.perl就是。

  3. tusooa 2011年12月03日 下午1:17  @回复  Δ-47楼 回复
    Firefox Firefox GNU/Linux GNU/Linux

    真复杂。。。
    ($sec,$min,$hour,$day,$mon,$year,$wan)=localtime(time);
    $year+=1900; $mon+=1; $wan1=($wan+7-($day-1)%7)%7; # 1号是星期几
    $wan%=7;
    ...;
    $pango .= ' ' x $wan1;

  4. DDV 2011年12月02日 下午10:24  @回复  Δ-46楼 回复
    Opera Opera Windows Windows

    “本程序只支持公元后纪念”错别字 o-P

  5. maplebeats 2011年12月01日 下午11:57  @回复  Δ-45楼 回复
    Chromium Chromium Ubuntu Ubuntu

    编译了玩了玩,能用 :lol:

给我留言

留言无头像?


×