这段内容由外国开发者编写,提供了一个用于解析和计算C++表达式的类库及一个简单的命令行计算器程序,包含完整的源代码。
老外写的表达式求值封装类可以计算三角函数、反三角函数以及普通公式等等。代码易于修改且适合扩展,支持参数重新赋值进行计算等功能。
以下是该库的使用示例:
```cpp
#include Express.h
#include ExpValue.h
#include VarValue.h
int main() {
// 表达式字符串
std::string strExpress = sin(A)*(3+B)-4/cos(C)*PI;
CMapVariabile m_VarsMap;
CExpression m_expression;
// 初始化变量哈希表并绑定表达式对象与变量映射
m_VarsMap.InitHashTable(100);
m_expression.AtachVariables(&m_VarsMap);
// 参数赋值
CNumericValue *value = nullptr;
value = new CNumericValue();
value->SetValue(12.22);
m_VarsMap[_T(A)] = value;
value = new CNumericValue();
value->SetValue(13.44);
m_VarsMap[_T(B)] = value;
value = new CNumericValue();
value->SetValue(567.987);
m_VarsMap[_T(C)] = value;
value = new CNumericValue();
value->SetValue(3.1415926);
m_VarsMap[_T(PI)] = value;
double dValue = 0;
int result = m_expression.ChangeExpression(strExpress.c_str());
if (result < 0) {
long res_val = m_expression.Value(dValue);
if(res_val == DIVISION_BY_0) { // 如果出现除零错误
printf(亲,除零了.....-_-!\r\n);
} else {
printf(%s=%.2f\r\n, strExpress.c_str(), dValue);
}
}
// 清理变量映射中的所有值并移除它们
POSITION pos = m_VarsMap.GetStartPosition();
while (pos != nullptr) {
CString sName;
CValue *pVal;
m_VarsMap.GetNextAssoc(pos, sName, pVal);
delete pVal; // 清理内存
}
m_VarsMap.RemoveAll();
}
```