int() 取整與 round() 四捨五入函數3*-2, 5--3)採用「逐層化簡」遞歸策略,依優先序處理:
[]{} → (),移除空白。round(x, n) 與 int(x),替換為數值。* / 運算子,計算左右運算元並替換,處理連續乘除與負號。+ -,同樣支援負數運算元。if (sExp.SubString(pos, 2) == "*-" || sExp.SubString(pos, 2) == "/-")
{
sExp.Delete(pos + 1, 1); // 移除負號
IsMinus = !IsMinus; // 翻轉符號旗標
goto Minus0; // 重新掃描右運算元
}
利用 goto 實現狀態回溯,簡潔解決連續負號 (如 3*- -2) 問題。
if (sExp.IsDelimiter("/", pos) && sR == "0")
return "error:除數為零,無意義!";
AnsiString result = Calc("round(3.14159, 2) + int(-5.6) * (2 + 3)");
// 回傳 "3.14 + (-5) * 5 = -21.86"
AnsiString (C++Builder) 與 pow, floor 需連結數學庫若需高效能或擴充性,建議改用「語法分析器 + AST」架構 (如 Shunting-yard 演算法生成逆波蘭式)。