首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

四則混合運算表達式遞歸計算器 (第二版) 完整實現與解析

     編輯:VC 教學

功能特性

  • 支援 + - * / 四則運算與括號巢狀
  • 支援 int() 取整與 round() 四捨五入函數
  • 正確處理負數運算元 (如 3*-2, 5--3)
  • 錯誤偵測:除零、括號不匹配、運算元缺失、語法錯誤
  • 忽略空白字元,大小寫不敏感

核心演算法架構

採用「逐層化簡」遞歸策略,依優先序處理:

  1. 預處理:統一括號符號 []{} → (),移除空白。
  2. 函數展開:遞歸計算 round(x, n) 與 int(x),替換為數值。
  3. 括號消除:由內而外遞歸計算最內層括號內表達式。
  4. 乘除優先:掃描 * / 運算子,計算左右運算元並替換,處理連續乘除與負號。
  5. 加減運算:處理剩餘 + -,同樣支援負數運算元。

關鍵程式碼片段解析

負數運算元處理 (以乘除為例)

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"

效能與限制

  • 字串操作導致 O(n²) 時間複雜度,適合短表達式 ( < 1KB )
  • 使用 AnsiString (C++Builder) 與 pow, floor 需連結數學庫
  • 不支援變數、自訂函數、位元運算

若需高效能或擴充性,建議改用「語法分析器 + AST」架構 (如 Shunting-yard 演算法生成逆波蘭式)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved