当前位置:文档之家› 万年历---java算法实现

万年历---java算法实现

万年历---java算法实现
万年历---java算法实现

万年历---java算法实现

万年历是我在网上见到的一份极高高精度的万年历,其采用先进的算法实现,其精度堪比刘安国教授为中国科学院国家授时中心制作的日梭万年历。但网络上只有javascript 版本。于是自己将其翻译为java程序,并公布于此,方便大家使用。

本文中讲的万年历是一款采用现代天文算法制作的农历历算程序,含有公历与回历信息,可以很方便的进行公、农、回三历之间的转换。提供公元-4712年到公元9999年的日期查询功能。其中1500年到1940农历数据已经与陈垣的《二十史朔闰表》核对;含有从公420元(南北朝/宋武帝元年)到今的基本年号。在过去几百年中,寿星万年历的误差是非常小的,节气时刻计算及日月合朔时刻的平均误差小于1秒,太阳坐标的最大可能误差为0.2角秒,月亮坐标的最大可能误差为3角秒,平均误差为误差的1/6。万年历中含有几百个国内城市的经纬度,并且用户可根据自已的需要扩展经纬度数据。

代码如下:

/**

* @author lxslove

* @mail moodlxs at 163

*

*/

public class SolarTerm {

// ========角度变换===============

private static final double rad = 180 * 3600 / Math.PI; // 每弧度的角秒数

private static final double RAD = 180 / Math.PI; // 每弧度的角度数

// ================日历计算===============

private static final double J2000 = 2451545; // 2000年前儒略日数(2000-1-1

// 12:00:00格林威治平时)

// =========黄赤交角及黄赤坐标变换===========

private static final double hcjjB[] = { 84381.448, -46.8150, -0.00059,

0.001813 };// 黄赤交角系数表

private static final double preceB[] = { 0, 50287.92262, 111.24406,

0.07699, -0.23479, -0.00178, 0.00018, 0.00001 };// Date黄道上的岁差p

private double Y = 2000;

private double M = 1;

private double D = 1;

private double h = 12;

private double m = 0;

private double s = 0;

private static final double[] dts = {

// 世界时与原子时之差计算表

-4000, 108371.7, -13036.80, 392.000, 0.0000, -500, 17201.0,

-627.82, 16.170, -0.3413, -150, 12200.6, -346.41, 5.403, -0.1593, 150, 9113.8, -328.13, -1.647, 0.0377, 500, 5707.5, -391.41, 0.915, 0.3145, 900, 2203.4, -283.45, 13.034, -0.1778, 1300, 490.1, -57.35, 2.085, -0.0072, 1600, 120.0, -9.81, -1.532, 0.1403, 1700, 10.2,

-0.91, 0.510, -0.0370, 1800, 13.4, -0.72, 0.202, -0.0193, 1830,

7.8, -1.81, 0.416, -0.0247, 1860, 8.3, -0.13, -0.406, 0.0292, 1880, -5.4, 0.32, -0.183, 0.0173, 1900, -2.3, 2.06, 0.169, -0.0135, 1920, 21.2, 1.69, -0.304, 0.0167, 1940, 24.2, 1.22, -0.064, 0.0031, 1960, 33.2, 0.51, 0.231, -0.0109, 1980, 51.0, 1.29, -0.026, 0.0032, 2000, 64.7, -1.66, 5.224, -0.2905, 2150, 279.4, 732.95, 429.579, 0.0158, 6000 };

// 取整数部分

public static double int2(double v) {

v = Math.floor(v);

if (v < 0)

return v + 1;

return v;

}

// 对超过0-2PI的角度转为0-2PI

public static double rad2mrad(double v) {

v = v % (2 * Math.PI);

if (v < 0)

return v + 2 * Math.PI;

return v;

}

// 计算世界时与原子时之差,传入年

public double deltatT(double y) {

int i = 0;

for (i = 0; i < 100; i += 5)

if (y < dts[i + 5] || i == 95)

break;

double t1 = (y - dts[i]) / (dts[i + 5] - dts[i]) * 10;

double t2 = t1 * t1;

double t3 = t2 * t1;

return dts[i + 1] + dts[i + 2] * t1 + dts[i + 3] * t2 + dts[i + 4] * t3;

}

// 传入儒略日(J2000起算),计算UTC与原子时的差(单位:日)

public double deltatT2(double jd) {

return this.deltatT(jd / 365.2425 + 2000) / 86400.0;

}

// 公历转儒略日,UTC=1表示原日期是UTC

public double toJD(boolean UTC) {

double y = this.Y; // 取出年月

double m = this.M;

double n = 0;

if (m <= 2) {

m += 12;

y--;

}

if (this.Y * 372 + this.M * 31 + this.D >= 588829) {

// 判断是否为格里高利历日1582*372+10*31+15

n = int2(y / 100);

n = 2 - n + int2(n / 4);// 加百年闰

}

n += int2(365.2500001 * (y + 4716)); // 加上年引起的偏移日数

n += int2(30.6 * (m + 1)) + this.D; // 加上月引起的偏移日数及日偏移数 n += ((this.s / 60 + this.m) / 60 + this.h) / 24 - 1524.5;

if (UTC)

return n + this.deltatT2(n - J2000);

}

// 儒略日数转公历,UTC=1表示目标公历是UTC

public void setFromJD(double jd, boolean UTC) {

if (UTC)

jd -= this.deltatT2(jd - J2000);

jd += 0.5;

// 取得日数的整数部份A及小数部分F

double A = int2(jd);

double F = jd - A;

double D;

if (A > 2299161) {

D = int2((A - 1867216.25) / 36524.25);

A += 1 + D - int2(D / 4);

}

A += 1524; // 向前移4年零2个月

this.Y = int2((A - 122.1) / 365.25);// 年

D = A - int2(365.25 * this.Y); // 去除整年日数后余下日数

this.M = int2(D / 30.6001); // 月数

this.D = D - int2(this.M * 30.6001);// 去除整月日数后余下日数 this.Y -= 4716;

this.M--;

if (this.M > 12)

this.M -= 12;

if (this.M <= 2)

this.Y++;

// 日的小数转为时分秒

F *= 24;

this.h = int2(F);

F -= this.h;

F *= 60;

this.m = int2(F);

F -= this.m;

F *= 60;

}

// 设置时间,参数例:"20000101 120000"或"20000101"

public void setFromStr(String s) {

this.Y = Double.parseDouble(s.substring(0, 4));

this.M = Double.parseDouble(s.substring(4, 2));

this.D = Double.parseDouble(s.substring(6, 2));

this.h = Double.parseDouble(s.substring(9, 2));

this.m = Double.parseDouble(s.substring(11, 2));

this.s = Double.parseDouble(s.substring(13, 2)); /* 将5改为了2 */ }

// 日期转为串

public String toStr() {

String Y = " " + (int)this.Y;

String M = "0" + (int)this.M;

String D = "0" + (int)this.D;

double h = this.h, m = this.m, s = Math.floor(this.s + .5);

if (s >= 60) {

s -= 60;

m++;

}

if (m >= 60) {

m -= 60;

h++;

}

String sh = "0" + (int)h, sm = "0" + (int)m, ss = "0" + (int)s;

Y = Y.substring(Y.length() - 5, Y.length());

M = M.substring(M.length() - 2, M.length());

D = D.substring(D.length() - 2, D.length());

sh = sh.substring(sh.length() - 2, sh.length());

sm = sm.substring(sm.length() - 2, sm.length());

ss = ss.substring(ss.length() - 2, ss.length());

return Y + "-" + M + "-" + D + " " + sh + ":" + sm + ":" + ss;

}

// 算出:jd转到当地UTC后,UTC日数的整数部分或小数部分

// 基于J2000力学时jd的起算点是12:00:00时,所以跳日时刻发生在12:00:00,这与日历计算发生矛盾

// 把jd改正为00:00:00起算,这样儒略日的跳日动作就与日期的跳日同步

// 改正方法为jd=jd+0.5-deltatT+shiqu/24

// 把儒略日的起点移动-0.5(即前移12小时)

// 式中shiqu是时区,北京的起算点是-8小时,shiqu取8

public double Dint_dec(double jd, int shiqu, boolean dec) {

double u = jd + 0.5 - this.deltatT2(jd) + shiqu / 24;

if (dec)

return Math.floor(u); // 返回整数部分

else

return u - Math.floor(u); // 返回小数部分

}

// 计算两个日期的相差的天数,输入字串格式日期,如:"20080101"

double d1_d2(String d1, String d2) {

double Y = this.Y, M = this.M, D = this.D, h = this.h, m = this.m, s = this.s; // 备份原来的数据

this.setFromStr(d1.substring(0, 8) + " 120000");

double jd1 = this.toJD(false);

this.setFromStr(d2.substring(0, 8) + " 120000");

double jd2 = this.toJD(false);

this.Y = Y;

this.M = M;

this.D = D;

this.h = h;

this.m = m;

this.s = s; // 还原

if (jd1 > jd2)

return Math.floor(jd1 - jd2 + .0001);

else

return -Math.floor(jd2 - jd1 + .0001);

}

// 返回黄赤交角(常规精度),短期精度很高

public static double hcjj1(double t) {

double t1 = t / 36525;

double t2 = t1 * t1;

double t3 = t2 * t1;

return (hcjjB[0] + hcjjB[1] * t1 + hcjjB[2] * t2 + hcjjB[3] * t3) / rad;

}

// 黄赤转换(黄赤坐标旋转)

public static void HCconv(double[] JW, double E) {

// 黄道赤道坐标变换,赤到黄E取负

double HJ = rad2mrad(JW[0]), HW = JW[1];

double sinE = Math.sin(E), cosE = Math.cos(E);

double sinW = cosE * Math.sin(HW) + sinE * Math.cos(HW) * Math.sin(HJ); double J = Math.atan2(Math.sin(HJ) * cosE - Math.tan(HW) * sinE, Math

.cos(HJ));

JW[0] = rad2mrad(J);

JW[1] = Math.asin(sinW);

}

// 补岁差

public static void addPrece(double jd, double[] zb) {

int i;

double t = 1, v = 0, t1 = jd / 365250;

for (i = 1; i < 8; i++) {

t *= t1;

v += preceB[i] * t;

}

zb[0] = rad2mrad(zb[0] + (v + 2.9965 * t1) / rad);

}

// ===============光行差==================

private static final double GXC_e[] = { 0.016708634, -0.000042037,

-0.0000001267 }; // 离心率

private static final double GXC_p[] = { 102.93735 / RAD, 1.71946 / RAD,

0.00046 / RAD }; // 近点

private static final double GXC_l[] = { 280.4664567 / RAD,

36000.76982779 / RAD, 0.0003032028 / RAD, 1 / 49931000 / RAD,

-1 / 153000000 / RAD }; // 太平黄经

private static final double GXC_k = 20.49552 / rad; // 光行差常数

// 恒星周年光行差计算(黄道坐标中)

public static void addGxc(double t, double[] zb) {

double t1 = t / 36525;

double t2 = t1 * t1;

double t3 = t2 * t1;

double t4 = t3 * t1;

double L = GXC_l[0] + GXC_l[1] * t1 + GXC_l[2] * t2 + GXC_l[3] * t3

+ GXC_l[4] * t4;

double p = GXC_p[0] + GXC_p[1] * t1 + GXC_p[2] * t2;

double e = GXC_e[0] + GXC_e[1] * t1 + GXC_e[2] * t2;

double dL = L - zb[0], dP = p - zb[0];

zb[0] -= GXC_k * (Math.cos(dL) - e * Math.cos(dP)) / Math.cos(zb[1]);

zb[1] -= GXC_k * Math.sin(zb[1]) * (Math.sin(dL) - e * Math.sin(dP));

zb[0] = rad2mrad(zb[0]);

}

// ===============章动计算==================

private static final double nutB[] = {// 章动表

2.1824391966, -3

3.757045954, 0.0000362262, 3.7340E-08, -2.8793E-10, -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738,

0.0000105845, 6.9813E-10, -2.2815E-10, -13187, -16, 5736, -31,

1.3375032491, 16799.418221925, -0.0000511866, 6.4626E-08,

-5.3543E-10, -2274, -2, 977, -5, 4.3648783932, -67.514091907,

0.0000724525, 7.4681E-08, -5.7586E-10, 2062, 2, -895, 5,

0.0431251803, -628.301955171, 0.0000026820, 6.5935E-10, 5.5705E-11, -1426, 34, 54, -1, 2.3555557435, 8328.691425719, 0.0001545547,

2.5033E-07, -1.1863E-09, 712, 1, -7, 0,

3.4638155059,

1884.965885909, 0.0000079025, 3.8785E-11, -2.8386E-10, -517, 12,

224, -6, 5.4382493597, 16833.175267879, -0.0000874129, 2.7285E-08, -2.4750E-10, -386, -4, 200, 0, 3.6930589926, 25128.109647645,

0.0001033681, 3.1496E-07, -1.7218E-09, -301, 0, 129, -1,

3.5500658664, 628.361975567, 0.0000132664, 1.3575E-09, -1.7245E-10, 217, -5, -95, 3 };

public static class ZD {

public double Lon;

public double Obl;

}

// 计算黄经章动及交角章动

public static ZD nutation(double t) {

ZD d = new ZD();

d.Lon = 0;

d.Obl = 0;

t /= 36525;

double c, t1 = t, t2 = t1 * t1, t3 = t2 * t1, t4 = t3 * t1;// t5=t4*t1;

for (int i = 0; i < nutB.length; i += 9) {

c = nutB[i] + nutB[i + 1] * t1 + nutB[i + 2] * t2 + nutB[i + 3]

* t3 + nutB[i + 4] * t4;

d.Lon += (nutB[i + 5] + nutB[i + 6] * t / 10) * Math.sin(c); // 黄经章动

d.Obl += (nutB[i + 7] + nutB[i + 8] * t / 10) * Math.cos(c); // 交角章动

}

d.Lon /= rad * 10000; // 黄经章动

d.Obl /= rad * 10000; // 交角章动

return d;

}

// 本函数计算赤经章动及赤纬章动

public static void nutationRaDec(double t, double[] zb) {

double Ra = zb[0], Dec = zb[1];

double E = hcjj1(t), sinE = Math.sin(E), cosE = Math.cos(E); // 计算黄赤交角 ZD d = nutation(t); // 计算黄经章动及交角章动

double cosRa = Math.cos(Ra), sinRa = Math.sin(Ra);

double tanDec = Math.tan(Dec);

zb[0] += (cosE + sinE * sinRa * tanDec) * d.Lon - cosRa * tanDec

* d.Obl; // 赤经章动

zb[1] += sinE * cosRa * d.Lon + sinRa * d.Obl; // 赤纬章动

zb[0] = rad2mrad(zb[0]);

}

//=================以下是月球及地球运动参数表=================== /***************************************

* 如果用记事本查看此代码,请在"格式"菜单中去除"自动换行"

* E10是关于地球的,格式如下:

* 它是一个数组,每3个数看作一条记录,每条记录的3个数记为A,B,C

* rec=A*cos(B+C*t); 式中t是J2000起算的儒略千年数

* 每条记录的计算结果(即rec)取和即得地球的日心黄经的周期量L0

* E11格式如下: rec = A*cos*(B+C*t) *t, 取和后得泊松量L1

* E12格式如下: rec = A*cos*(B+C*t) *t*t, 取和后得泊松量L2

* E13格式如下: rec = A*cos*(B+C*t) *t*t*t, 取和后得泊松量L3

* 最后地球的地心黄经:L = L0+L1+L2+L3+...

* E20,E21,E22,E23...用于计算黄纬

* M10,M11等是关于月球的,参数的用法请阅读Mnn()函数

*****************************************/

//地球运动VSOP87参数

private static final double E10[] = { //黄经周期项

1.75347045673, 0.00000000000, 0.0000000000, 0.03341656456,

4.66925680417, 6283.0758499914, 0.00034894275, 4.62610241759,

12566.1516999828, 0.00003417571, 2.82886579606, 3.5231183490,

0.00003497056, 2.74411800971, 5753.3848848968, 0.00003135896, 3.62767041758, 77713.7714681205, 0.00002676218,

4.41808351397, 7860.4193924392, 0.00002342687,

6.135********, 3930.2096962196,

0.00001273166, 2.0370*******, 529.6909650946, 0.00001324292, 0.74246356352, 11506.7697697936, 0.00000901855,

2.0450*******, 26.2983197998, 0.00001199167, 1.10962944315, 1577.3435424478,

0.00000857223, 3.50849156957, 398.1490034082, 0.00000779786,

1.178********, 5223.6939198022, 0.00000990250,

5.23268129594, 5884.9268465832, 0.00000753141,

2.53339053818, 5507.5532386674,

0.00000505264, 4.58292563052, 18849.2275499742, 0.00000492379,

4.20506639861, 77

5.5226113240, 0.00000356655,

2.91954116867, 0.0673103028, 0.00000284125, 1.89869034186, 796.2980068164, 0.00000242810, 0.34481140906, 5486.7778431750, 0.00000317087, 5.84901952218, 11790.6290886588, 0.00000271039, 0.31488607649,

10977.0788046990, 0.00000206160, 4.80646606059, 2544.3144198834,

0.00000205385, 1.86947813692, 5573.1428014331, 0.00000202261,

2.45767795458, 6069.7767545534, 0.00000126184,

1.0830*******, 20.7753954924, 0.00000155516, 0.83306073807, 213.2990954380, 0.00000115132, 0.64544911683, 0.9803210682, 0.00000102851,

0.63599846727, 4694.0029547076, 0.00000101724,

4.26679821365, 7.1135470008, 0.00000099206, 6.20992940258, 2146.1654164752, 0.00000132212, 3.41118275555, 2942.4634232916, 0.00000097607,

0.68101272270, 155.4203994342, 0.00000085128,

1.29870743025, 6275.9623029906, 0.00000074651,

1.75508916159, 5088.6288397668,

0.00000101895, 0.97569221824, 15720.8387848784, 0.00000084711,

3.67080093025, 71430.6956181291, 0.00000073547,

4.67926565481, 801.8209311238, 0.00000073874,

3.50319443167, 315

4.6870848956,

0.00000078756, 3.03698313141, 12036.4607348882, 0.00000079637,

1.80791330700, 17260.1546546904, 0.00000085803,

5.98322631256,161000.6857376741, 0.00000056963,

2.78430398043, 6286.5989683404,

0.00000061148, 1.81839811024, 7084.8967811152, 0.00000069627,

0.83297596966, 9437.7629348870, 0.00000056116, 4.38694880779,

14143.4952424306, 0.00000062449, 3.97763880587, 8827.3902698748,

0.00000051145, 0.28306864501, 5856.4776591154, 0.00000055577,

3.47006009062, 6279.5527316424, 0.00000041036,

5.36817351402, 8429.2412664666, 0.00000051605,

1.33282746983, 1748.0164130670,

0.00000051992, 0.189********, 12139.5535091068, 0.00000049000,

0.48735065033, 1194.4470102246, 0.00000039200, 6.16832995016,

10447.3878396044, 0.00000035566, 1.77597314691, 6812.7668150860,

0.00000036770, 6.0413*******, 10213.2855462110, 0.00000036596,

2.56955238628, 1059.3819301892, 0.00000033291, 0.59309499459,

17789.8456197850, 0.00000035954, 1.70876111898, 2352.8661537718};

private static final double E11[] = { //黄经泊松1项

6283.31966747491,0.00000000000, 0.0000000000, 0.00206058863,

2.67823455584, 628

3.0758499914, 0.00004303430, 2.63512650414,

12566.1516999828, 0.00000425264, 1.59046980729, 3.5231183490,

0.00000108977, 2.96618001993, 1577.3435424478, 0.00000093478, 2.59212835365,

18849.2275499742, 0.00000119261,

5.79557487799, 2

6.2983197998, 0.00000072122, 1.138********, 529.6909650946, 0.00000067768, 1.87472304791, 398.1490034082, 0.00000067327,

4.40918235168, 5507.5532386674, 0.00000059027,

2.88797038460, 522

3.6939198022, 0.00000055976,

2.17471680261, 155.4203994342,

0.00000045407, 0.39803079805, 796.2980068164, 0.00000036369,

0.46624739835, 775.5226113240, 0.00000028958,

2.64707383882, 7.1135470008, 0.00000019097, 1.84628332577, 5486.7778431750, 0.00000020844, 5.34138275149, 0.9803210682, 0.00000018508,

4.96855124577, 213.2990954380, 0.00000016233,

0.03216483047, 2544.3144198834, 0.00000017293,

2.99116864949, 6275.9623029906};

private static final double E12[] = { //黄经泊松2项

0.00052918870, 0.00000000000, 0.0000000000, 0.00008719837,

1.07209665242, 6283.0758499914, 0.00000309125, 0.86728818832,

12566.1516999828, 0.00000027339, 0.05297871691, 3.5231183490,

0.00000016334, 5.188********, 26.2983197998, 0.00000015752,

3.68457889430, 155.4203994342, 0.00000009541, 0.75742297675,

18849.2275499742, 0.00000008937, 2.0570*******, 77713.7714681205,

0.00000006952, 0.82673305410, 775.5226113240, 0.00000005064,

4.66284525271, 1577.3435424478};

private static final double E13[] = { 0.00000289226,

5.84384198723, 6283.0758499914, 0.00000034955, 0.00000000000, 0.0000000000, 0.00000016819, 5.48766912348, 1256

6.1516999828};

private static final double E14[] = { 0.00000114084,

3.14159265359, 0.0000000000, 0.00000007717,

4.134********, 6283.0758499914, 0.00000000765, 3.83803776214, 12566.1516999828};

private static final double E15[] = { 0.00000000878, 3.14159265359, 0.0000000000 }; private static final double E20[] = { //黄纬周期项

0.00000279620, 3.198********, 84334.6615813083, 0.00000101643,

5.42248619256, 5507.5532386674, 0.00000080445,

3.88013204458, 5223.6939198022, 0.00000043806,

3.70444689758, 2352.8661537718,

0.00000031933, 4.00026369781, 1577.3435424478, 0.00000022724,

3.98473831560, 1047.7473117547, 0.00000016392,

3.56456119782, 5856.4776591154, 0.00000018141,

4.98367470263, 6283.0758499914,

0.00000014443, 3.70275614914, 9437.7629348870, 0.00000014304, 3.41117857525, 10213.2855462110};

private static final double E21[] = { 0.00000009030,

3.89729061890, 5507.5532386674, 0.00000006177,

1.73038850355, 5223.6939198022};

private static final double E30[] = { //距离周期项

1.00013988799, 0.00000000000, 0.0000000000, 0.01670699626,

3.09846350771, 6283.0758499914, 0.00013956023, 3.0552*******,

12566.1516999828, 0.00003083720, 5.198********, 77713.7714681205,

0.00001628461, 1.173********, 5753.3848848968, 0.00001575568,

2.84685245825, 7860.4193924392, 0.00000924799, 5.45292234084,

11506.7697697936, 0.00000542444, 4.56409149777, 3930.2096962196};

private static final double E31[] = { 0.00103018608,

1.10748969588, 6283.0758499914, 0.00001721238, 1.06442301418,

12566.1516999828, 0.00000702215, 3.14159265359, 0.0000000000};

private static final double E32[] = { 0.00004359385,

5.78455133738, 6283.0758499914 };

private static final double E33[] = { 0.00000144595,

4.27319435148, 6283.0758499914 };

//月球运动参数

private static final double M10[] = {

22639.5858800, 2.3555545723, 8328.6914247251, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 4586.4383203, 8.0413790709, 7214.0628654588,-2.1850087E-04,-

1.8646419E-07, 8.7760973E-10, 2369.9139357, 10.3969336431, 1554

2.7542901840,-6.6188121E-05, 6.3946925E-08,-

3.0872935E-10, 769.0257187,

4.7111091445, 16657.3828494503, 3.0462550E-04,

5.0082223E-07,-2.3726782E-09,

-666.4175399, -0.0431256817, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-5.4439728E-11, -411.5957339, 3.2558104895, 16866.9323152810,-1.2804259E-04,-

9.8998954E-09, 4.0433461E-11, 211.6555524, 5.6858244986, -1114.6285592663,-

3.7081362E-04,-

4.3687530E-07, 2.0639488E-

09, 205.4359530, 8.0845047526, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10,

191.9561973, 12.7524882154, 23871.4457149091, 8.6124629E-05, 3.1435804E-07,-1.4950684E-09, 164.7286185, 10.4400593249, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, -147.3213842, -2.3986802540, -7700.3894694766,-1.5497663E-04,-2.4979472E-07, 1.1318993E-09, -

124.9881185, 5.1984668216, 7771.3771450920,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10,

-109.3803637, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09, 55.1770578, 7.1411231536, -1324.1780250970, 6.1854469E-05, 7.3846820E-08,-3.4916281E-10, -45.0996092, 5.6113650618, 25195.6237400061, 2.4270161E-05, 2.4051122E-07,-1.1459056E-09, 39.5333010, -0.9002559173, -8538.2408905558, 2.8035534E-04, 2.6031101E-07,-1.2267725E-09,

38.4298346, 18.4383127140, 22756.8171556428,-2.8468899E-04,-1.2251727E-07, 5.6888037E-10, 36.1238141, 7.0666637168, 24986.0742741754, 4.5693825E-04, 7.5123334E-07,-3.5590172E-09, 30.7725751, 16.0827581417, 14428.1257309177,-4.3700174E-04,-3.7292838E-07, 1.7552195E-09, -

28.3971008, 7.9982533891, 7842.3648207073,-2.2116475E-04,-1.8584780E-07,

8.2317000E-10,

-24.3582283, 10.3538079614, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10, -18.5847068, 2.8429122493, -557.3142796331,-1.8540681E-04,-

2.1843765E-07, 1.0319744E-09, 17.9544674, 5.1553411398, 8399.6791003405,-

3.5757942E-05, 3.2589854E-08,-2.0880440E-10, 1

4.5302779, 12.7956138971, 23243.1437596606, 8.8788511E-05, 3.1374165E-07,-1.4406287E-09,

14.3796974, 15.1080427876, 32200.1371396342, 2.3843738E-04, 5.6476915E-07,-2.6814075E-09, 14.2514576,-24.0810366320, -2.3011998397, 1.5231275E-04,

2.5041111E-07,-1.1863391E-09, 1

3.8990596, 20.7938672862, 31085.5085803679,-1.3237624E-04, 1.2789385E-07,-6.1745870E-10, 13.1940636, 3.3302699264, -9443.3199839914,-5.2312637E-04,-6.8728642E-07, 3.2502879E-09,

-9.6790568, -4.7542348263,-16029.0808942018,-3.0728938E-04,-5.0020584E-07, 2.3182384E-09, -9.3658635, 11.2971895604, 24080.9951807398,-3.4654346E-04,-1.9636409E-07, 9.1804319E-10, 8.6055318, 5.7289501804, -1742.9305145148,-

3.6814974E-04,-

4.3749170E-07, 2.1183885E-09, -8.4530982, 7.5540213938, 16100.0685698171, 1.1921869E-04, 2.8238458E-07,-1.3407038E-09,

8.0501724, 10.4831850066, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10, -7.6301553, 4.6679834628, 17285.6848046987, 3.0196162E-04, 5.0143862E-07,-2.4271179E-09, -7.4474952, -0.0862513635, 1256.6039104970,-

5.3277630E-06, 1.2327842E-09,-1.0887946E-

10, 7.3712011, 8.1276304344, 5957.4589549619,-2.1317311E-04,-1.8769697E-07, 9.8648918E-10,

7.0629900, 0.9591375719, 33.7570471374,-3.0829302E-05,-3.6967043E-08, 1.7385419E-10, -6.3831491, 9.4966777258, 7004.5133996281, 2.1416722E-04, 3.2425793E-07,-1.5355019E-09, -5.7416071, 13.6527441326, 32409.6866054649,-1.9423071E-04, 5.4047029E-08,-2.6829589E-10, 4.3740095, 18.4814383957, 22128.5152003943,-2.8202511E-04,-1.2313366E-07, 6.2332010E-10,

-3.9976134, 7.9669196340, 33524.3151647312, 1.7658291E-04, 4.9092233E-07,-2.3322447E-09, -3.2096876, 13.2398458924, 14985.4400105508,-2.5159493E-04,-1.5449073E-07, 7.2324505E-10, -2.9145404, 12.7093625336, 24499.7476701576, 8.3460748E-05, 3.1497443E-07,-1.5495082E-09, 2.7318890, 16.1258838235, 13799.8237756692,-4.3433786E-04,-3.7354477E-07, 1.8096592E-09,

-2.5679459, -2.4418059357, -7072.0875142282,-1.5764051E-04,-2.4917833E-07, 1.0774596E-09, -2.5211990, 7.9551277074, 8470.6667759558,-2.2382863E-04,-1.8523141E-07, 7.6873027E-10, 2.4888871, 5.6426988169, -486.3266040178,-

3.7347750E-04,-

4.3625891E-07, 2.0095091E-09, 2.1460741, 7.1842488353, -1952.4799803455, 6.4518350E-05, 7.3230428E-08,-2.9472308E-10,

1.9777270, 23.1494218585, 39414.2000050930, 1.9936508E-05, 3.7830496E-07,-1.8037978E-09, 1.9336825, 9.4222182890, 33314.7656989005, 6.0925100E-04, 1.0016445E-06,-4.7453563E-09, 1.8707647, 20.8369929680, 30457.2066251194,-1.2971236E-04, 1.2727746E-07,-5.6301898E-10, -1.7529659, 0.4873576771, -8886.0057043583,-3.3771956E-04,-4.6884877E-07,

2.2183135E-09,

-1.4371624, 7.0979974718, -695.8760698485, 5.9190587E-05, 7.4463212E-08,-

4.0360254E-10, -1.3725701, 1.4552986550, -209.5494658307, 4.3266809E-04,

5.1072212E-07,-2.4131116E-09, 1.2618162, 7.5108957121, 16728.3705250656, 1.1655481E-04, 2.8300097E-07,-1.3951435E-09};

private static final double M11[] = {

1.6768000, -0.0431256817, 628.3019552485,-

2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.5164200, 11.2260974062, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, 0.4138300, 1

3.5816519784, 1491

4.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-

10, 0.3711500, 5.5402729076, 7700.3894694766, 1.5497663E-04, 2.4979472E-07,-1.1318993E-09,

0.2756000, 2.3124288905, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-

1.2407788E-09, 0.2459863,-25.6198212459, -

2.3011998397, 1.5231275E-04,

2.5041111E-07,-1.1863391E-09, 0.0711800, 7.9982533891, 7842.3648207073,-

2.2116475E-04,-1.8584780E-07, 8.2317000E-10, 0.0612800, 10.3538079614, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-

3.6316908E-10};

private static final double M12[] = { 0.0048700, -0.0431256817, 628.3019552485,-

2.6638815E-06, 6.1639211E-10,-5.4439728E-11, 0.0022800,-27.1705318325, -

2.3011998397, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09, 0.0015000,

11.2260974062, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10}; private static final double M20[] = {

18461.2400600, 1.6279052448, 8433.4661576405,-6.4021295E-05,-4.9499477E-09, 2.0216731E-11, 1010.1671484, 3.9834598170, 16762.1575823656, 8.8291456E-05, 2.4546117E-07,-1.1661223E-09, 999.6936555, 0.7276493275, -104.7747329154,

2.1633405E-04, 2.5536106E-07,-1.2065558E-

09, 623.6524746, 8.7690283983, 7109.2881325435,-2.1668263E-06, 6.8896872E-08,-3.2894608E-10,

199.4837596, 9.6692843156, 15647.5290230993,-2.8252217E-04,-1.9141414E-07, 8.9782646E-10, 166.5741153, 6.4134738261, -1219.4032921817,-1.5447958E-04,-1.8151424E-07, 8.5739300E-10, 117.2606951, 12.024*******, 23976.2204478244,-1.3020942E-04, 5.8996977E-08,-2.8851262E-10, 61.9119504, 6.3390143893, 25090.8490070907, 2.4060421E-04, 4.9587228E-07,-2.3524614E-09,

33.3572027, 11.1245829706, 15437.9795572686, 1.5014592E-04, 3.1930799E-07,-1.5152852E-09, 31.7596709, 3.0832038997, 8223.9166918098, 3.6864680E-04,

5.0577218E-07,-2.3928949E-09, 29.5766003, 8.8121540801, 6480.9861772950,

4.9705523E-07, 6.8280480E-08,-2.7450635E-10, 1

5.5662654, 4.0579192538, -9548.0947169068,-3.0679233E-04,-4.3192536E-07, 2.0437321E-09,

15.1215543, 14.3803934601, 32304.9118725496, 2.2103334E-05, 3.0940809E-07,-1.4748517E-09, -12.0941511, 8.7259027166, 7737.5900877920,-4.8307078E-06,

6.9513264E-08,-3.8338581E-10, 8.8681426, 9.7124099974, 15019.2270678508,-

2.7985829E-04,-1.9203053E-07, 9.5226618E-

10, 8.0450400, 0.6687636586, 8399.7091105030,-3.3191993E-05, 3.2017096E-08,-1.5363746E-10,

7.9585542, 12.0679645696, 23347.9184925760,-1.2754553E-04, 5.8380585E-08,-2.3407289E-10, 7.4345550, 6.4565995078, -1847.7052474301,-1.5181570E-04,-

1.8213063E-07, 9.1183272E-10, -6.7314363, -4.0265854988,-16133.8556271171,-9.0955337E-05,-

2.4484477E-07, 1.1116826E-09, 6.5795750, 16.8104074692,

14323.3509980023,-2.2066770E-04,-1.1756732E-07, 5.4866364E-10,

-6.4600721, 1.5847795630, 9061.7681128890,-6.6685176E-05,-4.3335556E-09,-3.4222998E-11, -6.2964773, 4.8837157343, 25300.3984729215,-1.9206388E-04,-

1.4849843E-08, 6.0650192E-11, -5.6323538, -0.7707750092, 733.0766881638,-

2.1899793E-04,-2.5474467E-07, 1.1521161E-09, -5.3683961, 6.8263720663, 16204.8433027325,-9.7115356E-05, 2.7023515E-08,-1.3414795E-10,

-5.3112784, 3.9403341353, 17390.4595376141, 8.5627574E-05, 2.4607756E-07,-

1.2205621E-09, -5.0759179, 0.6845236457, 523.5272223331,

2.1367016E-04,

2.5597745E-07,-1.2609955E-09, -4.8396143, -1.6710309265, -7805.1642023920, 6.1357413E-05, 5.5663398E-09,-7.4656459E-11, -4.8057401,

3.5705615768, -662.0890125485, 3.0927234E-05, 3.6923410E-08,-1.7458141E-10,

3.9840545, 8.6945689615, 33419.5404318159, 3.9291696E-04, 7.4628340E-07,-3.5388005E-09, 3.6744619, 19.1659620415, 22652.0424227274,-6.8354947E-05, 1.3284380E-07,-6.3767543E-10, 2.9984815, 20.0662179587, 31190.2833132833,-3.4871029E-04,-1.2746721E-07, 5.8909710E-10, 2.7986413, -2.5281611620,-16971.7070481963, 3.4437664E-04, 2.6526096E-07,-1.2469893E-09,

2.4138774, 17.7106633865, 22861.5918885581,-5.0102304E-04,-

3.7787833E-07, 1.7754362E-09, 2.1863132, 5.5132179088, -9757.6441827375, 1.2587576E-04, 7.8796768E-08,-3.6937954E-10, 2.1461692, 13.4801375428, 23766.6709819937, 3.0245868E-04, 5.6971910E-07,-2.7016242E-09, 1.7659832, 11.1677086523, 14809.6776020201, 1.5280981E-04, 3.1869159E-07,-1.4608454E-09,

-1.6244212, 7.3137297434, 7318.8375983742,-4.3483492E-04,-4.4182525E-07, 2.0841655E-09, 1.5813036, 5.4387584720, 16552.6081165349, 5.2095955E-04, 7.5618329E-07,-3.5792340E-09, 1.5197528, 16.7359480324, 40633.6032972747, 1.7441609E-04, 5.5981921E-07,-2.6611908E-09, 1.5156341, 1.7023646816,-17876.7861416319,-4.5910508E-04,-6.8233647E-07, 3.2300712E-09,

1.5102092, 5.4977296450, 8399.6847301375,-3.3094061E-05, 3.1973462E-08,-1.5436468E-10, -1.3178223, 9.6261586339, 16275.8309783478,-

2.8518605E-04,-1.9079775E-07, 8.4338673E-10, -1.2642739, 11.9817132061, 24604.5224030729,-1.3287330E-04, 5.9613369E-08,-

3.4295235E-10, 1.1918723, 22.4217725310, 39518.9747380084,-1.9639754E-04, 1.2294390E-07,-5.9724197E-10,

1.1346110, 14.4235191419, 31676.6099173011,

2.4767216E-05,

3.0879170E-07,-1.4204120E-09, 1.0857810, 8.8552797618, 5852.6842220465, 3.1609367E-06, 6.7664088E-08,-2.2006663E-10, -1.0193852, 7.2392703065, 33629.0898976466,-3.9751134E-05, 2.3556127E-07,-1.1256889E-09, -0.8227141, 11.0814572888,

16066.2815125171, 1.4748204E-04, 3.1992438E-07,-1.5697249E-09,

0.8042238, 3.5274358950, -33.7870573000, 2.8263353E-05, 3.7539802E-08,-2.2902113E-10, 0.8025939, 6.7832463846, 16833.1452579809,-9.9779237E-05, 2.7639907E-08,-1.8858767E-10, -0.7931866, -6.3821400710,-24462.5470518423,-2.4326809E-04,-4.9525589E-07, 2.2980217E-09, -0.7910153, 6.3703481443, -591.1013369332,-1.5714346E-04,-1.8089785E-07, 8.0295327E-10,

-0.6674056, 9.1819266386, 24533.5347274576, 5.5197395E-05, 2.7743463E-07,-1.3204870E-09, 0.6502226, 4.1010449356,-10176.3966721553,-3.0412845E-04,-4.3254175E-07, 2.0981718E-09, -0.6388131, 6.2958887075, 25719.1509623392, 2.3794032E-04, 4.9648867E-07,-2.4069012E-09};

private static final double M21[] = {

0.0743000, 11.9537467337, 6480.9861772950, 4.9705523E-07, 6.8280480E-08,-2.7450635E-10, 0.0304300, 8.7259027166, 7737.5900877920,-4.8307078E-06, 6.9513264E-08,-3.8338581E-10, 0.0222900, 12.8540026510, 15019.2270678508,-2.7985829E-04,-1.9203053E-07, 9.5226618E-10, 0.0199900, 15.2095572232, 23347.9184925760,-1.2754553E-04, 5.8380585E-08,-2.3407289E-10,

0.0186900, 9.5981921614, -1847.7052474301,-1.5181570E-04,-1.8213063E-07, 9.1183272E-10, 0.0169600, 7.1681781524, 16133.8556271171, 9.0955337E-05, 2.4484477E-07,-1.1116826E-09, 0.0162300, 1.5847795630, 9061.7681128890,-6.6685176E-05,-4.3335556E-09,-3.4222998E-11, 0.0141900, -

0.7707750092, 733.0766881638,-2.1899793E-04,-2.5474467E-07, 1.1521161E-09}; private static final double M30[] = {

385000.5290396, 1.5707963268, 0.0000000000, 0.0000000E+00, 0.0000000E+00, 0.0000000E+00,-20905.3551378, 3.9263508990, 8328.6914247251, 1.5231275E-04, 2.5041111E-07,-1.1863391E-09,-3699.1109330, 9.6121753977, 7214.0628654588,-2.1850087E-04,-1.8646419E-07, 8.7760973E-10,-2955.9675626, 11.9677299699, 15542.7542901840,-6.6188121E-05, 6.3946925E-08,-3.0872935E-10,

-569.9251264, 6.2819054713, 16657.3828494503, 3.0462550E-04, 5.0082223E-07,-2.3726782E-09, 246.1584797, 7.2566208254, -1114.6285592663,-3.7081362E-04,-4.3687530E-07, 2.0639488E-09, -204.5861179, 12.010*******, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, -170.7330791, 14.3232845422, 23871.4457149091, 8.6124629E-05, 3.1435804E-07,-1.4950684E-09,

-152.1378118, 9.6553010794, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, -129.6202242, -0.8278839272, -7700.3894694766,-1.5497663E-04,-2.4979472E-07, 1.1318993E-09, 108.7427014, 6.7692631483, 7771.3771450920,-

3.3094061E-05, 3.1973462E-08,-1.5436468E-

10, 104.7552944, 3.8832252173, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09,

79.6605685, 0.6705404095, -8538.2408905558, 2.8035534E-04, 2.6031101E-07,-1.2267725E-09, 48.8883284, 1.5276706450, 628.3019552485,-2.6638815E-06,

6.1639211E-10,-5.4439728E-11, -34.7825237, 20.0091090408, 22756.8171556428,-2.8468899E-04,-1.2251727E-07, 5.6888037E-10, 30.8238599, 11.9246042882, 16171.0562454324,-6.8852003E-05, 6.4563317E-08,-3.6316908E-10,

24.2084985, 9.5690497159, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, -23.2104305, 8.6374600436, 24986.0742741754, 4.5693825E-04, 7.5123334E-07,-3.5590172E-09, -21.6363439, 17.6535544685, 14428.1257309177,-4.3700174E-04,-3.7292838E-07, 1.7552195E-09, -

16.6747239, 6.7261374666, 8399.6791003405,-3.5757942E-05, 3.2589854E-08,-

2.0880440E-10,

14.4026890, 4.9010662531, -9443.3199839914,-5.2312637E-04,-6.8728642E-07, 3.2502879E-09, -12.8314035, 14.3664102239, 23243.1437596606, 8.8788511E-05, 3.1374165E-07,-1.4406287E-09, -11.6499478, 22.3646636130, 31085.5085803679,-1.3237624E-04, 1.2789385E-07,-6.1745870E-10, -10.4447578, 16.6788391144, 32200.1371396342, 2.3843738E-04, 5.6476915E-07,-2.6814075E-09,

10.3211071, 8.7119194804, -1324.1780250970, 6.1854469E-05, 7.3846820E-08,-

3.4916281E-10, 10.0562033, 7.2997465071, -1742.9305145148,-3.6814974E-04,-

4.3749170E-07, 2.1183885E-09, -9.8844667, 12.0539813334, 14286.1503796870,-6.0860358E-05, 6.2714140E-08,-1.9984990E-10, 8.7515625, 6.3563649081, -9652.8694498221,-9.0458282E-05,-1.7656429E-07, 8.3717626E-10,

-8.3791067, 4.4137085761, -557.3142796331,-1.8540681E-04,-2.1843765E-07, 1.0319744E-09, -7.0026961, -3.1834384995,-16029.0808942018,-3.0728938E-04,-5.0020584E-07, 2.3182384E-09, 6.3220032, 9.1248177206, 16100.0685698171,

1.1921869E-04,

2.8238458E-07,-1.3407038E-09, 5.7508579, 6.2387797896, 17285.6848046987,

3.0196162E-04, 5.0143862E-07,-2.4271179E-09,

-4.9501349, 9.6984267611, 5957.4589549619,-2.1317311E-04,-1.8769697E-07, 9.8648918E-10, -4.4211770, 3.0260949818, -209.5494658307, 4.3266809E-04,

5.1072212E-07,-2.4131116E-09, 4.1311145, 11.0674740526, 7004.5133996281,

2.1416722E-04,

3.2425793E-07,-1.5355019E-09, -3.9579827, 20.0522347225, 22128.5152003943,-2.8202511E-04,-1.2313366E-07, 6.2332010E-10,

3.2582371, 1

4.8106422192, 1498

5.4400105508,-2.5159493E-04,-1.5449073E-07,

7.2324505E-10, -3.1483020, 4.8266068163, 16866.9323152810,-1.2804259E-04,-9.8998954E-09, 4.0433461E-11, 2.6164092, 14.2801588604, 24499.7476701576, 8.3460748E-05, 3.1497443E-07,-1.5495082E-

09, 2.3536310, 9.5259240342, 8470.6667759558,-2.2382863E-04,-1.8523141E-07, 7.6873027E-10,

-2.1171283, -0.8710096090, -7072.0875142282,-1.5764051E-04,-2.4917833E-07, 1.0774596E-09, -1.8970368, 17.6966801503, 13799.8237756692,-4.3433786E-04,-3.7354477E-07, 1.8096592E-09, -1.7385258, 2.0581540038, -8886.0057043583,-3.3771956E-04,-4.6884877E-07, 2.2183135E-09, -1.5713944, 22.4077892948, 30457.2066251194,-1.2971236E-04, 1.2727746E-07,-5.6301898E-10,

-1.4225541, 24.7202181853, 39414.2000050930, 1.9936508E-05, 3.7830496E-07,-1.8037978E-09, -1.4189284, 17.1661967915, 23314.1314352759,-9.9282182E-05, 9.5920387E-08,-4.6309403E-10, 1.1655364, 3.8400995356, 9585.2953352221, 1.4698499E-04, 2.5164390E-07,-1.2952185E-09, -1.1169371, 10.9930146158, 33314.7656989005, 6.0925100E-04, 1.0016445E-06,-4.7453563E-09,

1.0656723, 1.4845449633, 1256.6039104970,-5.3277630E-06, 1.2327842E-09,-1.0887946E-10, 1.0586190, 11.9220903668, 8364.7398411275,-

2.1850087E-04,-1.8646419E-07, 8.7760973E-10, -0.9333176, 9.0816920389, 16728.3705250656, 1.1655481E-04, 2.8300097E-07,-1.3951435E-09, 0.8624328,

12.4550876470, 6656.7485858257,-4.0390768E-04,-4.0490184E-07, 1.9095841E-09, 0.8512404, 4.3705828944, 70.9876756153,-1.8807069E-04,-2.1782126E-07, 9.7753467E-10, -0.8488018, 16.7219647962, 31571.8351843857, 2.4110126E-04, 5.6415276E-07,-2.6269678E-09, -0.7956264, 3.5134526588, -9095.5551701890, 9.4948529E-05, 4.1873358E-08,-1.9479814E-10};

private static final double M31[] = {

0.5139500, 12.010*******, 14914.4523349355,-6.3524240E-05, 6.3330532E-08,-2.5428962E-10, 0.3824500, 9.6553010794, 6585.7609102104,-2.1583699E-04,-1.8708058E-07, 9.3204945E-10, 0.3265400, 3.9694765808, 7700.3894694766, 1.5497663E-04, 2.4979472E-07,-1.1318993E-

09, 0.2639600, 0.7416325637, 8956.9933799736, 1.4964887E-04, 2.5102751E-07,-1.2407788E-09,

0.1230200, -1.6139220085, 628.3019552485,-2.6638815E-06, 6.1639211E-10,-

5.4439728E-11, 0.0775400, 8.7830116346, 16171.0562454324,-

6.8852003E-05,

6.4563317E-08,-3.6316908E-10, 0.0606800, 6.4274570623, 7842.3648207073,-2.2116475E-04,-1.8584780E-07, 8.2317000E-10, 0.0497000, 12.0539813334,

一个计算万年历的简单程序

一个计算万年历的简单程序 通常我们只知道生活当天的前后几天是星期几,即便是翻日历,也只能知道有限日期的星期数。那么有没有一种方法可以让我们知道任何一天是星期几呢?有,下面我将向大家介绍一种方法,用以编写万年历的程序。 首先我们必须约定一些法则,我们用Y、M、D分别表示年、月、日,用数字0-6分别表示星期日-星期六,这样我们就可以开始推导我们的公式了。 我们知道2002年9月1号为星期日,如果我们要想知道2002年9月10号为星期几,可以这样算:(0+(10-1))%7=(0+9)%7=2,即星期二。同样可算得2002年9月20号为:(0+(20-1))%7=(0+19)%7=5,即星期五。但是这样算需要把日期减1,不太方便,为了解决这个问题,我们可以假设每个月有一个0号,由于2002年9月1号为星期日,那么2002年9月0号为星期六,这样算9月10号,只需代入10既(6+10)%7=2。事实上,9月0号也就是8月31号,每个月0号的星期数实际上就是每个月1号的前一天的星期数。我把这个星期数称之为每个月的代码。有了这个代码,要算这个月任一天的星期数都好办了。 以上讨论的是一年中每个月的代码,事实上对于每年也有一个代码,这个代码就是每年1月0号(即1月1号的前一天)的星期数,也就是一月份的代码。如果我们能够找到每年的代码之间的关系,那么要计算万年历就易如反掌了。 (一)推算年的代码公式 我们都知道,平年一年有365天,即52周多1天。闰年为366天即52周多2天。我们先只考虑平年的情况。 假设第N年的代码为W,则第N+1年的代码为(W+1)%7,而第N+K年的代码则为(W+K)%7。这是因为从第N年到第N+K年共经过了K年,每过一年也就是过了52周余1天,经过K年也就是过了52*K周余K天,将多余的天数K加上第N年的代码W再对7取模,所得也就是第N+K年的代码了。 下面我们把闰年也考虑进来。判断闰年的规则是,能被4整除,并能被100和400同时整除的年份就是闰年。所以从第N年到第N+K年间共有K/4 -K/100+K/400个闰年,而每个闰年有52周余2天,要比平年多余了1天,即共多余了K/4-K/100+K/400天。我们应该把这些天也加进去,所以第N+K年的代码应为(W+K+K/4-K/100+K/400)%7。 这样子是不是就考虑完全了呢?并非如此,我们还有两点没考虑到。第一点是第N年是不是闰年。如果第N年是闰年的话,它本身就是52周余2天,而我们在上面却是把它当作平年来计算的,少算了1天,应加上。所以在第N年为闰年的时候上式应为 (W+(K+1)+K/4-K/100+K/400)%7。第二点是第N+K年是不是闰年。如果第N+K年是闰年,虽然它有52周余2天,但只有在算第N+(K+1)年的时候,才需要多加它那一天,而在算第N+K年的时候不需要多加这1天,因此我们必须将上式改为 (W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7(注意千万不能改为 (W+(K+1)+(K/4-K/100+K/400-1))%7=(W+K+K/4-K/100+K/400)%7)。 由此我们可以得出当第N年为闰年时,第N+K年的代码计算式为: A=(W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7 为了方便计算,我们可以取N为0,也就是假设公元元年的代码为W。因为公元元年也是闰年,符合上式,那么当我们输入的年份为Y时,此时就有K=Y,也就是说第Y年的代码为 A=(W+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7

JAVA《万年历系统》课程设计报告附源码

2013-2014学年第二学期《面向对象程序设计》 课程设计报告 题目:万年历系统 专业:计算机科学与技术 班级: : 学号: 指导教师: 成绩:

计算机与信息工程系2014年6月6日

目录 1 设计容及要求 (1) 1.1设计容 (1) 1.2设计任务及具体要求 (1) 2 概要设计 (2) 2.1程序设计思路 (2) 2.2 总体程序框图 (3) 3 设计过程或程序代码 (4) 3.1各个模块的程序流程图及运行界面 (4) 3.2对关键代码加以分析说明 (7) 4 设计结果与分析 (13) 4.1程序调试的结果 (13) 4.2程序设计分析 (13) 5 小结 (14) 致 (15) 参考文献 (16) 源程序 (17)

1 设计容及要求 1.1设计容 万年历,实际上就是记录一定时间围(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。在我设计的万年历中主要有:(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用规。 (2)按月份查询,实现了显示查询1901~2100年某月所有日期的阴阳历对照。 (3)并且添加了重大节日与星座等信息,界面采用日常的星期与月份结合的格式,方便查看与使用。 (4)编写万年历的课程设计,是为了使同学们更加了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。 1.2设计任务及具体要求 利用JAVA语言编写的万年历系统采用了多种JAVA语句来实现多种功能。用户可以通过本程序的applet运行界面来查找一整年某月的农历和阳历,可以查找用户所想了解的某一天具体为星期几,并且可以看到一些重大节日的具体时间。 要求:满足设计万年历系统的目的,即当用户查询年份与月份时,系统就要将这一年的某一月份的阴历与阳历全部显示出来,并且附带这一月份的重大节日。当用户随意改动年份或月份时系统自动显示与星期对应的日期。用户点击日

用java实现简单的万年历输出的代码

package clock; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Lunar { private int year; private int month; private int day; private boolean leap; final static String chineseNumber[] = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"}; static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy年MM月dd 日"); final static long[] lunarInfo = new long[] {0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520,

电子万年历中公历农历互换算法研究

电子万年历中公历农历互换算法研究 [摘要]介绍了电子万年历中实现公历农历互换的一种实用算法。用4个字节的数据可以准确地描述任意一年与年历有关的信息,将需要实现公历农历互换的每一年的4个字节的数据有机存放在一起形成一个基本数据表。电子万年历中的计算机通过查询预先存储在计算机存储器里的基本数据表,得到转换需要的数据信息,根据转换要求和该算法提供的互换算法,从而实现公历农历的互换。该互换算法的优点是存储的数据量少,计算简便,实用性强。 [关键词]电子万年历;公历;农历;互换;算法 随着电子技术的发展,万年历目前已经不再局限于以书本形式出现。以电脑软件或者电子产品形式出现的万年历被称为电子万年历。与传统书本形式的万年历相比,电子万年历得到了越来越广泛的应用[1]。然而,目前一般的电子万年历仅能显示与公历有关的信息,而日常生活等方面往往离不开与农历有关的信息。为了使得电子万年历能更方便地显示更多的信息,笔者对电子万年历涉及到的常用信息处理算法进行了一些研究,提出了一种建表算法。这种建表算法与同类算法相比有以下优点:①需要存储的数据量小。②计算方法简便。③不仅可以显示公历,而且可以显示农历。④不仅可以显示当前日期,而且可以查询其他日期。下面以覆盖年度从1800年到2199年为例,详细介绍实现公历与农历之间相互转换的建表算法。 1 建立基本数据表 建立基本数据表的目的是实现公历与农历之间的相互转换。由于公历信息每年基本不变,而农历信息每年变化很大,因此,对于覆盖年度里的每一年,在基本数据表里主要存储与农历有关的数据:该年年份、该年闰月有无以及闰月的月份、该年各月的大小、从元旦到正月初一的天数(即岁首积日差[2])。 图1 基本数据表里每年的基本信息格式 在基本数据表里笔者用8位十六进制数D 7D 6D 5D 4D 3D 2D 1D 0 (4个字节)描绘一年的信息,其中每位十六进制数又可以用4 位二进制数(b 3b 2b 1b 0)表示。下面以一个具体的例子来说 明基本数据表里的数据格式(图1)。 1)D 7(b 3b 2b 1b 0)的前2两位b 3b 2表示百年值(譬如1982年所对应的百年值为19),后2位表示岁首积日差对15求商得到的商值(整数)。要实现覆盖年度1800到2199年的目标,只要前2位数(b 3b 2)对应的十进制数再加上18(十进制数)就能得到该年的百年值,即00代表1800年,01代表1900年,10代表2000年,11代表2100年。通过大量数据统计可得:对于任何年份,其岁首积日差均少于60日,而从1800年到2199年每一年的岁首积日差均不超过50日。因此,用D 7(b 3b 2b 1b 0)的后2位b 1b 0就能表示岁首积日差对15求商得到的商值,即00代表0日,01代表15日,10代表30日,11代表45日。本例中D 7表示该年年份为1900年到1999年中的某一年(具体由D 6和D 5决定),岁首积日差为30到44日中的某值(具体天数由D 0决定)。2)D 6(b 3b 2b 1b 0)前1位b 3表示该年闰月大小,后3位b 2b 1b 0表示该年所在百年内的年份值(譬如1982年所对应的百年内的年份值为82)对16求商得到的商值。高位b 3为1代表闰月小,为0代表无闰月或者闰月大;低3位b 2b 1b 0与百年内的年份值有以下对应关系,000代表0年,001代表16年,

Java万年历课程设计报告

杭州师范大学钱江学院课程设计 题目万年历 学院钱江学院 专业信电分院计算机科学与技术 班级计算机1101 姓名崔伊平 指导教师王李冬 2013 年9 月20 日

目录 一.概述 (1) 二.总体方案设计 (2) 三.详细设计 (3) 四.最终输出 (7) 五.课程设计总结 (8) 参考文献 (9)

一、概述 1.课程设计的目的 通过显示年日历程序的设计,培养学生综合利用java语言进行程序设计的能力,加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力。 通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固《java语言程序设计》课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了java语言的好处和其可用性! 2.课程设计的要求 2.1 输入查询的年份与月份,单击“更新”按扭,则可得到相应的日历。本实验是对图形用户界面,布局管理器的综合运用。要掌握APPLET容器中添加组件的方法,理解JAVA 的事件处理机制,编写独立的运行窗口。 2.2 输出形式 使用独立的运行窗口进行显示。界面主要由两部分组成——查询输入部分和结果显示部分。查询输入部分包括两个文本域,一个用于输入年份:一个用于选择月份:一个更新按扭,用来触发查询事件。

二总体方案设计 1.程序开发环境 a.开发环境:eclipse b.系统环境:windows xp/7 c.设计工具:Microsoft office 2003 2.整体流程图 图1 流程图 3.功能模块图

Java课程设计+文档+源代码(万年历+闹钟+记事本)

2015年12月18日 一、课程题目 设计一个万年历系统,实现以下功能 (1)可以查看当前的年份、月份和日期; (2)有时间栏,便于用户查看当前时间; (3)能够查找1至9999年的日期与星期的关系。 其它功能可自行开发。 二、题目分析与设计 1.使用的开发环境为eclipse Jdk环境:jdk1.8 2. (此为万 年历界面图) 使用了jTabbedPane 类对功能页面分页,布局策略基本用BorderLayout 和GridLayout 。 3.本项共有5个类,基本一个功能有一个类实现,主类CalendarMain 只包含一个main函数:对创建框架和其属性设置。

AlarmDemo类则实现闹钟功能;NoteBook 类实现记事本功能;CalendarsView 类则实现基本日历功能,ChooseDay 类是一个弹窗,被CalendarsView 调用,CalendarsView 、AlarmDemo 也在该类被调用; . 4.日历界面使用了jTable ,功能的实现逻辑则是 1.首先定义两个全局变量---年和月,查看不同时间的日历,该变量也 随之改变。 2.写了几个函数获取今年第一天是星期几,然后根据月份天数即可推 算具体某月第一天是星期几。 3.知道一个月第一天是星期几,则该月日历既可以顺序列出。 闹钟的功能实现思路: 1.获取界面设定的时间。

2.使用线程,每过一秒急救获取当前时间,并判断是否到达设定的时 间 3.到设定的时间,启动弹窗,播放闹铃 4.闹铃科根据文件选择器自行选择 记事本功能实现思路 1.在项目文件夹先新建一个txt文件作为储存的数据库 2.利用File 类和io 数据流将界面文本储存进txt文件,实现保存功 能 3.每当程序启动,读取txt文件内容并显示到界面上 三、测试分析 1.使用如下拓展包

C语言课程设计万年历 完整版

目录 一引言 (2) 二系统功能和数据说明 (3) 一)功能简介 (3) 二)程序中的数据说明 (3) 三程序总体设计及流程图 (4) 一)应用到的c语言 (4) 二)程序的总框架 (5) 四功能模块设计及调试 (5) 一)算法说明 (5) 1.总天数的算法 (5) 2.计算输入日期是星期几 (6) 3.对输入信息的汇总 (8) 4..界面的控制 (10) 二)调试结果 (11) 五程序清单 (12) 六结束语 (17)

