Skip to content

Commit

Permalink
Zhao - 1.0.1 版本更新 (#1)
Browse files Browse the repository at this point in the history
* 开始1.0.1版本的开发任务

* 布尔运算表达式组件

* 新增布尔运算表达式计算组件
* 新增函数缓冲池

* 函数模块以及函数表达式解析

* 函数模块以及函数表达式解析的有关功能开始被支持。

* 1.0.1版本上传
  • Loading branch information
BeardedManZhao authored Jun 23, 2023
1 parent ea8f3f7 commit cc8072f
Show file tree
Hide file tree
Showing 65 changed files with 2,466 additions and 1,002 deletions.
11 changes: 10 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,14 @@ add_library(
src/core/manager/CalculationManagement.cpp include/CalculationManagement.h
src/core/calculation/PrefixExpressionOperation.cpp
src/exceptional/MExceptional.cpp include/MExceptional.h
src/utils/NumberUtils.cpp src/utils/StrUtils.cpp src/dataContainer/MEStack.cpp include/MEStack.h include/PrefixExpressionOperation.h src/core/calculation/NumberCalculation.cpp include/NumberCalculation.h src/core/calculation/Calculation.cpp include/Calculation.h include/mathematical_expression.h src/core/calculation/BracketsCalculation.cpp include/BracketsCalculation.h src/core/calculation/BracketsCalculationTwo.cpp include/BracketsCalculationTwo.h src/core/mathematical_expression.cpp src/core/calculation/BooleanCalculation.cpp include/BooleanCalculation.h)
src/utils/NumberUtils.cpp src/utils/StrUtils.cpp src/dataContainer/MEStack.cpp include/MEStack.h include/PrefixExpressionOperation.h
src/core/calculation/NumberCalculation.cpp include/NumberCalculation.h
src/core/calculation/Calculation.cpp include/Calculation.h
src/core/mathematical_expression.cpp include/mathematical_expression.h
src/core/calculation/BracketsCalculation.cpp include/BracketsCalculation.h
src/core/calculation/BracketsCalculationTwo.cpp include/BracketsCalculationTwo.h
src/core/calculation/BooleanCalculation.cpp include/BooleanCalculation.h
src/core/calculation/BooleanCalculationTwo.cpp include/BooleanCalculationTwo.h
src/core/calculation/FunctionManager.cpp include/FunctionManager.h
src/core/calculation/FunctionFormulaCalculation.cpp include/FunctionFormulaCalculation.h src/core/calculation/CalculationConstant.cpp include/CalculationConstant.h src/core/calculation/CumulativeCalculation.cpp include/CumulativeCalculation.h)

