万年历的计算方法(推算天干甲子)
咱们国家的年历如何算
干 支 纪 年 法
一.十支纪年是中国传统的纪年方法。
1.干和支之寓意:干支是天干,地支之合称。
干指天干,共有10个符号:
1 2 3 4 5 6 7 8 9 10
甲 乙 丙 丁 戊 己 庚 辛 壬 癸
支指地支,共有12个符号:
1 2 3 45 6 78 9 10 11 12
子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
2.干和支组合后用于纪年。即:将十天干和十二地支按顺序搭配组合成干支,用于纪年。按此排法,当日干10个符号排了六轮与地支12个符号排了五轮以后,可构成60干支。续排下去又将恢复原状,循环往复,即如民间所说“六十年转甲子”。
二.查看多个时间段的万年历。如:1516—2060年的万年历,记着五百年的天干地支,一查便知。
六十年甲子(干支表)
更多阅读
我国古代采取天干地支作为计算年,月,日,时的方式方法,就是把每一个天干和地支依照一定的顺序而不重复地搭配起来,用以作为纪年,纪月,纪日,纪时的代号。把“天干”中的一个字摆放在前面,后面配上“地支”中的一个字,如此便构成一对干支。
参考资料干支纪年_知识混装大无极
周易精密推算万年历
万年历上如何推算的? 《银盘子》的秘密
万年历是一种将公历、阴历、干支历互相对应,编排在一起的历学工具书。查用万年历,着重是使用年历中的天干地支纪时。
干支纪时是我国独创的历史最悠久的历法。它以天象为根据,符合物候特点,展现了五行旺衰。在诸多学科中,有着其它历法不可替代的效果。干支纪时,在中医、气功、周易数术、农作、历法等范畴中:有着特殊的实用价值。每当需用干支纪时,而需用者手里没有万年历的时刻,常常束手无策。
,仅需记住十四字的歌诀,一年中的天干地支纪时就可迅速算出。这种快速心算万年历的方式方法,叫“银盘子”,“银盘子”是民间术士创造的万年历速算法,由来已久,以往采用师徒间口授方法传授,严禁外传,我们在此将“银盘子”合盘端出,公诸於世,以进一步探讨揭秘。
“银盘子”是以阴历为基础,精密推算干支纪时的方式方法。
阴历有大月、小月之分,大月30天,小月29天。假如不考虑小月因素,阴历两个月60天,与一个甲子六十组干支数目相符,即每两个月可重合一个甲子。依照这样一个规律,知道了某年的正月初一的日元支,就等于知道了三月初一,五月初一,七月初一,九月初一,十一月初一的日元支,这些月的初一的日元支,应是一样的(有闰月者,月分稍有变化)由于阴历中存在小月,只要晓得某年有多少个小月,其分别是哪几个月,所推日期经历了几个小月,干支纪日顺延几天就是了,这样心算干支纪日就变得十分简单了。
心算万年历,务必要清楚以下四个要点:。 (1)该年岁次;(2)正月初一的日元支;(3)立春的日、时;(4)当年几个小月,分别是哪几个月。
“银盘子”仅用了十四个字的歌诀,便将以上四个问题圆满地解决了。“银盘子”的创造者,为了守旧秘密,在编制口诀诀窍时,采用了“加密术”,即对同一地支,常常采用多种称谓。这样做,一是提供了多一点的音韵,使编出的歌诀押韵。而更主要的是为这种心算法采取了“加密”。同一地支众多称谓,变换使用,即使其他人听到也不得其解。
“银盘子”不仅对地支称谓进行了加密处理,为了便于记忆,控制歌诀字数,还设置了一些相关月份的简称。月时,可称“金蝉”。另外遇见闰月,分别以前、后、双预示。如后五,指闰五月,前三,指前三月,双七指前、后两个七月。
发现节气与阴历月之间,有一定规律可以进行修正,只要加上对应的修正值,从立春节即可精密推算全年任何一个节气的交节日期。多数节气不差一个时辰。个别节气在精密推算中能有几个时辰的误差,但用心算法达到如此的精度,已经完全可以满足实用要求了。古代人们曾规定了一个修正数,不甚精确,笔者经过慎密演算,重新确定了修正值,歌诀是:
立春节气时刻起根源,
惊蛰倒退时辰三,
要知清明三月节,
不用加减做龙坛。
加八时辰是立夏,
二日退一芒种天,
三日四时为小暑,
五天秋到衣食干。
五日十时交白露,
六日五时寒露天,
六日七时立冬节,
六日四时大雪连。
五日九时交小寒,
精密推算不会差半天。
以上是从立春节时间起计算不同节气,尚需加上有不同时间修正值。了解了由立春起,精密推算十二节气时修正值,再依据“银盘于”歌,即可算出一年中的任何一个节气的交节时间,知道了交节时间,就能确定干支纪月的起始。
试以1957年为例,精密推算立冬时间,确定干支纪月。
“银盘子”歌诀曰:“丁酉癸卯初五蛇,木局后刀四申丑上查”。“银盘子”所表达之义为:1957年岁次丁酉,正月初一的日元支是癸卯,正月初五巳时立春。十月、二月、六月、闰八月、四月、七月、腊月为小月,该年闰八月。
立冬节为十月节,因该年闰八月,所以立冬节在农历九月中,该年正月初五立春,设九个月后的初五。。。。。。>>
万年历黄道吉日查询 87丁卯兔
按周易说出嫁务必要在大利月,按女方生肖定利月
古时候对出嫁的月份很有讲究,以下是婚嫁利妨月表:
鼠马 牛羊 虎猴 鸡兔 龙狗 蛇猪
大利月 6,12/ 5,11/ 2, 8 /1, 7 /4,10 /3, 9
妨媒人 1, 7/ 4,10/ 3, 9/ 6,12 /5,11 /2, 8
妨翁姑 2, 8/ 3, 9/ 4,10/ 5,11 /6,12 /1, 7
妨爸妈 3, 9/ 2, 8/ 5,11/ 4,10 /1, 7 /6,12
妨夫方 4,10/ 1, 7/ 6,12/ 3, 9 /2, 8 /5,11
妨女方 5,11/ 6,12/ 1, 7/ 2, 8 /3, 9 /4,10
你们出嫁大利月在阴历1。7月
13年7月12 阳历8月18号 黄道百吉成日 天喜三合 星期日 冲44岁狗
14年阴历1月初9 黄道成日 万事大吉 冲甲辰龙
阴历1月21 黄道成日 万事大吉 冲丙辰龙
以上几天是你大利月最佳吉日任选,已经避免了对出嫁大忌的四离日、
四绝日、四立日、真三娘煞日、红沙日、杨公忌日、赤松子下降日、
重丧日、鬼开门日、绝烟火日、十恶大败日、天狗日、上朔日、当梁、
受死日、白虎日、朱雀日、天劫日、勾绞及凶宿和建满平破收闭日
祝你们幸福快乐!!!
周易万年历与万年历是同一个人精密推算的吗 万年历就是万年历 也称老黄历 周易万年历和万年历是相同的 它不是某个人精密推算的 就和日历是一样
周易万年历每日一卦象算法 (1) 每日一占。
或者
(2) 60甲子配卦。
万年历如何算? 万年历是一种将公历、阴历、干支历互相对应,编排在一起的历学工具书。查用万年历,着重是使用年历中的天干地支纪时。
干支纪时是我国独创的历史最悠久的历法。它以天象为根据,符合物候特点,展现了五行旺衰。在诸多学科中,有着其它历法不可替代的效果。干支纪时,在中医、气功、周易数术、农作、历法等范畴中:有着特殊的实用价值。每当需用干支纪时,而需用者手里没有万年历的时刻,常常束手无策。
,仅需记住十四字的歌诀,一年中的天干地支纪时就可迅速算出。这种快速心算万年历的方式方法,叫“银盘子”,“银盘子”是民间术士创造的万年历速算法,由来已久,以往采用师徒间口授方法传授,严禁外传,我们在此将“银盘子”合盘端出,公诸於世,以进一步探讨揭秘。
“银盘子”是以阴历为基础,精密推算干支纪时的方式方法。
阴历有大月、小月之分,大月30天,小月29天。假如不考虑小月因素,阴历两个月60天,与一个甲子六十组干支数目相符,即每两个月可重合一个甲子。依照这样一个规律,知道了某年的正月初一的日元支,就等于知道了三月初一,五月初一,七月初一,九月初一,十一月初一的日元支,这些月的初一的日元支,应是一样的(有闰月者,月分稍有变化)由于阴历中存在小月,只要晓得某年有多少个小月,其分别是哪几个月,所推日期经历了几个小月,干支纪日顺延几天就是了,这样心算干支纪日就变得十分简单了。
心算万年历,务必要清楚以下四个要点:。 (1)该年岁次;(2)正月初一的日元支;(3)立春的日、时;(4)当年几个小月,分别是哪几个月。
“银盘子”仅用了十四个字的歌诀,便将以上四个问题圆满地解决了。“银盘子”的创造者,为了守旧秘密,在编制口诀诀窍时,采用了“加密术”,即对同一地支,常常采用多种称谓。这样做,一是提供了多一点的音韵,使编出的歌诀押韵。而更主要的是为这种心算法采取了“加密”。同一地支众多称谓,变换使用,即使其他人听到也不得其解。
“银盘子”不仅对地支称谓进行了加密处理,为了便于记忆,控制歌诀字数,还设置了一些相关月份的简称。月时,可称“金蝉”。另外遇见闰月,分别以前、后、双预示。如后五,指闰五月,前三,指前三月,双七指前、后两个七月。
发现节气与阴历月之间,有一定规律可以进行修正,只要加上对应的修正值,从立春节即可精密推算全年任何一个节气的交节日期。多数节气不差一个时辰。个别节气在精密推算中能有几个时辰的误差,但用心算法达到如此的精度,已经完全可以满足实用要求了。古代人们曾规定了一个修正数,不甚精确,笔者经过慎密演算,重新确定了修正值,歌诀是:
立春节气时刻起根源,
惊蛰倒退时辰三,
要知清明三月节,
不用加减做龙坛。
加八时辰是立夏,
二日退一芒种天,
三日四时为小暑,
五天秋到衣食干。
五日十时交白露,
六日五时寒露天,
六日七时立冬节,
六日四时大雪连。
五日九时交小寒,
精密推算不会差半天。
以上是从立春节时间起计算不同节气,尚需加上有不同时间修正值。了解了由立春起,精密推算十二节气时修正值,再依据“银盘于”歌,即可算出一年中的任何一个节气的交节时间,知道了交节时间,就能确定干支纪月的起始。
试以1957年为例,精密推算立冬时间,确定干支纪月。
“银盘子”歌诀曰:“丁酉癸卯初五蛇,木局后刀四申丑上查”。“银盘子”所表达之义为:1957年岁次丁酉,正月初一的日元支是癸卯,正月初五巳时立春。十月、二月、六月、闰八月、四月、七月、腊月为小月,该年闰八月。
立冬节为十月节,因该年闰八月,所以立冬节在农历九月中,该年正月初五立春,设九个月后的初五(即九月初五)立冬。立冬前经历了五个小月(小月29日,干支月约30日),先补上五日,再加上修正值六日七个时辰,即为立。。。。。。>>
万年历黄历宜与忌的原理是如何推算或知道的。 按周易精密推算出来的
盲人算命时怎样算出万年历的?有啥口诀诀窍? 《银盘子》的秘密
万年历是一种将公历、阴历、干支历互相对应,编排在一起的历学工具书。查用万年历,着重是使用年历中的天干地支纪时。
干支纪时是我国独创的历史最悠久的历法。它以天象为根据,符合物候特点,展现了五行旺衰。在诸多学科中,有着其它历法不可替代的效果。干支纪时,在中医、气功、周易数术、农作、历法等范畴中:有着特殊的实用价值。每当需用干支纪时,而需用者手里没有万年历的时刻,常常束手无策。
,仅需记住十四字的歌诀,一年中的天干地支纪时就可迅速算出。这种快速心算万年历的方式方法,叫“银盘子”,“银盘子”是民间术士创造的万年历速算法,由来已久,以往采用师徒间口授方法传授,严禁外传,我们在此将“银盘子”合盘端出,公诸於世,以进一步探讨揭秘。
“银盘子”是以阴历为基础,精密推算干支纪时的方式方法。
阴历有大月、小月之分,大月30天,小月29天。假如不考虑小月因素,阴历两个月60天,与一个甲子六十组干支数目相符,即每两个月可重合一个甲子。依照这样一个规律,知道了某年的正月初一的日元支,就等于知道了三月初一,五月初一,七月初一,九月初一,十一月初一的日元支,这些月的初一的日元支,应是一样的(有闰月者,月分稍有变化)由于阴历中存在小月,只要晓得某年有多少个小月,其分别是哪几个月,所推日期经历了几个小月,干支纪日顺延几天就是了,这样心算干支纪日就变得十分简单了。
心算万年历,务必要清楚以下四个要点:。 (1)该年岁次;(2)正月初一的日元支;(3)立春的日、时;(4)当年几个小月,分别是哪几个月。
“银盘子”仅用了十四个字的歌诀,便将以上四个问题圆满地解决了。“银盘子”的创造者,为了守旧秘密,在编制口诀诀窍时,采用了“加密术”,即对同一地支,常常采用多种称谓。这样做,一是提供了多一点的音韵,使编出的歌诀押韵。而更主要的是为这种心算法采取了“加密”。同一地支众多称谓,变换使用,即使其他人听到也不得其解。
“银盘子”不仅对地支称谓进行了加密处理,为了便于记忆,控制歌诀字数,还设置了一些相关月份的简称。月时,可称“金蝉”。另外遇见闰月,分别以前、后、双预示。如后五,指闰五月,前三,指前三月,双七指前、后两个七月。
发现节气与阴历月之间,有一定规律可以进行修正,只要加上对应的修正值,从立春节即可精密推算全年任何一个节气的交节日期。多数节气不差一个时辰。个别节气在精密推算中能有几个时辰的误差,但用心算法达到如此的精度,已经完全可以满足实用要求了。古代人们曾规定了一个修正数,不甚精确,笔者经过慎密演算,重新确定了修正值,歌诀是:
立春节气时刻起根源,
惊蛰倒退时辰三,
要知清明三月节,
不用加减做龙坛。
加八时辰是立夏,
二日退一芒种天,
三日四时为小暑,
五天秋到衣食干。
五日十时交白露,
六日五时寒露天,
六日七时立冬节,
六日四时大雪连。
五日九时交小寒,
精密推算不会差半天。
以上是从立春节时间起计算不同节气,尚需加上有不同时间修正值。了解了由立春起,精密推算十二节气时修正值,再依据“银盘于”歌,即可算出一年中的任何一个节气的交节时间,知道了交节时间,就能确定干支纪月的起始。
试以1957年为例,精密推算立冬时间,确定干支纪月。
“银盘子”歌诀曰:“丁酉癸卯初五蛇,木局后刀四申丑上查”。“银盘子”所表达之义为:1957年岁次丁酉,正月初一的日元支是癸卯,正月初五巳时立春。十月、二月、六月、闰八月、四月、七月、腊月为小月,该年闰八月。
立冬节为十月节,因该年闰八月,所以立冬节在农历九月中,该年正月初。。。。。。>>
周易占卜 如何算孩子什么时候出生日期 按正常的出生日期,时间。查看万年历换算成干支就能够了。
阴历新历换算
阴历如何换算成新历? 农历是中国古制的时间计算方式,阳历是国际使用的时间计算方式。1993年农历9月13是阳历1993年10月27日
阴历新历如何换算 国历换算为公历
1.换算公式的导出
公历每一年365.二十四2 199074075 日 (简化为365.二十四22日),而回历每一年为354.367074375日(简化为354.36707日),所以回历一年只相当354.36707/365、二十四22=0。970223或0.9702二十四个公历年。又回历元年元旦定在公元622年7月16日,因为那个时候历法在精密推算上的误差,致那个时候的7月16日,按现代的公历应改为7月19日,自公元某年元旦至该年7月19日已达200日.相200/365、二十四22=0。5476公历年;又因到回历二年元旦才达到0.9702二十四个公历年,故自回历纪年元旦换算为公历的算式即为:
(回历纪年一1)× 0.9702二十四+622.5476年
=所求公历年月日……………………………………………………………………………(一)
或 回历纪年 × 0.9702二十四+621.5774年
=所求公历年月日……………………………………………………………………………(二)
式中621.5774来自622.5476-0.9702二十四。
如所求某一历史事实不在回历元旦时,可将事实经过本年的总日数化为回历年,加人回历纪年总数中即可。
然而上列公历一年的总日数,事实上是一回归年的实测数,因现用公历每一年的日数实为365.二十四25日,它与一回归年的日数只能是基本相符,到公元4000多年后会再出现一日之差。
事实上在明万历十年九月十八日,回历990年9月16日,公元1582年10月4日前(包括4日)的公历称儒略历,儒略历每一年365.25日,它每一年与一回归年的差值远大于格列高利历即现代的公历,大概历128年就需多闰去一日,至万历十年已经多闰出十日了。于是,对于儒略历时期的回、公两历换算,不能仍采用(l)、(二)两式,而需依儒略历的年实际日数将上列二式略加修正即可,结果如下:
(回历纪年一l)× 0.9702+622.5393
= 所求公历年月日……………………………………………………………………………(三)
回历纪年 × 0.9702+621.5691
= 所求公历年月日…………………………………………………………………………(四)
式中0.9702为354.36707/365.25所得最终,而0.5393则系公历某年元旦至其7月16日的总日数197被365.25日除之所得,622.5393-0.9702= 621.569一、
现将两种算式自回历第五2年起,每隔百年所算得的公历年月日列人下表:
国历换算为公历
自表列计算结果得知,历法不同不能用同一算式,要不然误差大大。万历十年前即已发现儒略历的春分所在日期与实测结果相差较大,至万历十年已差十日,因此格列高利第十三就决心修改儒略历,改革内容有两点,其一,将公历1582年10月4日之后一日原应为10月5日而改为10月15日,而星期序数不变,即该年10月4日为星期四,10月15日理应为星期一,实为星期五;其二,儒略历每四年有一个闰年,四百年有百闰,格列高利历仍保持儒历四年一闰的传统,但每四百年仅安排九十七个闰年,四百年中逢百年不闰,到第4百年加一个闰年⓺。儒历与格历的岁实分别是:
儒历(365 ×300+366 ×00)÷ 400年=365.25日/年
格历(365 × 303+366×97)÷ 400年=365.二十四25日/年而《明史・历志》所载的 *** 宫分历(太阳历),一百二十八年闰三十一。。。。。。>>
阴历新历怎么计算? 你说的新历即公历,也称阳历。是以地球绕太阳一周的时间定为一年,共365天零5小时多近6小时,平年只算365天。那多出的5小时多近6小时,平均约每隔4年加一天到2月份,故有时公历的2月就有29天。
而你说的阴历即农历,也称夏历。以月亮圆缺一次的时间为一个月,每月29天半。一年约为355天,大月30天,小月29天。因为阴历一年的天数与地球年(公历)相差约11日左右,所以约每3年要置一闰月,每19年要置7个闰月,使得平均每一年的天数跟地球年(公历)全年的天数相接近,来调整四季。具体闰哪个月,则要视节气情况灵活来定,如今年便是闰5月。
正因为公历和阴历的计算方法不同使每一年的天数不同,而每一年的第1天的起始时间也不同,所以使公历和阴历的月份和日期不同步,大体相差一个月左右。
由于阴历是我国历史上一直采用的历法,因此我国绝大都的地方都是以出身时的阴历来核实确定人的生日,此亦为一种民族习惯。
但因为公历计时准确且方便,因此全地球大都国家都采用公历,我国也早在辛亥剪掉鞭子后的1912年正式采用公历。因此在正式的场合出身年月都是用公历,如身份证、档案记录、履历表等等。
你会查看万年历,了解了以上的情形后就容易懂了。再告知你一个很简单容易的方法看万年历,一般在上面用 *** 数字标示的是公历的日期,在 *** 数字下面用中文数字标示的便是农历的日期。
如你说的1991年4月7日出生的:
1。假如这是公历的日期,那万年历上相应的 *** 数字4月7日下面的中文数字二月二十三即为你阴历的生日。
2。假如这是阴历的日期,那万年历上相应的中文数字四月初七上面的 *** 数字5月20日即为你公历的生日。
日期里的阴历公历农历阳历如何换算? 百度一下 太复杂了 自己研究
公历阴历转换 公历,它是国际通用的。阳历 以地球绕太阳转一圈的时间定做一年,共3 65天5小时48分46秒。平年只计365天这个 整数,不计尾数;一年分做12个月,大月31 天,小月30天,二月只有28天。四年的尾 数积累起来共1天光景,加在第4年的二月 里,此一年叫做闰年。所以闰年的二月有2 9天。农历以月亮圆缺一次的时间定做一个 月,共29天半。为了算起来方便,大月定 做30天,小月29天,一年12个月中,大小 月大致上交替排列。农历一年只有354天左 右,也没有平年闰年的差异。 农历不考虑地球绕太阳的运行,因此使得 四季的变化在农历上就没有固定的时间, 它不能反映季节,这是一个很大的缺点。 为了克服这个缺点,后来人们定了一个折 衷的历,就是所谓阴阳合历。此刻我国还 在使用的夏历(亦有人叫它阴历或农历),就 是这种阴阳合历。它跟农历一样,也以月 亮圆缺一次的时间定做一个月,也是大月3 0天,小月29天,但是它又用加闰月的办法 ,使得平均每一年的天数跟阳历全年的天数 相接近,来调整四季。夏历约每过2。三 年多一个闰月。“农历”也叫作“太农历”,系以 月球绕行地球一周为一月,再配合地球绕 日一周之时数为一年,事实上等于阴阳合 历,我国在民国元年前采用此历,为与现 行之历相对称,故名之曰“旧历”。普通人以 为农历适合于农家,而名之日“阴历”。
阴历转换公历对应表 是公历1945年4月29日 星期日
阴历和公历是怎么转换的?(如何算的?) 你是要口算还是要用笔算?
告知你,这样子算不依靠谱的,根本算不出来,关系到的转换不是简单容易的几个公式能总结出,相反,它的转换相当复杂。
假如感兴趣编写流程的,我可以提供转换函数库,调用一个函数就能够实现阴历与公历的互转了。
目前我已经完美地实现了转换,假如需要,我可以提供。
怎样将阴历转换为公历 是公历11月13日。这日历上有,要问怎么换的,当然公历是固定的,1。3。5。7。8。10。12月都是31天,2月28天(每4年润一次月,像2008年够4整除,润2月29天),其余的都是30天。
对于阴历,它实质是农历,沿用的是太农历,这是一门很复杂的天文学知识。它包括二十四节气。
记住阳历是:1。3。5。7。8。10。腊,31天都不差,其余都是30天,除了2月28、
若是闰月2月29天,只多一天。
农历如何换算阳历? 每月初一叫做朔,最后一日叫做晦。阴历十五或十六或十七叫做望,望的后一天叫做既望 所以每一年春节的大年三十并不在同一天。阴历的基础是「回归年」和「朔望月」。「回归年」是太阳接连两次通过春分点需要的时间,即365、二十四22日(365日5小时48分46秒)。「朔望月」是月球接连两次朔(新月)或两次望(满月)相隔的时间,即29、5306日(29日12小时44分3秒)。 因为12个「朔望月」只有354、3672日,跟「回归年」的365、二十四22日相差超过10日,把相差累积起来便成为闰月。早在公元前5。六百年的春秋时代,中国历法便采用十九年七个闰月的安排 但咱们国家的阴历和 *** 的阴历以及韩国的阴历计算方法不一样,普遍要相差一二天。 农历日期是以月亮的圆缺为计月单位,其以逢朔为初一,以月望为十五(大月为十六日),以月晦为二十 九日(大月为三十日)。然而目前记时通常来讲用阳历日期表达,如欲将阳历日期换算成农历日期可以 使用以下两种方法:其一是查《新编万年历》,如查1984年6月8日是农历几日?翻开万年历6月10日是农历十一,则逆推6月8日是农历初九。其二可以利用公式精密推算农历日期: 设:公元年数-1977(或1901)=4Q+R 则:农历日期=14Q+10、6(R+1)+年内日期序数-29、5n (注:式中Q、R、n均为自然数,R
C语言编写万年历系统
已经编译运行确认过。
#include <stdio。h>
#include <stdlib。h>
int leap(int); /*判断是否为闰年*/
int md(int m,int y); /*返回本月的天数*/
void prtweek(void); /*输出表头*/
int fw(int m,int y); /*返回本月一号是星期几*/
void prtmonth(int m); /*输出月份表头*/
int main(void)
{
int y,m,i,test,week;
printf("please import year of you want to select : ");
scanf("%d",&y);
for (m=1; m<=12; m++) {
test=1;
prtmonth(m);
prtweek();
week=fw(m,y);
if (week!=6)
for (i=0; i<=week; i++) {
putchar('\t');
test++;
}
for (i=1; i<=md(m,y); i++,test++) {
printf("%d\t",i);
if (test%7==0) {
putchar('\n');
}
}
putchar('\n');
system("pause");//暂停,以便观察输出
}
return 0;
}
int leap(int y)
{
return (y%4==0&&y%100||y%400==0)?1:0;
}
int md(int m,int y)
{
int d;
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:d=31;break;
case 4:
case 6:
case 9:
case 11:d=30;break;
case 2:d=leap(y)?29:28;break;
}
return d;
}
void prtweek(void)
{
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n","Sun","Mon","Tue","Wed","Thur","Fri","Sat");
}
int fw(int m,int y)
{
int f;
if (m<3) {
m+=12;
y--;
}
f=(1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
return f;
}
void prtmonth(int m)
{
switch (m) {
default:
case 1:puts("===January===");break;
case 2:puts("===February===");break;
case 3:puts("===March===");break;
case 4:puts("===April===");break;
case 5:puts("===May===");break;
case 6:puts("===June===");break;
case 7:puts("===July===");break;
case 8:puts("===August===");break;
case 9:puts("===September===");break;
case 10:puts("===October===");break;
case 11:puts("===非也vember===");break;
case 12:puts("===December===");break;
}
}写万年历流程,您需要先了解万年历的特征
以下是万年历的特征(复制粘贴的):
1、 平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
因为公元1月1日设为星期六,故3月1日为星期三。 ——注意和提防这个“三”
为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2、 每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。)
所以百年%4=0闰或(年%4=0并且年>0)闰。
3、 每 4年(3个平年+1个闰年)共208周+5天 ——注意和提防这个“5天”
每百年共100*(208周+5天)-1天=5217周+5天 ——注意和提防这个“5天”(整百年暂设为平年)
每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意和提防这个“0天”和“1天”(4个整百年仅有一个闰年)
即400年一轮回!!!(原来万年历400年前是一家)
至于你说的日期和星期对齐,给你一点思路参考:每一行是7天,可以设定每天占10个字符(同时上面的星期也得占满10个字符),假设本月第1天是星期4,那么这样说的话在输出1之前需要先输出10×三个字符来占位,当输出星期天的日期之后换行,后来的就简单了程图吗,有软件的,可以到网上下,我这亦有,想要
可以找我
#include
<stdio。h>
int
leap
(int
year)
{if(year%4==0&&year%100!=0||year%400==0)
return
1;
else
return
0;
}
int
days_month
(int
month,int
year)
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return
31;
if(month==4||month==6||month==9||month==11)
return
30;
if(month==2&&leap(year)==1)
return
29;
else
return
28;
}
int
firstday(int
month,int
year)
{int
w;
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1;
return
w;
}
main()
{int
i,j=1,k=1,a,b,month,year;
printf("\n
input
month
and
year:\n");
scanf("%d%d",&month,&year);
b=days_month(month,year);
a=firstday
(month,year);
printf("
Sun
Mon
Tue
Wed
Thu
Fri
Sat
\n");
if(a==7)
{for(i=1;i<=b;i++)
{printf("%4d",i);
if(i%7==0)
{printf("\n");
}
}
}
if(a!=7)
{while
(j<=4*a)
{printf("
");
j++;
}
for(i=1;i<=b;i++)
{printf("%4d",i);
if(i==7*k-a)
{printf("\n");
k++;
}
}
}
getch();
用C语言怎么编写这个万年历
核心算法:星期(0~6)=(年份系数+月份系数+日期)%7;
其中,年份系数我以2007年做参照,已知2007年,年份系数是0,往前往后分别为递减和递增。增减规律:非闰年为±1,闰年1~2月-2或+1,闰年3~12月+2或者-一、
其中,12个月份系数对应:0,3,3,6,1,4,6,2,5,0,3,五、
依据以上规律,只要利用循环,就能够的到对应系数和星期。
日历实现翻页功能,按键盘左右方向键可以翻译查看当年其他月份,按向上方向键可以返回菜单。
以下是代码:
#include <stdio。h>
#include <malloc。h>
#include <string。h>
#include <conio。h>
#include <math。h>
#include <time。h>
#define XY 2007
#define X07 0//以2007年年系数0做参照
int isLeapYear(int year);//判断是否是闰年,是返回1,否返回0
int addyx(int yx,int n);//年系数自增,0~6,n:自增的跨度,返回自增后的年系数
int getYX(int year,int month);//获得年系数0~6
int getMX(int month);//获得月系数
int getWeek(int yx,int mx,int day);//通过新年月系数(yx:年系数;mx:月系数)及日期获取星期
char *getStrWeek(int yx,int mx,int day);//通过新年月系数(yx:年系数;mx:月系数)及日期获取星期相应的中文字符串
int getMaxDay(int year,int month);//通过新年月获取当月最大天数
void prCalendar(int year,int month);//打印日历
int showMeun();//打印主菜单
int getDuration(int year,int month,int day);//通过日期获取距今天数
int calendar⓺⓻;
int main()
{
//int year,month,day,yx,mx;
while(1)
{
if(!showMeun())
break;
}
return 0;
}
int showMeun()//打印主菜单
{
int n,year,month,day,yx,mx;
while(1)
{
system("cls");
printf("1。输入年份,显示该年每一个月的日历\n");
printf("2。输入年月,显示该月的天数\n");
printf("3。输入日期,显示距离今天的天数\n");
printf("4。输入日期,查询这一天是星期几\n");
printf("0、结束流程\n");
n=-1,year=0,month=0,day=0;
while(n<0 || n>4)
{
printf("请输入选择的菜单序号:");
scanf("%d",&n);
}
switch(n)
{
case 1:while(year<=0 || year>9999)
printf("请输入年份:"),scanf("%d",&year);
prCalendar(year,1);
break;
case 2:while(year<=0 || year>9999 || month<=0 || month>12)
printf("请输入年份及月份:"),scanf("%d%d",&year,&month);
printf("%4d年%2d月共有%d天\n按任意键继续。。。。。。\n",year,month,getMaxDay(year,month)),getch();
break;
case 3:while(year<=0 || year>9999 || month<=0 || month>12 || day<0 || day>getMaxDay(year,month))
printf("请输入日期:"),scanf("%d%d%d",&year,&month,&day);
printf("距离今日有%d天\n按任意键继续。。。。。。\n",getDuration(year,month,day)),getch();
break;
case 4:while(year<=0 || year>9999 || month<=0 || month>12 || day<0 || day>getMaxDay(year,month))
printf("请输入日期:"),scanf("%d%d%d",&year,&month,&day);
yx=getYX(year,month);
mx=getMX(month);
printf("%4d年%2d月%2d日是%s\n按任意键继续。。。。。。\n",year,month,day,getStrWeek(yx,mx,day)),getch();
break;
case 0:return 0;
}
}
return n;
}
void prCalendar(int year,int month)//打印日历
{
char c1,c2;
int i,j,*p=NULL,yx,mx,cnt,w,maxDay;
while(1)
{
p=&calendar[0][0];
yx=getYX(year,month),mx=getMX(month);
cnt=0,w=getWeek(yx,mx,1);
maxDay=getMaxDay(year,month);
for(i=0;i<6;i++)
for(j=0;j<7;j++)
{
if(cnt<w)
p++,cnt++;
calendar[i][j]=0;
}
for(i=1;i<=maxDay;i++)
*p=i,p++;
system("cls");
printf(" %4d 年%2d月 \n",year,month);
printf("日 一 二 三 四 五 六\n");
for(i=0;i<6;i++,printf("\n"))
for(j=0;j<7;j++)
if(calendar[i][j]==0)
printf(" ");
else
printf("%2d ",calendar[i][j]);
printf("<- 按方向键向左或向右翻页 ->\n");
printf(" 按向上方向键返回主菜单\n");
c1=getch();
c2=getch();
if(c1==-32 && c2==75)//左键
{
if(month==1)
month=12;
else
month--;
}
if(c1==-32 && c2==77)//右键
{
if(month==12)
month=1;
else
month++;
}
if(c1==-32 && c2==72)//上键
{
showMeun();
break;
}
}
}
int getDuration(int year,int month,int day)//通过日期获取距今天数
{
int i,y,m,d,sum=0,sum2=0,minY,maxY,minM,maxM,minD,maxD;
time_t tt;
struct tm *tmp;
time(&tt);
tmp=localtime(&tt);
y=1900+tmp->tm_year,m=1+tmp->tm_mon,d=tmp->tm_mday;//获取当前日期的年月日
if(year<y)
minY=year,maxY=y,minM=month,maxM=m,minD=day,maxD=d;
if(year>y)
minY=y,maxY=year,minM=m,maxM=month,minD=d,maxD=day;
if(year!=y)
{
for(i=minY;i<maxY;i++)//按相差年份累加(不蕴含右端最大年份)
if(isLeapYear(i))
sum+=366;//闰年
else
sum+=365;
for(i=1;i<minM;i++)//扣除左端年份已过月份对应天数
sum-=getMaxDay(minY,i);
sum-=minD;//扣除左端当月已过天数
for(i=1;i<maxM;i++)//累加右端最大年份已过月份对应天数(不蕴含最大年份当月)
sum+=getMaxDay(maxY,i);
sum+=maxD;//累加右端当月已过天数
}
else//假如年份相同,累加两边一年内已过天数,求差值
{
for(i=1;i<month;i++)
sum+=getMaxDay(month,i);
sum+=day;
for(i=1;i<m;i++)
sum2+=getMaxDay(m,i);
sum2+=d;
return abs(sum2-sum);
}
return sum;
}
int getMaxDay(int year,int month)//通过新年月获取当月最大天数
{
int days⑫={31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year) && month==2)
return days[month-1]+1;
return days[month-1];
}
char *getStrWeek(int yx,int mx,int day)//通过新年月系数(yx:年系数;mx:月系数)及日期获取星期相应的中文字符串
{
int w;
static char week⓻;
memset(week,0,7);
strcpy(week,"星期");
w=getWeek(yx,mx,day);
switch(w)
{
case 0:strcat(week,"日");break;
case 1:strcat(week,"一");break;
case 2:strcat(week,"二");break;
case 3:strcat(week,"三");break;
case 4:strcat(week,"四");break;
case 5:strcat(week,"五");break;
case 6:strcat(week,"六");break;
}
return week;
}
int getWeek(int yx,int mx,int day)//通过新年月系数(yx:年系数;mx:月系数)及日期获取星期相应的数值0~6
{
return (yx+mx+day)%7;
}
int getMX(int month)//获得月系数
{
int xmonth⑫={0,3,3,6,1,4,6,2,5,0,3,5};//月系数:1-12月,每月的系数。
return xmonth[month-1];
}
int getYX(int year,int month)//获得年系数0~6
{
int yx=0,nyear=XY,isly,flag;
if(nyear==year)
return 0;
if(nyear<year)
flag=0,nyear++;
else
flag=1,nyear--;
while(1)
{
isly=isLeapYear(nyear);
if(!isly){//非闰年年系数累加1
if(!flag)
yx=addyx(yx,1);
else
yx=addyx(yx,-1);
}
if(isly && month>=1 && month<=2){//闰年1~2月年系数累加1,3`12月年系数累加2
if(!flag)
yx=addyx(yx,1);
else
yx=addyx(yx,-2);
}
else if(isly && month>=3 && month<=12){
if(!flag)
yx=addyx(yx,2);
else
yx=addyx(yx,-1);
}
if(nyear==year)
break;
if(!flag && nyear<year)
nyear++;
if(flag && nyear>year)
nyear--;
}
return yx;
}
int addyx(int yx,int n)//年系数自增,0~6,n:自增的跨度,返回自增后的年系数
{
if(n>0)
{
if(yx+n<=6)
return yx+n;
if(yx+n>6)
return yx+n-7;
}
if(n<0)
{
if(yx+n>=0)
return yx+n;
if(yx+n<0)
return yx+n+7;
}
return -1;
}
int isLeapYear(int year)//判断是否是闰年,是返回1,否返回0
{
if((year%4==0 && year%100!=0)||(year%400==0))
return 1;
return 0;
}


