TGDZCalc 实现 by D语言

对D语言有点好奇,花了点时间学习了一下,但不太顺利,vscode没有搞好调试环境,只能运行。
为了在控制台输入正确的中文字符,需要安装并编译excode模块。 并且用mdm xxx.d通不过,只在rdmd 下运行通过。

先搞到这里,已经有32种语言实现,暂时不想再折腾这玩意了。

点击查看代码
module test;
import std.stdio;
import std.string;
import exCode;

wchar[] YearToTGDZ(int year)
{
wchar[] TG =['甲','乙','丙','丁','戊','已','庚','辛','壬','癸'];  //string TG="甲乙丙丁戊已庚辛壬癸" ; 
wchar[] DZ = ['子','丑','寅','卯','辰','已','午','未','申','酉','戌','亥']; //string DZ = "子丑寅卯辰已午未申酉戌亥";
if (year==0)
{return ['0','0'];}

year-= (year<0)? 3:4;
while (year<0) {year +=60;};

int z1= year % 10; int z2=year %12;
wchar[] tgdzArr=[TG[z1],DZ[z2]];
return tgdzArr;  //
}


int GetBaseYear(const int year)
{
    int base =(year>0)? 1984:-57;
    while (base>year) {base -=60;}
    while((base + 60) <=year){base +=60;}
    return base;
}

int TGDZToYear(wchar[] tgdz, int baseYear)
{
    assert(tgdz.length==2,"输入的天干地支长度错误:不是2");
    wchar  s1=tgdz[0];
    wchar  s2=tgdz[1];
    wchar[] TG =['甲','乙','丙','丁','戊','已','庚','辛','壬','癸'];  
    wchar[] DZ = ['子','丑','寅','卯','辰','已','午','未','申','酉','戌','亥']; 
    int t, d;
    for(int i=0;i<10;i++)
    {
        if (TG[i]==s1) {t=i; break;}
    }
    for(int i=0;i<12;i++)
    {
        if (DZ[i]==s2) {d=i; break;}
    }
    int m =(t-d>=0)?(t-d):(t-d+12);
    return baseYear + m*5 + t;
}

int main()
{
   for (int i=1900; i<=2100; i++)
    {
      int bY=GetBaseYear(i);
      wchar[] tgdz=YearToTGDZ(i);
      string gzCnv=UNI2GBK(tgdz); //为了让中文字符在控制台正确输出,必须进行转换。为此需要用到excode库。
      int year=TGDZToYear(tgdz,bY);
       writeln(i," -- ",gzCnv, " baseYear: ",bY, " convert back to ",year);
   
   }

return 0;
}
//为了显示中文不乱码搞了好久,最后在vs code中通过RDMD运行成功。2025-5-29

posted @ 2025-05-30 16:33  dingxianghuan  阅读(21)  评论(0)    收藏  举报