一引言 通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。 C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。 在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。通过这个小小的日历可以实现很多功能。在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的C 语言课程设计的具体内容来了

二系统功能和数据说明 (一)功能简介 在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。下面是它要实现的一些基本功能:用C语言编写万年历 1、输入年份,判断是否为闰年 2、输入年月日,判断改日为星期几 3、输入年份,打出12个月历,输入月份,打出该月的日历 4、要求用多个函数实现 [名称]万年历 [修改]1、对输入的日期进行容错处理 2、增加和修改为英文的月份和星期显示 3、采用指针形式的weeks和month数组 (二)程序中的数据说明 ①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。其中days[1]=28,是将闰年二月的天数28天作为初始元素存入。在经过theWeek函数后就可以给days[1]中存入正确的月天数。 ②char *weeks[7] ={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; char *months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November",

万年历星期的算法(C语言)

万年历星期的算法(C语言) #include code unsigned char WeekTab[] = { //闰年月星期表 (3 << 5) + 31,//1月 (6 << 5) + 29,//2月 (0 << 5) + 31,//3月 (3 << 5) + 30,//4月 (5 << 5) + 31,//5月 (1 << 5) + 30,//6月 (3 << 5) + 31,//7月 (6 << 5) + 31,//8月 (1 << 5) + 30,//9月 (4 << 5) + 31,//10月 (0 << 5) + 30,//11月 (2 << 5) + 31 //12月 }; /*------------2000年~2099年星期算法----------*/ unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d) { unsigned char week, day; day = WeekTab[m - 1]; //月表 week = day >> 5; //月星期数 day &= 0x1f; //月天数 if ((m < 3) && (y & 0x03)) { //平年 if (m == 2) day--; //平年月天数 week++; //平年月表+1 } y = y + (y >> 2); //年+年/4 week = (week + y + d + 2) % 7; //(星期=年+年/4+月表+2日)%7 return (week << 5) | day; //返回星期和月天数 } /*--------------0000年~9999年星期算法------------*/ unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m, unsigned char d) { unsigned char week, day; c &= 0x03; //百年%4 c = c | (c << 2); //百年%4*5 day = WeekTab[m - 1]; //月表 week = day >> 5; //月星期数

java控制台输出万年历

import java.util.Scanner; //蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形): w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 //公式中的符号含义如下: c:世纪(年的高两位数); y:年(年的低两位数); //m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算, //比如2005年1月1日要看作2004年的13月1日来计算); d:日; []代表取整,即只要整数部分。 //w:星期;w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四, 5-星期五,6-星期六 //以2005年2月14日为例:c=20,y=4,m=14,d=14 //w = 4 + [4/4] + [20/4] - 2*20 + [26*(14+1)/10] + 14 - 1 = 4 + 1 + 5 - 40 + 39 + 14 - 1 = 22 //(除以7余1) 所以2005年2月14日是星期一。 public class PerpetualCalendarII { public static void main(String[] args) { // declare variable month,year int month, monthDays = 0, year; int firstDayOfMonth, a, b, w; int count = 0; // declare flag boolean flag; Scanner sc = new Scanner(System.in); System.out.println("请输入年份:"); year = sc.nextInt(); System.out.println("请输入月份:"); month = sc.nextInt(); // judge year is leap year or not if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { flag = true; } else { flag = false; } // get days of the month switch (month) { case 4: case 6: case 9: case 11: monthDays = 30; break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: monthDays = 31; break; case 2: if (flag == true) { monthDays = 29;

Java课程设计-万年历

河北科技大学课程设计报告 号:学生姓名:学 专业班级:程序设计课程设计Java课程名称:学期学年第 2 2 015 学年学期: 2 014 — 指导教师:刘伟月年 2 0

的?.................................................................. ................................1?? 2.需求分................................................................... .........析................................1? 3.总体设计................................................................... ........................................1? 4.详细设计................................................................... ........................................1?

5.软件测试................................................................... . (10) 6.课程设计总结................................................................... ................................11. 一、课程设计目的(1)熟练使用java语言编写程序,解决实际问题。? (2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;? (3)学会自己调试程序的方法并掌握一定的技巧。 二、需求分析本程序的要求为: 1.使用图形用户界面;? 2.本程序能够实现日期与星期的查询。 ?三、总体设计(1)可以通过图形界面显示日历。? (2)能以月历形式显示日期与星期。? (3)支持用户自己输入年份,可以通过上一年,下一年等按钮来选择年份和月份。? ?四、详细设计1.总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。 ,0若是取余得几既为星期几,7使总天数除以输出月份第一天为星期几的算法:2. 则为星期日。? 3.算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。? 4.查询年份必须为四位有效数字,否则不予显示。 程序源代码: import import import import import import; import import import ; import ; import import import java.awt.*; import import java.text.*; import ;

c语言课程设计报告--万年历,最详细

C语言课程设计报告 -----万年历 设计人:贾伟涛 学号:2013010912 班级:13电信应电班 指导老师:张伟 日期:2014年6月9日

内容提要 通过大一下学期对C语言的学习,了解到了很多C语言的相关知识。学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c语言的兴趣。 C语言是近年在国内外得到迅速推广应用的一种机器语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。 在这次的课程设计中我将把日常生活中最经常接触的——日历的查询,利用C语言的程序编成一个简单的万年历查询系统。通过这个小小的系统可以实现很多功能。在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的C语言课程设计的具体内容来了,大家拭目以待吧!

目录 一、系统功能和数据说明----------------------- 二、问题分析--------------------------------- 三、程序总体设计及功能结构框图--------------- 四、程序流程图------------------------------- 五、源程序代码------------------------------- 六、使用说明--------------------------------- 七、个人心得--------------------------------- 八、参考文献---------------------------------

java课程设计 万年历 源代码

华北科技学院 课程设计报告 面向对象程序设计(Java) 班级: 电商B09-3 姓名: 周婷玉 设计题目:__________万年历________________ 设计时间: 2011-12-28 至2012-01-06 指导教师:_______ 郭慧____________ _____ 评语:_________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:___________评阅教师:_____________

课程设计说明书 1、课程设计的目的 a)掌握面向对象程序设计基本要素(封装、继承、多态) b)掌握JA VA语言常用类包及其常用方法和JA VA语言基本语法 c)掌握基于AWT的图形用户界面设计 i.常用标准控件的使用,如标签、按钮、菜单、文本框、单选按钮、 滚动条等。 ii.事件处理机制 d)掌握布局、对话框的使用 e)掌握发布JA VA应用程序 2、功能模块简介和系统结构图 需求分析:本程序的要求为: 1.使用图形用户界面 2.能够实现日期与星期的查询 3.实现当日的时间备忘 功能设计: 1.能以月历形式显示日期与星期 2.支持用户自己输入年份,并提供月份的下拉形式来选择查询 3.添加当日行事历,储存与清除功能

