干支是天干和地支的总称。
把干支顺序相配正好六十为一周,周而复始,循环记录,这就是俗称的"干支表"。
甲、乙、丙、丁、戊、己、庚、辛、壬、癸 等十个符号叫天干;
子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 等十二个符号叫地支。
所谓的干支纪年就是把一个年份用一个天干和一个地支组合来表示;
相应的也有干支纪月 干支纪日 干支纪时;
而 干支纪 年 月 日 时 就组成了生辰八字;
生辰八字,简称八字,是指一个人出生时的干支历日期;
年月日时共四柱干支,每柱两字,合共八个字。
生辰八字在中国民俗信仰中占有重要地位,
古代中国道家、星相家据此推算人的命运的好坏。
五行 指的是 金 木 水 火 土
对应关系如下:
天干地支的五行属性表
天干:
甲 - 木、乙 - 木、丙 - 火、丁-火、戊-土、己-土、庚-金、辛-金、
壬-水、癸-水
地支:
子 - 水、丑 - 土、寅 - 木、卯-木、辰-土、巳-火、午-火、未-土、
申-金、酉-金、戌-土、亥-水
五行纳音命理对照表
以上是关于生辰八字五行及年干支本命纳音的简单介绍,下面是代码运行情况及代码:
查询结果如下图:
2019-4-8 修改:
增加 对输入数据的判断,“错误“–重新进入程序,正确 继续查询
增加 0”退出,or 任意键 继续查询
修改如下:
增加了以下代码段1:(判断输入是否正确)
if(month>12||month<1||date<1||date>31||time>2400)
{printf("\t您的输入错误,重新进入程序\n\n");main();}
else
{
增加了以下代码段2::(实现重复查询,直到主动选择退出)
printf("\t请选择0:退出 or 任意键继续查询\n\n\t");
getchar();
if(getchar()=='0')
{printf("————————感谢使用 生辰八字五行查询 小程序————————\n\n");
printf("\t\t\t再见!\n");return 0; }
else {printf("\n\n");main(); }
}
另外,调整了输入输出的格式,更方便查看。
以下是相关程序的代码:
/*输入出生年月日时,返回生辰八字五行*/
#include<stdio.h>
#include<string.h>
char *tiang[]={"癸","甲","乙","丙","丁","戊","己","庚","辛","壬"};
char *dizhi[]={"亥","子","丑","寅","卯","辰","巳","午","未","申","酉","戌"};
char *wuxing[]={"木","火","土","金","水"};
char *wxnayin[]={"海中金","炉中火","大林木","路旁土","剑锋金","山头火","涧下水","城头土","白蜡金","杨柳木","泉中水","屋上土","霹雳火","松柏木","长流水",
"沙中金","山下火","平地木","壁上土","金箔金","覆灯火","天河水","大驿土","钗钏金","桑柘木","大溪水","沙中土","天上火","石榴木","大海水"};
int ytian(int year) /*计算年对应的天干*/
{ int i;
i=year-3;
return (i%10);
}
int ydiz(int year) /*计算年对应的地支*/
{
int i;
i=year-3;
return (i%12);
}
int mtian(int t1,int t2) /*计算月对应的天干*/
{ int i;
i=t1%5*2+1+t2-2;
i=i%10;
return (i);
}
int dtian(int y,int m,int d) /*计算日对应的天干*/
{ int g,c,j;
if(m<=2)m+=12;
c=y/100;
y=y%100;
g=4*c+c/4+5*y+y/4+3*(m+1)/5+d-3;
j=g%10;
return (j);
}
int ddi(int y,int m,int d) /*计算日对应的地支*/
{ int z,c,i,j;
if(m<=2)m+=12;
if(m%2)i=6;else i=0;
c=y/100;
y=y%100;
z=8*c+c/4+5*y+y/4+3*(m+1)/5+d+7+i;
j=z%12+6;
if(j>7)j=j%12;
return (j);
}
int ttian(int t1,int t2) /*计算时对应的天干*/
{ int i;
//if(t1%5==0)i=9;
// else
i=(t1*2-1)+(t2/100+1)/2;
i=i%10;
return (i);
}
int ttd(int t)
{ int tem;
t=t/100;
if(t>=1&&t<23)tem=(t+1)/2+1;else tem==1;
return (tem%12);
}
int tgwx(int n)/*天干对应五行*/
{
return ((n+1)/2-1);
}
int dzwx(int n)/*地支对应五行*/
{
if(n==3||n==4)return 0;
else if(n==6||n==7)return 1;
else if(n==9||n==10)return 3;
else if(n==0||n==1)return 4;
else return 2;
}
int pr1(int n)/*天干输出*/
{
printf("%s",*(tiang+n));
}
int pr2(int n)/*地支输出*/
{
printf("%s",*(dizhi+n));
}
int pr3(int n)/*五行输出*/
{
printf("%s",*(wuxing+n));
}
int main()
{
int year,month,date,time;
printf("————————欢迎使用 生辰八字五行查询 小程序————————\n\n\t");
printf("请输入阳历出生年、月、日、时:\n\n\t");
printf("举例:2016 9 25 1702\n\n\t");
scanf("%d%d%d%d",&year,&month,&date,&time);
if(month>12||month<1||date<1||date>31||time>2400)
{printf("\t您的输入错误,重新进入程序\n\n");main();}
else
{
int tg1,tg2,tg3,tg4,dz1,dz2,dz3,dz4;
tg1=ytian(year);
dz1=ydiz(year);
tg2=mtian(tg1,month);
if(month+1>=11)dz2=month-11;else dz2=month+1;
tg3=dtian(year,month,date);
dz3=ddi(year,month,date);
tg4=ttian(tg3,time);
dz4=ttd(time);
printf("\n\t您查询生辰的八字五行如下:\n\n");
printf("\t 年\t 月\t 日\t 时\n\n");
printf("\t");
pr1(tg1);pr2(dz1);printf("\t");
pr1(tg2);pr2(dz2);printf("\t");
pr1(tg3);pr2(dz3);printf("\t");
pr1(tg4);pr2(dz4);printf("\n\n");
printf("\t");
pr3(tgwx(tg1));pr3(dzwx(dz1));printf("\t");
pr3(tgwx(tg2));pr3(dzwx(dz2));printf("\t");
pr3(tgwx(tg3));pr3(dzwx(dz3));printf("\t");
pr3(tgwx(tg4));pr3(dzwx(dz4));printf("\n\n");
printf("\n\t您查询的生辰八字五行纳音为:");
printf("\%s\n\n",*(wxnayin+(((year-1924)%60)/2)));
printf("\n\n");
printf("\t请选择0:退出 or 任意键继续查询\n\n\t");
getchar();
if(getchar()=='0')
{printf("————————感谢使用 生辰八字五行查询 小程序————————\n\n");
printf("\t\t\t再见!\n");return 0; }
else {printf("\n\n");main(); }
}
}
改进的代码
/*输入出生年月日时,返回生辰八字五行*/
#include<stdio.h>
#include<string.h>
#include<windows.h>
char *tiang[]={"癸","甲","乙","丙","丁","戊","己","庚","辛","壬"};
char *dizhi[]={"亥","子","丑","寅","卯","辰","巳","午","未","申","酉","戌"};
char *wuxing[]={"木","火","土","金","水"};
char *wxnayin[]={"海中金","炉中火","大林木","路旁土","剑锋金","山头火","涧下水","城头土","白蜡金","杨柳木","泉中水","屋上土","霹雳火","松柏木","长流水",
"沙中金","山下火","平地木","壁上土","金箔金","覆灯火","天河水","大驿土","钗钏金","桑柘木","大溪水","沙中土","天上火","石榴木","大海水"};
int ytian(int year) /*计算年对应的天干*/
{ int i;
i=year-3;
return (i%10);
}
int ydiz(int year) /*计算年对应的地支*/
{
int i;
i=year-3;
return (i%12);
}
int mtian(int t1,int t2) /*计算月对应的天干*/
{ int i;
i=t1%5*2+1+t2-2;
i=i%10;
return (i);
}
int dtian(int y,int m,int d) /*计算日对应的天干*/
{ int g,c,j;
if(m<=2)m+=12;
c=y/100;
y=y%100;
g=4*c+c/4+5*y+y/4+3*(m+1)/5+d-3;
j=g%10;
return (j);
}
int ddi(int y,int m,int d) /*计算日对应的地支*/
{ int z,c,i,j;
if(m<=2)m+=12;
if(m%2)i=6;else i=0;
c=y/100;
y=y%100;
z=8*c+c/4+5*y+y/4+3*(m+1)/5+d+7+i;
j=z%12+6;
if(j>7)j=j%12;
return (j);
}
int ttian(int t1,int t2) /*计算时对应的天干*/
{ int i;
// if(t1%5==0)i=9;
// else
i=(t1*2-1)+(t2/100+1)/2;
i=i%10;
return (i);
}
int ttd(int t)
{ int tem;
t=t/100;
if(t>=1&&t<23)tem=(t+1)/2+1;else tem==1;
return (tem%12);
}
int tgwx(int n)/*天干对应五行*/
{
return ((n+1)/2-1);
}
int dzwx(int n)/*地支对应五行*/
{
if(n==3||n==4)return 0;
else if(n==6||n==7)return 1;
else if(n==9||n==10)return 3;
else if(n==0||n==1)return 4;
else return 2;
}
int pr1(int n)/*天干输出*/
{
printf("%s",*(tiang+n));
}
int pr2(int n)/*地支输出*/
{
printf("%s",*(dizhi+n));
}
int pr3(int n)/*五行输出*/
{
printf("%s",*(wuxing+n));
}
void meanu()
{
system("title 八字五行查询 Powered by : RedMaple");
system("mode con cols=50 lines=30");
system("color 74") ;
}
int main()
{
system("cls");
meanu();
int year,month,date,time;
printf("\n————欢迎使用 生辰八字五行查询 小程序————\n\n\t");
printf("请输入阳历出生年、月、日、时:\n\n\t");
printf("举例:1980 9 25 1702\n\n");
printf("\t*********************************\n\t");
scanf("%d%d%d%d",&year,&month,&date,&time);
if(month>12||month<1||date<1||date>31||time>2400||year<1924)
{printf("\t您的输入错误,重新进入程序\n\n");main();}
else
{
int tg1,tg2,tg3,tg4,dz1,dz2,dz3,dz4;
tg1=ytian(year);
dz1=ydiz(year);
tg2=mtian(tg1,month);
if(month+1>=11)dz2=month-11;else dz2=month+1;
tg3=dtian(year,month,date);
dz3=ddi(year,month,date);
tg4=ttian(tg3,time);
dz4=ttd(time);
printf("\n\t*********************************\n");
printf("\n\t您查询生辰的八字五行如下:\n\n");
printf("\t 年\t 月\t 日\t 时\n\n");
printf("\t");
pr1(tg1);pr2(dz1);printf("\t");
pr1(tg2);pr2(dz2);printf("\t");
pr1(tg3);pr2(dz3);printf("\t");
pr1(tg4);pr2(dz4);printf("\n\n");
printf("\t");
pr3(tgwx(tg1));pr3(dzwx(dz1));printf("\t");
pr3(tgwx(tg2));pr3(dzwx(dz2));printf("\t");
pr3(tgwx(tg3));pr3(dzwx(dz3));printf("\t");
pr3(tgwx(tg4));pr3(dzwx(dz4));printf("\n\n");
printf("\n\t五行纳音为:");
printf("\%s\n\n",*(wxnayin+(((year-1924)%60)/2)));
printf("\t*********************************\n");
printf("\t【0】退出 【】任意键继续查询\n\n\t");
getchar();
if(getchar()=='0')
{
system("cls");
printf("\n\n————感谢使用 生辰八字五行查询 小程序————\n\n");
printf("\t\t\t再见!\n");
return 0;
}
else {printf("\n\n");main(); }
}
}
/*****************************************************************************/
公元**年的天干地支计算方法
10天干:甲乙丙丁戊己庚辛壬癸
12地支:子丑寅卯辰巳午未申酉戌亥
甲子年 1924 1984 2044
年 除以 60 余 4 即为 甲子年
年的天干地支计算
天干计算
年 -3 再%10 取余 所得余数 与10天干 一 一对应
地支计算
年 -3 再%12 取余 所得余数 与12地支 一 一对应
月的天干地支计算(阳历)
天干计算
年天干数%5 取余 所得余数*2+1 加上月份-2 与天干 一 一对应
(只有5个,按余数0-4,甲丙戊庚壬)
地支计算
丑寅卯辰巳午未申酉戌亥子 与12月一 一对应
从已知日期计算干支纪日的公式为:
G = 4C + [C / 4] + 5y + [y / 4] + [3 * (M + 1) / 5] + d - 3
Z = 8C + [C / 4] + 5y + [y / 4] + [3 * (M + 1) / 5] + d + 7 + i
其中 C 是世纪数减一,y 是年份后两位,M 是月份,d 是日数。
1月和2月按上一年的13月和14月来算。奇数月i=0,偶数月i=6。
G 除以10的余数是天干,Z 除以12的余数是地支。
计算时带[ ]的数表示取整。
例如:查2006年4月1日的干支日。 将数值代入计算公式。
G =4*20 + [20 / 4] + 5*06 + [06 / 4] + [3 * (4 + 1) / 5] + 1 - 3 =117
除以10 余数为 7 ,天干的第7位是‘庚’。
Z =8*20 + [20 / 4] + 5*06 + [06 / 4] + [3 * (4 + 1) / 5] + 1 + 7 + 6 =213
除以12 余数为 9 ,地支的第9位是‘申’。
答案是:2006年4月1日的干支日是庚申日。
12时辰对应的天干地支
天干计算
甲乙丙丁戊己庚辛壬癸 日天干 *2-1+((time%100+1)/2)%10
与10天干一 一对应
地支计算
子丑寅卯辰巳午未申酉戌亥 与12时辰一 一对应
/*************************************************************************************/
查询方法来源于网络,经过自己的整理,推算,总结。
最终有了上面的代码,仅作为学习交流用。
如果用于商业用途,请提前声明。