216 changes: 214 additions & 2 deletions README-Chinese.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ int main(){

### 无括号表达式

- 类组件:core.calculation.number.PrefixExpressionOperation
- 类组件:ME::PrefixExpressionOperation
- 介绍

针对一个没有括号,但是有加减乘除以及取余等运算操作的数学表达式而设计的组件,该组件可以实现带有优先级计算的功能,其中通过前缀表达式解析计算,将操作数与操作符一同存储到栈,在存储的同时配有计算优先级比较,如果当下的优先级较小,就先将上一个操作数与操作符与当前操作数进行运算,形成一个新的数值,然后再入栈。
Expand Down Expand Up @@ -141,7 +141,7 @@ Active code page: 65001

### 嵌套括号表达式

- 类组件:core.calculation.number.BracketsCalculation2
- 类组件:ME::BracketsCalculation2
- 介绍:

嵌套括号表达式解析组件,能够针对带有多个括号的数学表达式进行解析与结果计算,针对嵌套括号进行优先级的解析与计算,该组件依赖于“core.calculation.number.PrefixExpressionOperation”,在该组件中采用递归进行括号的解析,然后将最内层面的表达式提供给“core.calculation.number.PrefixExpressionOperation”进行计算。
Expand Down Expand Up @@ -180,6 +180,218 @@ Active code page: 65001
进程已结束,退出代码0
```

### 区间累加表达式

- 类组件:ME::CumulativeCalculation
- 介绍

在数学表达式中,往往有这样的一种公式,公式内容如下图所示,可以看到需要进行累加的数列操作,那么在这种公式的需求下,您可以通过上面的类组件去达到您所需要的目的。
![img_1](https://user-images.githubusercontent.com/113756063/201575828-5b76af88-6040-430d-a54c-61faf5905594.png)
- API使用示例

语法层面于其他组件几乎一致,数学表达式的撰写于组件的计算示例就如下面所示,在这里展示的就是一个累加数学公式的计算。

```c++
#include "mathematical_expression.h"
int main() {
system("chcp 65001");
// 创建数学表达式解析库对象
mathematical_expression me;
// 获取一个计算累加数学表达式的组件
ME::CumulativeCalculation cumulativeCalculation = me.getCumulativeCalculation();
// 构建一个数学表达式,这里的"n[1,10,1]"就类似数学中的累加符号,n会在这个区间内不断增加,每增加一次都会被带入公式中计算一次
// 其中[1,10,1]中的最后一个1 代表增加步长,能够实现区间内不同等差值的累加
string s = "n[1,10,1] 2 * (n + 1)";
// 检查数学表达式
cumulativeCalculation.check(s);
// 计算结果
ME::CalculationNumberResults results = cumulativeCalculation << s;
// 将结果打印出来
cout << "计算层数:" << results.getResultLayers() << "\t计算结果:" << results << "\t计算来源:" << results.getCalculationSourceName() << endl;
}
```

- 运行结果

```
Active code page: 65001
计算层数:11 计算结果:130 计算来源:CumulativeCalculation
进程已结束,退出代码0
```

### 函数运算表达式

- 类组件:ME::FunctionFormulaCalculation
- 介绍

针对一些函数的操作,在该框架中也有支持,可以使用上面的类进行这中需要函数的数学表达式的书写,需要注意的是,一切在表达式中使用到的函数都需要在“CalculationManagement”中进行逻辑注册,使得计算的时候可以访问到函数
- API使用示例

```c++
#include <mathematical_expression.h>
#include "FunctionManager.h"
int main() {
system("chcp 65001");
// 准备函数 这里的函数的作用是将参数 * 2
auto myFun = [](const double *v) {
return *v * 2;
};
// 注册函数 将我们的函数注册成为 DoubleValue 的名称
ME::FunctionManager::append("DoubleValue", myFun);
// 构建一个数学表达式,表达式中使用到了函数 DoubleValue
string s = "2 * DoubleValue(2 + 3) + 1";
// 获取到 数学表达式解析库
mathematical_expression me;
// 获取到函数表达式计算组件
auto functionFormulaCalculation = me.getFunctionFormulaCalculation();
// 检查数学表达式
functionFormulaCalculation.check(s);
// 计算出结果
ME::CalculationNumberResults results = functionFormulaCalculation << s;
// 将结果打印出来
cout << "计算层数:" << results.getResultLayers() << "\t计算结果:" << results << "\t计算来源:" << results.getCalculationSourceName() << endl;
}
```

- 运行结果

```
Active code page: 65001
计算层数:1 计算结果:21 计算来源:BracketsCalculation
进程已结束,退出代码0
```

## C++API 特性

在 C++ 中,库具有更快的解析与计算速度,同时其具有更加庞大的功能,接下来针对C++中的特有功能来进行一个说明。

### 操作数之间的计算操作

通过计算组件计算出来的结果对象,其还具有运算功能,可以基于此方式来进行多个操作数之间的计算操作,接下来就是一个示例。

```c++
#include <mathematical_expression.h>

int main() {
// 准备数学表达式对象
mathematical_expression me;
// 打印出数学表达式库的版本号
std::cout << mathematical_expression::getVERSION() << endl;
// 准备要被计算的数学表达式
std::string f = "1 + (3 - 2) + 10";
// 准备计算组件
ME::BracketsCalculationTwo bracketsCalculationTwo = me.getBracketsCalculation2();

// 开始进行计算
ME::CalculationNumberResults res1 = bracketsCalculationTwo << f;
// 使用结果对象进行计算
ME::CalculationNumberResults res2 = res1 + res1;
std::cout << "res1 + res1 = " << res2 << "\t其结果的源 = " << res2.getCalculationSourceName() << endl;
}
```

- 运行结果

```
1.0.1-mathematical_expression-C++
res1 + res1 = 24 其结果的源 = (BracketsCalculation + BracketsCalculation)
进程已结束,退出代码0
```

### 操作数中的别名操作

在经过计算组件计算之后,操作数中包含计算组件的类型名称,但是在C++中,由于有了操作数之间的计算特性,源名称就显得很混乱,因此可以使用下面的操作起别名称,这样就可以达到良好的效果。

接下来是一个有关别名操作的基本示例

```c++
#include <mathematical_expression.h>

int main() {
// 准备数学表达式对象
mathematical_expression me;
// 打印出数学表达式库的版本号
std::cout << mathematical_expression::getVERSION() << endl;
// 准备要被计算的数学表达式
std::string f = "1 + (3 - 2) + 10";
// 准备计算组件
ME::BracketsCalculationTwo bracketsCalculationTwo = me.getBracketsCalculation2();

// 开始进行计算
ME::CalculationNumberResults res1 = bracketsCalculationTwo << f;
// 打印出结果对象的源名称
std::cout << res1.getCalculationSourceName() << endl;
// 为 res1 设置别名
res1.as("res1");
// 再一次打印出结果对象的源名称
std::cout << res1.getCalculationSourceName() << endl;
}
```

- 运行结果

```
1.0.0-mathematical_expression-C++
BracketsCalculation
res1
进程已结束,退出代码0
```

接下来是一个有关别名操作的有趣案例(操作数之间的计算 + 别名)

```c++
#include <mathematical_expression.h>

int main() {
// 准备数学表达式对象
mathematical_expression me;
// 打印出数学表达式库的版本号
std::cout << mathematical_expression::getVERSION() << endl;
// 准备要被计算的数学表达式
std::string f = "1 + (3 - 2) + 10";
// 准备计算组件
ME::BracketsCalculationTwo bracketsCalculationTwo = me.getBracketsCalculation2();

// 开始进行计算
ME::CalculationNumberResults res1 = bracketsCalculationTwo << f;
// 为 res1 设置别名
res1.as("res1");
std::cout << res1 << endl;

// 计算出 res2
ME::CalculationNumberResults res2 = res1 + res1;
// 为 res2 设置别名
res2.as("res2");
std::cout << res2 << endl;
std::cout << res2.getCalculationSourceName() << endl;

// 计算出 res3 在这里使用结果对象之间的运算操作,res3 = res2 - res1
ME::CalculationNumberResults res3 = res2 - res1;
std::cout << '[' << res3 << ']' << '\t' << res3.getCalculationSourceName() << endl;

// 计算出 res4 在这里使用结果对象之间的运算操作,res4 = res3 * res1 = (res2 - res1) * res1
ME::CalculationNumberResults res4 = res3 * res1;
std::cout << '[' << res4 << ']' << '\t' << res4.getCalculationSourceName() << endl;
}
```

- 运行结果

```
1.0.0-mathematical_expression-C++
12
24
res2
[12] (res2 - res1)
[144] ((res2 - res1) * res1)
进程已结束,退出代码0
```

<hr>

更多信息
Expand Down
Loading

0 comments on commit cc8072f

Please sign in to comment.