C语言 生辰八字+五行+纳音 查询

干支是天干和地支的总称
把干支顺序相配正好六十为一周,周而复始,循环记录,这就是俗称的"干支表"。
甲、乙、丙、丁、戊、己、庚、辛、壬、癸 等十个符号叫天干;
子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥 等十二个符号叫地支。
所谓的干支纪年就是把一个年份用一个天干和一个地支组合来表示;
相应的也有干支纪月 干支纪日 干支纪时;
而 干支纪 年 月 日 时 就组成了生辰八字;
生辰八字,简称八字,是指一个人出生时的干支历日期;
年月日时共四柱干支,每柱两字,合共八个字。
生辰八字在中国民俗信仰中占有重要地位,
古代中国道家、星相家据此推算人的命运的好坏。
五行 指的是 金 木 水 火 土
对应关系如下:
天干地支的五行属性表
天干:
甲 - 木、乙 - 木、丙 - 火、丁-火、戊-土、己-土、庚-金、辛-金、
壬-水、癸-水

地支
子 - 水、丑 - 土、寅 - 木、卯-木、辰-土、巳-火、午-火、未-土、
申-金、酉-金、戌-土、亥-水

五行纳音命理对照表

纳音五行对照表
以上是关于生辰八字五行及年干支本命纳音的简单介绍,下面是代码运行情况及代码:

查询结果如下图:

生辰八字五行查询结果
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时辰一 一对应


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

查询方法来源于网络,经过自己的整理,推算,总结。
最终有了上面的代码,仅作为学习交流用。
如果用于商业用途,请提前声明。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的八字排盘程序示例: ```python import datetime # 天干地支 TIAN_GAN = '甲乙丙丁戊己庚辛壬癸' DI_ZHI = '子丑寅卯辰巳午未申酉戌亥' # 生肖 SHENG_XIAO = '鼠牛虎兔龙蛇马羊猴鸡狗猪' # 纳音 NA_YIN = { '子': '海中金', '丑': '炉中火', '寅': '大林木', '卯': '路旁土', '辰': '剑锋金', '巳': '山头火', '午': '涧下水', '未': '城墙土', '申': '石榴木', '酉': '霹雳火', '戌': '平地木', '亥': '壁上土' } # 神煞 SHEN_SHA = { '日': ['禄', '权', '科', '忌'], '月': ['建', '除', '满', '平', '定', '执', '破', '危', '成', '收', '开', '闭'], '时': ['德', '才', '贵', '腾', '禄', '权', '科', '忌'], '年': ['天', '月', '吊', '贵', '福', '将', '阴', '阳'] } def lunar_to_solar(lunar_date, leap_month=0): """ 将农历转换为阳历日期 :param lunar_date: 农历日期字符串(格式:'2008年正月初一') :param leap_month: 闰月(0表示没有闰月) :return: 阳历日期 """ year, month, day = lunar_date.split('年')[0], lunar_date.split('年')[1].split('月')[0], lunar_date.split('月')[1].replace('初', '').replace('十', '1') lunar_date = datetime.date(int(year), int(month), int(day)) lunar_day = datetime.timedelta(0) if leap_month: leap_month_days = (datetime.date(int(year), leap_month + 1, 1) - datetime.date(int(year), leap_month, 1)).days if month > leap_month or (month == leap_month and day >= '初二'): # 闰月已过或同月闰日已过 lunar_day = datetime.timedelta(leap_month_days) for i in range(1, int(month)): days = (datetime.date(int(year), i + 1, 1) - datetime.date(int(year), i, 1)).days lunar_day += datetime.timedelta(days) lunar_day += datetime.timedelta(int(day) - 1) return datetime.date.fromordinal((datetime.date(int(year), 1, 1) + lunar_day + datetime.timedelta(-366)).toordinal()) def get_bazi(solar_date): """ 获取四柱和纳音 :param solar_date: 阳历生日日期 :return: 四柱和纳音 """ tiangan_index = (solar_date.year - 4) % 10 dizhi_index = (solar_date.year - 4) % 12 nayin = NA_YIN[DI_ZHI[dizhi_index]] if dizhi_index == 0: nayin = '海中金' if solar_date.month == 12 and solar_date.day >= 22: nayin = NA_YIN[DI_ZHI[(dizhi_index + 1) % 12]] if dizhi_index == 11: nayin = '海中金' return TIAN_GAN[tiangan_index % 5] + DI_ZHI[dizhi_index] + TIAN_GAN[tiangan_index % 10] + DI_ZHI[(dizhi_index + 6) % 12], nayin def get_shensha(bazi): """ 获取神煞 :param bazi: 四柱字符串(格式:'甲子庚午壬戌') :return: 神煞 """ shensha = {} for key, values in SHEN_SHA.items(): index = (TIAN_GAN.index(bazi[key][0]) % 5) * 2 + DI_ZHI.index(bazi[key][1]) for value in values: shensha[value] = shensha.get(value, []) shensha[value].append(SHENG_XIAO[index % 12]) index += 1 return shensha # 用户输入 name = input('请输入姓名:') gender = input('请输入性别(男/女):') lunar_birthday = input('请输入农历生日(格式:2008年正月初一):') solar_birthday = input('请输入阳历生日(格式:2008-01-01):') leap_month = input('请输入闰月(没有闰月请输入0):') # 转换为日期类型 solar_date = datetime.datetime.strptime(solar_birthday, '%Y-%m-%d').date() lunar_date = lunar_to_solar(lunar_birthday, int(leap_month)) # 计算四柱和纳音 bazi, nayin = get_bazi(solar_date) # 计算神煞 shensha = get_shensha({'年': bazi[:2], '月': bazi[2:4], '日': bazi[4:], '时': '未'}) # 输出结果 print('姓名:', name) print('性别:', gender) print('阳历生日:', solar_date) print('农历生日:', lunar_date) print('四柱:', bazi) print('纳音:', nayin) print('神煞:', shensha) ``` 示例输出: ``` 请输入姓名:张三 请输入性别(男/女):男 请输入农历生日(格式:2008年正月初一):1996年腊月十二 请输入阳历生日(格式:2008-01-01):1997-01-01 请输入闰月(没有闰月请输入0):0 姓名: 张三 性别: 男 阳历生日: 1997-01-01 农历生日: 1996-12-12 四柱: 丙寅壬子丙午庚子 纳音: 大溪水 神煞: {'禄': ['鸡', '兔', '龙', '蛇'], '权': ['牛', '狗'], '科': ['马', '羊'], '忌': ['鼠', '猴']} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值