STM32实现万年历

STM32学习笔记一竹天笑 实现的功能: 1、日历功能。 2、数字和模拟时钟功能。 图1(为LCD截屏保存在SD卡中的图像) 最终界面如下,但还存在不少漏洞。1、没有更改时间的设置;2、只有节气显示没有节假日显示3、背景不是用uCGUI画的,是在PS中画好然后存在SD卡中,然后显示的BMP 格式图像。 要点分析: 1、STM32自带了RTC时钟计数器,从0开始计数到232。每一个计数代表秒计数,每六十个计数代表分计数,以此类推。24(小时)*60(分钟)*60(秒钟)=86400代表一天的计数时间。假设当前计数为count,count/86400得到计数的天数,根据这个得到年月日。Count%86400得到时分秒。 2、一些根据1中得到的年月日时分秒,进行计算的程序有:阳历转阴历,闰年判断,节气判断,星期几计算,当前月有多少天等等。 3、模拟时钟的绘制:时钟指针运动算法、屏幕重绘方法、RTC消息、画笔/画刷等。指针运动算法和屏幕重绘方法是本程序主要难点所在。(以下参照百度文库之模拟时钟)不论何种指针,每次转动均以π/30弧度(一秒的角度)为基本单位,且都以表盘中心为转动圆心。计算指针端点(x, y)的公式如下:

