TGDZCalc by Maple function

Maple与Mathmatica的用法有点类似,浅学一下不太困难.
它用小圆括号来包括函数参数,这一点比较好.但在工作表模式下,我的输入法有了点问题,不能输入中文,只好复制粘贴进来.
Maple中的中文字符是3个字节大小,可能用的是UTF-8的表示方式,因此查询字串长度与截取字串时要注意一下转换,但总的来说,与以前见过的其它语言一样处理即可.
用proc定义函数即可,最后一个变量的值就是返回值.

点击查看代码
getBaseYear := proc(y) 
local b; 
if 0 < y then b := 4;
 else 
 b := -3;
  end if; 
  while y < b do 
  b := b - 60;
   end do; 
 while b + 60 <= y do
  b := b + 60;
   end do; 
 end proc

YearToTGDZ := proc(year)
 local y, m, t, d, tgArr, dzArr; 
 tgArr := "甲乙丙丁戊已庚辛壬癸"; 
 dzArr := "子丑寅卯辰已午未申酉戌亥"; 
 y := year; 
 if 0 < y then y := y - 4; 
 else y := y - 3; 
 end if; 
 
 while y < 0 do y := y + 60; end do;
  t := y mod 10; 
  d := y mod 12; 
  cat(substring(tgArr, 3*t + 1 .. 3*t + 3), substring(dzArr, 3*d + 1 .. 3*d + 3)); 
end proc

TGDZToYear := proc(tgdz, bY) 
local tg, dz, ti, di, m, tgArr, dzArr;
 tgArr := "甲乙丙丁戊已庚辛壬癸"; 
 dzArr := "子丑寅卯辰已午未申酉戌亥"; 
 tg := substring(tgdz, 1 .. 3); 
 dz := substring(tgdz, 4 .. 6); 
 ti := 1/3*searchtext(tg, tgArr) - 1/3; 
 di := 1/3*searchtext(dz, dzArr) - 1/3; 
 m := ti - di; 
 if m < 0 then m := 12 + m; end if;
  bY + 5*m + ti; 
end proc


test:=proc(startY,endY) 
 local bYear,tgdz,year,i;
 for i from startY to endY do
  bYear:=getBaseYear(i);
  tgdz:=YearToTGDZ(i);
  year:=TGDZToYear(tgdz,bYear);
  print(i," ",tgdz," ",bYear," ", year)
  end do;
  end proc
#在 Maple 工作表模式下测试通过.2025-6-1

posted @ 2025-06-01 23:27  dingxianghuan  阅读(18)  评论(0)    收藏  举报