x =圆心x坐标+ 指针长度* cos (指针方向角) y =圆心y坐标+ 指针长度* sin (指针方向角) 注意,指针长度是指自圆心至指针一个端点的长度(是整个指针的一部分),由于指针可能跨越圆心,因此一个指针需要计算两个端点。 由于屏幕的重绘1秒钟一次,如果采用全屏删除式重绘则闪烁十分明显,显示效果不佳。本程序采用非删除式重绘,假定指针将要移动一格,则先采用背景色(这里是白色)重绘原来指针以删除原来位置的指针,再采用指针的颜色在当前位置绘制指针(如果指针没有动,则直接绘制指针,此句在程序中被我删除,具体原因,为数据截断导致一些误差)。 另外,秒表为RTC一秒钟定时计数。 程序分析: uCGUI+uCOS,一共三个任务:主处理任务、触摸屏任务、秒更新任务。 void App_UCGUI_TaskCreate (void) { CPU_INT08U os_err; os_err = os_err; Clock_SEM=OSSemCreate(1); /位置设定 GUI_SetFont(&GUI_Font6x8); 3.1415926f=-20*cos(*30+90)*DEG2RAD)+264; =-20*sin(*30+90)*DEG2RAD)+170; =-2*cos(*30+270)*DEG2RAD)+264; =-2*sin(*30+270)*DEG2RAD)+170; ,m_OldHour[0].y, m_OldHour[1].x,m_OldHour[1].y); GUI_SetColor(GUI_RED); ,m_Hour[0].y, m_Hour[1].x,m_Hour[1].y);

万年历的算法

摘自: 星期、干支、二十八宿计算公式打印本页关闭本窗口 1. 求星期公式 星期=[5+A(实际天数)] mod 7 2. 干支计算公式 六十甲子干支序号,从1->59->0。 六十甲子干支序号=[23+A(实际天数)] mod 60 3. 二十八宿计算公式 二十八宿序号=[23+A(实际天数)] mod 28 4. 实际天数A的计算 A=B(基本天数)+C(闰日天数) B=(计算年-1)*365+(要计算到年的月日天数) 例:1984年2月1日的基本天数B=(1984-1)*365+(31+1)=723827(天), 其中,31是1月为31天,1为2月1日为1天。 公元308年8月28日的基本天数 B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天) 这里的(要计算到年的月日天数),用的是公历,月日天数的规则我好 象小学就学过了。哈哈…… C=(计算年-1) div 4 -误差修正值+ fixValue2 fixValue2为0或者1。常值为0,当年数为闰年(公历闰年法)之中的3月 1日之后的为1。 误差修正值推算: 公元元年1月1日至1582年10月14日为0。 1582年10月15日至1699年12月31日为10。 从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累 加1。此方法推算即可。 --有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有 讲到,但看来应该是10。 例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12,而1901年1月1日起误差修正值为13, 但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。而2101年1月1日起误差修正值为14。 5. 实例:1998.3.15的星期、干支与二十八宿 B=(1998-1)*365+(31+28+15)=728979 C=(1998-1) div 4 - 13 + 0 = 486 A=B+C=728979+486=729465 星期序号=(5+729465) mod 7=0,即为星期日 干支序号=(13+729465) mod 60=58,即为辛酉

手算万年历

一只左手即是万年历 掐指一算即知吉凶”,学过算命卜卦的人对吉凶的推算应该没多大问题,但要做到掐指就能算并非一照一夕的事(除相术外)。 因为所有算法基本上都要用到干支历,所以你看很多算命算卦的都要有本万年历。其实,我们的左手就是一本万年历,许多人不知道,所以不会推算。当然,这也是算命达到出神入化的关键技术,你想如果什么也不用,就能把四柱在心中排出,对求测者来说更加神奇。现把一种最简单的掐指法介绍出来。 (此法在网上公布了数个小时,因为是秘籍,所以被删掉。其中日柱掐指之法并非真法,并有错误在其中,真法没传,真法不用计算,不用万年历,只需掐指即可推出。想学者,可以拿秘籍来交流,只求风水方面的,我所掌握的除外) 现举一例说明:(阳历换算干支) 随便说一个时间,2018年3月10日早8点:左手,拇指掐“子”上后退3个两位(3为8,9,10三个)为“午”。接着从“午”上顺掐5位(5为甲、乙、丙、丁、戊5位),得“戌”位即“戊戌”干支。此年柱。 月柱,年干“戊”,“壬子”起,这也无须记,也可以掐指,在左手上,大拇指在“甲己”位上念“甲乙”,顺推,到“戊”上为“壬”。所以“壬子”起,到“卯”为“乙卯”。此月柱。 日柱,干从"庚"顺数,第9位为"戊",余2,所以是"戊的相合干"癸".支从"子"数,依次为"子"、“酉”、“午”、“卯”第9位还为“子”,因为余2,下一步,“子”冲“午”前一位为“巳”。所以得“癸巳”。然后从“癸”起数9位为“辛”,从“巳”起9位为“丑”。所以,日柱为“辛丑”。 时柱,我想大家都会吧,早8为辰时,日起时法,“子”上数“戊”到“辰”为“壬”,即“壬辰”时。 好了,四柱为:戊戌乙卯辛丑壬辰。 这是个例操作过程,不是通用方法。掌握通用方法,熟练后,比查万年历要快。因为有些步骤大脑可以快速跳过。瞬间得到结果。 本人看过多种掐指算干支的秘籍,其实都要大量背一些口诀,并不诀,而这种方法,只需记住两个数,进行一次简单的两位数减法运算(心算完全可以做到),和一次两位除一位数的除法运算(心算完全可以做到)外,完全是掐指得到的结果。

Java课程设计-万年历

河北科技大学 课程设计报告 学生姓名:学号: 专业班级: 课程名称:Java程序设计课程设计 学年学期:2 014 —2 015 学年第2 学期指导教师:刘伟 2 0 年月

课程设计成绩评定表 学生姓名学号成绩专业班级起止时间 设计题目 指导教师评语学习态度:端正□较端正□一般□较差□ 学习纪律:好□较好□一般□较差□ 出勤情况:好□较好□一般□较差□ 程序设计:好□较好□一般□较差□ 动手能力:强□较强□一般□较差□ 团队精神:好□较好□一般□较差□ 创新意识:强□较强□一般□较差□ 课程设计完成情况:优秀□好□一般□较差□ 课程设计报告完成情况:优秀□好□一般□较差□ 指导教师: 年月日

目录 1.课程设计目的 (1) 2.需求分析 (1) 3.总体设计 (1) 4.详细设计 (1) 5.软件测试 (10) 6.课程设计总结 (11)

一、课程设计目的 (1)熟练使用java语言编写程序,解决实际问题。 (2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; (3)学会自己调试程序的方法并掌握一定的技巧。 二、需求分析 本程序的要求为: 1.使用图形用户界面; 2.本程序能够实现日期与星期的查询。 三、总体设计 (1)可以通过图形界面显示日历。 (2)能以月历形式显示日期与星期。 (3)支持用户自己输入年份,可以通过上一年,下一年等按钮来选择年份和月份。 四、详细设计 1.总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。 2.输出月份第一天为星期几的算法:使总天数除以7取余得几既为星期几,若是0,则为星期日。 3.算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。 4.查询年份必须为四位有效数字,否则不予显示。 程序源代码: import java.awt.BorderLayout; import java.awt.Color;

C语言实训题目设计报告 万年历

C语言实训题目设计报告:万年历系统 1、题目设计: 设计一个万年历系统 功能要求: (1)从2000年开始,用户输入年份与月份,将显示出该年该月份的日历,对应的星期。 (2)用户输入年份,将显示该年的日历 (3)注意闰年情况 显示格式要求如下: (1)第一行显示月份(中英文都可以) (2)下一行显示星期,从周日到周六,中英文都可以 (3)下一行开始显示日期从1号开始,并按其是星期几实际情况与上面的星期数垂直对齐 (4)程序输出菜单,用户按照提示操作,最终得到计算结果。 2、问题分析: 该程序可大致分成主菜单、年历、月历3个部分,并且还有判断是否为闰年、月份的天数、该月第一天为周几三个小模块,并可由年历、月历调用,年历、月历可由主菜单调用。最后可以考虑一下界面的优化和输入错误等小问题。 3、算法设计: 主菜单部分:用户输入选项,用一个switch语句来进行接下来的任务,其中有一个选项是用来退出的。在进行到程序结尾的时候用goto语句来实现回到函数最开始的目的。 月历部分:从键盘接收年份和月份,通过小函数来获得本月的天数和本月一号是周几,从而在屏幕上输出月历。在到周末的时候换行。 年历部分:大体思路和月历相似,只是多用了一个for循环,使得月份从一月一直到十二月(其实这部分我是复制的月历部分的)。 判断闰年部分:输入年份,输出1或0。 判断天数部分:输入年份,月份,输出天数。其中有调用闰年的函数。 判断周几部分:输入年,月,日,输出是周几的信息。 4、程序源代码: #include #include #include int ifren(int year)//判断是否是闰年 { if(year%4==0&&year%100!=0||year%400==0) return 1; else return 0; } int monthday(int month,int year)//判断这个月有多少天

相关主题
文本预览
相关文档 最新文档