mathematical-expression-cpp | C++ 数学表达式解析库

image 数学表达式-cpp

  • Switch to English Document

介绍

本框架是一种针对数学公式解析的有效工具,能够通过C++的API解析包含嵌套函数,包含函数,数列步长累加等数学公式,返回值是一个数值的结果对象,同时也可以进行比较运算的操作,再进行比较的时候,返回值是一个布尔值结果对象。
如果您是一位 Java 或 python爱好者,可以专门前往 JavaAPI
或 PythonAPI 中进行相关资料的查阅。

如何在 Windows 中使用库?

我们已经预编译好了 Windows 版本的DLL,在项目中有一个 include
文件目录,其中存储的就是库需要的所有头文件,您可以将其中的库文件导入到您的项目中,然后再集成本框架编译好的dll,下面是cmake的配置文件实例。

cmake_minimum_required(VERSION 3.23)
project(MyCpp)set(CMAKE_CXX_STANDARD 14)# 设置头文件目录(可以自定义)
include_directories(${PROJECT_SOURCE_DIR}/head)
add_executable(MyCpp main.cpp)
# 与项目进行链接(将库链接到编译之后的目标中)
target_link_libraries(${PROJECT_NAME} D:\\liming\\Project\\Clion\\MyCpp\\cmake-build-debug\\mathematical_expression_cpp.dll)

集成操作完毕之后,您可以尝试输入以下代码来判断库的功能是否正常,下面是该库的一个测试代码,如果其运行之后的程序main函数返回值为0
代表程序正常退出,意味着库装载完毕。

#include "mathematical_expression.h"int main(){system("chcp 65001");// 打印 mathematical_expression 的版本信息cout << mathematical_expression::getVERSION() << endl;
}

如何在 Linux 中使用库?

针对 Linux 系统的多样性,我们难以提供一种符合大部分系统架构的 dll
库文件,但是您无需担心,此库没有任何的第三方依赖,仅仅运行于本地库中,这对于它的源码编译工作来说是一个好消息,您可以访问我们写好的《在 Linux 环境中编译 C++ 源码》
,根据文章的引导来进行编译工作。
当然,您也可以通过扫描二维码来阅读文章,这对于一些操作会更加简单。
在这里插入图片描述

通过 mathematical-expression 库直接获取到计算组件并进行计算

#include "mathematical_expression.h"int main(){system("chcp 65001");// 构建需要计算的两种表达式string s1 = "1 + 20 - 2 + 4", s2 = "1 + 20 - (2 + 4)";// 获取到 me 门户类mathematical_expression me;// 获取到 无括号表达式计算组件ME::PrefixExpressionOperation prefixExpressionOperation = me.getPrefixExpressionOperation();// 获取到 有括号表达式计算组件ME::BracketsCalculationTwo bracketsCalculationTwo = me.getBracketsCalculation2();// 开始检查表达式prefixExpressionOperation.check(s1);bracketsCalculationTwo.check(s2);// 开始计算两个表达式 可以使用左移运算符将表达式送给计算组件 获取到结果对象ME::CalculationNumberResults r1 = prefixExpressionOperation << s1;ME::CalculationNumberResults r2 = bracketsCalculationTwo << s2;// 开始进行结果查看cout << "计算层数:" << r1.getResultLayers() << "\t计算结果:" << r1 << "\t计算来源:" << r1.getCalculationSourceName() << endl;cout << "计算层数:" << r1.getResultLayers() << "\t计算结果:" << r2 << "\t计算来源:" << r1.getCalculationSourceName() << endl;
}
  • 运行结果
Active code page: 65001
计算层数:1     计算结果:23    计算来源:PrefixExpressionOperation
计算层数:1     计算结果:15    计算来源:PrefixExpressionOperation进程已结束,退出代码0

框架架构

门户类

我们可以通过指定的门户类对象获取到相关的各个计算组件,这里与 JavaAPI 和 PythonAPI 的实现有些不同,这里是使用的get函数获取到指定计算组件对象,而非使用
Hash 缓冲池。

#include "mathematical_expression.h"int main(){system("chcp 65001");// 获取到 me 门户类mathematical_expression me;// 获取到 无括号表达式计算组件ME::PrefixExpressionOperation prefixExpressionOperation = me.getPrefixExpressionOperation();// 获取到 有括号表达式计算组件ME::BracketsCalculationTwo bracketsCalculationTwo = me.getBracketsCalculation2();
}

计算组件

无括号表达式

  • 类组件:ME::PrefixExpressionOperation

  • 介绍

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

  • API使用示例

    该组件支持的运算符有: a+b a-b a*b a/b a%b a^b

#include "mathematical_expression.h"int main(){system("chcp 65001");// 获取到 me 门户类mathematical_expression me;// 获取到 无括号表达式计算组件ME::PrefixExpressionOperation prefixExpressionOperation = me.getPrefixExpressionOperation();// 构建一个表达式string s = "1 + 2 + 4 * 10 - 3";// 开始检查表达式prefixExpressionOperation.check(s);// 开始计算两个表达式 可以使用左移运算符将表达式送给计算组件 获取到结果对象ME::CalculationNumberResults r1 = prefixExpressionOperation << s;// 开始进行结果查看cout << "计算层数:" << r1.getResultLayers() << "\t计算结果:" << r1 << "\t计算来源:" << r1.getCalculationSourceName() << endl;
}
  • 运行结果

    在API调用中,对函数的运行结果进行了打印,可以看到,组件计算的返回值是一个结果集对象,在该对象中存储的就是很多有关计算结果相关的信息。

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

嵌套括号表达式

  • 类组件:ME::BracketsCalculation2

  • 介绍:

    嵌套括号表达式解析组件,能够针对带有多个括号的数学表达式进行解析与结果计算,针对嵌套括号进行优先级的解析与计算,该组件依赖于“core.calculation.number.PrefixExpressionOperation”,在该组件中采用递归进行括号的解析,然后将最内层面的表达式提供给“core.calculation.number.PrefixExpressionOperation”进行计算。

  • API使用示例

    该组件支持的运算符有: a+b a-b a*b a/b a%b ( )

#include "mathematical_expression.h"int main(){system("chcp 65001");// 获取到 me 门户类mathematical_expression me;// 获取到 无括号表达式计算组件ME::BracketsCalculationTwo bracketsCalculationTwo = me.getBracketsCalculation2();// 构建一个表达式string s = "1 + 2 + 4 * (10 - 3)";// 开始检查表达式bracketsCalculationTwo.check(s);// 开始计算两个表达式 可以使用左移运算符将表达式送给计算组件 获取到结果对象ME::CalculationNumberResults r1 = bracketsCalculationTwo << s;// 开始进行结果查看cout << "计算层数:" << r1.getResultLayers() << "\t计算结果:" << r1 << "\t计算来源:" << r1.getCalculationSourceName() << endl;
}
  • 运行结果

    在API调用中,对表达式的计算结果进行了打印,可以看到,组件计算的返回值是一个数值结果对象,在该对象中存储的就是很多有关计算结果相关的信息。

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

区间累加表达式

  • 类组件:ME::CumulativeCalculation

  • 介绍

    在数学表达式中,往往有这样的一种公式,公式内容如下图所示,可以看到需要进行累加的数列操作,那么在这种公式的需求下,您可以通过上面的类组件去达到您所需要的目的。
    img_1

  • API使用示例

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

#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使用示例

#include <mathematical_expression.h>
#include "FunctionManager.h"
int main() {system("chcp 65001");// 准备函数 这里的函数的作用是将参数 * 2auto myFun = [](const double *v) {return *v * 2;};// 注册函数 将我们的函数注册成为 DoubleValue 的名称ME::FunctionManager::append("DoubleValue", myFun);// 构建一个数学表达式,表达式中使用到了函数 DoubleValuestring 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
注意事项

1.0.2 版本中 针对函数的注册操作不能向后兼容,如果是在1.0.2版本以以后的版本 请使用下面的方式注册函数

    // 准备函数 将函数的形参类型 由 double* 更改为 ME::MEStack<double> 即可 因为 ME::MEStack<double> 具有更大的灵活性
auto myFun =[](const ME::MEStack<double>& v) {
double res = 0;
for (int i = 0; i < v.size(); ++i){
res += v.get(i);
}
return res;
};
// 注册函数 将我们的函数注册成为 DoubleValue 的名称
ME::FunctionManager::append("sum", myFun);

函数多参数运算表达式

  • 类组件:ME::FunctionFormulaCalculationTwo
  • 介绍

针对一些在表达式中使用了函数的表达式计算,可以使用上面的类进行操作,它是“core.calculation.number.FunctionFormulaCalculation”类的升级版,从1.0.2版本开始出现,同时也是它的一个子类拓展实现。

相较于父类,本组件弥补了父类只能解析带有一个参数函数表达式的不足,在该组件中,可以使用很多的实参进行函数的运算,例如sum(
1,2,3) 这类函数,就是一个多参函数,接下来请看API的使用示例,在此示例中,展示了多惨函数表达式的计算与结果。

  • API使用示例
#include <mathematical_expression.h>
#include "FunctionManager.h"
int main() {system("chcp 65001");// 准备函数 这里的函数的作用是将 3 个参数求和auto myFun = [](const ME::MEStack<double>& v) {double res = 0;for (int i = 0; i < v.size(); ++i){res += v.get(i);}return res;};// 注册函数 将我们的函数注册成为 DoubleValue 的名称ME::FunctionManager::append("sum", myFun);// 构建一个数学表达式,表达式中使用到了函数 DoubleValuestring s = "2 * sum(2 + 3, 1 + 20, 10 + (1 - 2)) + 1";// 获取到 数学表达式解析库mathematical_expression me;// 获取到函数表达式计算组件auto functionFormulaCalculation = me.getFunctionFormulaCalculation2();// 检查数学表达式functionFormulaCalculation.check(s);// 计算出结果ME::CalculationNumberResults results = functionFormulaCalculation << s;// 将结果打印出来cout << "计算层数:" << results.getResultLayers() << "\t计算结果:" << results << "\t计算来源:" << results.getCalculationSourceName() << endl;
}
  • 运行结果
Active code page: 65001
计算层数:1     计算结果:71    计算来源:BracketsCalculation进程已结束,退出代码0

快速区间求和计算组件(基于括号表达式)

  • 类组件:ME::FastSumOfIntervalsBrackets.py

  • 介绍

    1.15版本的新产物,区间快速求和组件,是针对一个等差为1的区间进行所有元素求和的快速组件,它将一个区间在逻辑上模拟成为一个数学数列,并通过求和公式进行快速的求和。

    该组件实现了共享池计算功能,将检查,计算,以及上一次结果记录实现,能够加快计算速度,具体API调用如下所示。

#include "mathematical_expression.h"int main() {system("chcp 65001");// 获取到数学表达式解析库对象mathematical_expression me;// 获取到区间累加表达式对象ME::FastSumOfIntervalsBrackets fastSumOfIntervalsBrackets = me.getFastSumOfIntervalsBrackets();// 准备需要被计算的数学表达式,这里的数学表达式中有个逗号,逗号两边代表的就是区间的两个边界string f1 = "1 + 10, 20 - (5 + 2)";// 检查数学表达式fastSumOfIntervalsBrackets.check(f1);// 将步长修改为 2fastSumOfIntervalsBrackets.step = 2;// 开始计算 并获取到结果对象ME::CalculationNumberResults r1 = fastSumOfIntervalsBrackets << f1;// 开始进行结果查看cout << "计算层数:" << r1.getResultLayers() << "\t计算结果:" << r1 << "\t计算来源:" << r1.getCalculationSourceName()<< endl;
}
  • 运行结果 从上面代码中我们可以看到,快速区间求和计算的公式由被逗号分割的两个括号表达式组成
Active code page: 65001
计算层数:1     计算结果:24    计算来源:FastSumOfIntervalsBrackets进程已结束,退出代码0

数学函数表达式的注册与使用

#include <mathematical_expression.h>
#include "FunctionManager.h"
#include "ExpressionFunction.h"
#include "MEStack.h"int main() {system("chcp 65001");// 这里的函数的作用是将 3 个参数求和// 注册函数 将我们的函数注册成为 DoubleValue 的名称ME::FunctionManager::append("sum(a,b,c) = a + b + c");// 构建一个数学表达式,表达式中使用到了函数 DoubleValuestring s = "2 * sum(2 + 3, 1 + 20, 10 + (1 - 2)) + 1";// 获取到 数学表达式解析库mathematical_expression me;cout << "开始计算" << endl;// 获取到函数表达式计算组件auto functionFormulaCalculation = me.getFunctionFormulaCalculation2();// 检查数学表达式functionFormulaCalculation.check(s);// 计算出结果ME::CalculationNumberResults results = functionFormulaCalculation << s;// 将结果打印出来cout << "计算层数:" << results.getResultLayers() << "\t计算结果:" << results << "\t计算来源:"<< results.getCalculationSourceName() << endl;// 也可以手动获取到函数对象auto f = ME::FunctionManager::getFunction("sum");ME::MEStack<double> meStack;meStack.push(1);meStack.push(2);meStack.push(3);cout << f(meStack) << endl;
}

C++API 特性

在 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++中,由于有了操作数之间的计算特性,源名称就显得很混乱,因此可以使用下面的操作起别名称,这样就可以达到良好的效果。

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

#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

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

#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;// 计算出 res2ME::CalculationNumberResults res2 = res1 + res1;// 为 res2 设置别名res2.as("res2");std::cout << res2 << endl;std::cout << res2.getCalculationSourceName() << endl;// 计算出 res3 在这里使用结果对象之间的运算操作,res3 = res2 - res1ME::CalculationNumberResults res3 = res2 - res1;std::cout << '[' << res3  << ']' << '\t' << res3.getCalculationSourceName() << endl;// 计算出 res4 在这里使用结果对象之间的运算操作,res4 = res3 * res1 = (res2 - res1) * res1ME::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

更多信息

  • date: 2023-06-20
  • Switch to English Document
  • mathematical-expression-Java
  • mathematical-expression-py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程&#xff0c;没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程&#xff0c;目的是写一下别的技术功能。 原先目录结构&#xff0c;ServicesTest是空的工程&#xff0c;没有pom文件。下面的几个模块是新的工程&#xff0c;相互独立。 1.…

LLM大模型的挑战与未来,挑战大但是机遇更大!

大模型必然是未来很长一段时间我们工作生活的一部分&#xff0c;而对于这样一个与我们生活高度同频互动的“大家伙”&#xff0c;除了性能、效率、成本等问题外&#xff0c;大规模语言模型的安全问题几乎是大模型所面对的所有挑战之中的重中之重&#xff0c;机器幻觉是大模型目…

C++ (week6、7):Linux系统编程4:网络

文章目录 四、网络和网络编程(一) 网络协议1.基础概念2.网络协议和网络模型&#xff1a;OSI七层模型、TCP/IP四层协议3.TCP协议(1)TCP协议的特点(2)TCP协议的首部格式(3)TCP状态图(4)为什么要三次握手&#xff1f;2次行不行&#xff1f;(5)为什么要四次挥手&#xff1f;(6)快速…

软件测试分类介绍

大家好&#xff0c;软件测试是确保软件质量的关键环节之一&#xff0c;通过对软件系统的各个方面进行测试&#xff0c;可以发现和解决潜在的问题&#xff0c;提高软件的稳定性、可靠性和用户满意度。在软件测试领域&#xff0c;根据测试的目的、方法和对象的不同&#xff0c;可…

Python业务规则引擎库之rules使用详解

概要 在软件开发中,业务规则引擎是一种重要的工具,可以帮助开发者将复杂的业务逻辑从代码中解耦出来,并以更直观的方式进行管理和维护。rules 是一个轻量级的 Python 库,专门用于定义和执行业务规则。它提供了一种简洁且强大的方式来管理应用程序中的规则逻辑,使代码更加…

C++ 引用 - 引用的特点|在优化程序上的作用

引用是C 的一个别名机制&#xff0c;所谓别名&#xff0c;就是同一块内存共用多个名字&#xff0c;每个名字都指的是这片空间&#xff0c;通过这些别名都能访问到同样的一块空间。 就像鲁迅和周树人是同一个人。 ——鲁迅 一、引用的基本用法 int a 10; int& ref a; // …

Django序列化器详解:普通序列化器与模型序列化器的选择与运用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

充电桩出口:跨国贸易的机遇与挑战之旅

在新能源浪潮席卷全球的今天&#xff0c;充电桩作为电动汽车的“加油站”&#xff0c;正逐渐从幕后走向台前。 而在这场跨国贸易的舞台上&#xff0c;充电桩的出口之路&#xff0c;既充满了诱人的机遇&#xff0c;也伴随着不小的挑战。 机遇&#xff0c;源自日益增长的全球市场…

免费听歌,电脑或手机免费听歌,落雪音乐安装详细步骤

近年来&#xff0c;由于资本的力量导致各种收费&#xff0c;看个电视想听歌都必须要付费了&#xff0c;否则你听不完整&#xff0c;吃相非常难看&#xff0c;特别是电视&#xff0c;吸血鬼式吸收各种会员费&#xff0c;各种APP也是铺天盖地的广告&#xff0c;渐渐迷失了自我&am…

两个螺旋面的交线

已知轴截面齿形&#xff0c;先得到螺旋面 然后在计算出对应的端面齿形 在用端面齿形来计算和另一个螺旋面的相交曲线。 三维验证这个方法可行&#xff01;

喜大普奔,AI绘画SD3终于开源了,AI绘画又添新利器!【附模型下载和安装包】

sd3终于开源了&#xff01; 没错就是stablediffusion 3.0版本&#xff01;这是stability迄今为止最先进最复杂图像生成模型。 这次开源的是medium版本&#xff0c;总共有三个型号的模型&#xff0c;下面我们来详细的说下sd3的功能特点以及不同型号区别、安装方法&#xff01;…

HTML静态网页成品作业(HTML+CSS)—— 家乡山西介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代…

专业设计师推荐的20条用户体验设计黄金准则

在当今的数字世界中&#xff0c;用户体验设计已经成为商业成功的关键因素。它可以实现或摧毁一个产品。今天&#xff0c;我们将讨论该领域的20个基本原则。这些用户体验设计原则不仅被顶级工厂设计师广泛使用&#xff0c;而且为您在设计过程中提供有价值的指导。 1. 以用户为中…

共绘财富与时间画卷,ATFX携手Haofa腕表,开启跨界新篇章

在当前激烈的市场竞争中&#xff0c;品牌创新和多元化、本地化发展已成为企业突破重围&#xff0c;赢得用户和市场份额的关键。作为差价合约行业领军品牌&#xff0c;ATFX勇于突破自我&#xff0c;为探索更多的市场可能性&#xff0c;通过跨界合作、联合营销的策略&#xff0c;…

物联网概念

物联网 物联网简介物联网体系结构物联网体系结构定义物联网体系结构设计原则物联网体系结构四层物联网体系结构感知控制层数据传输层数据处理层应用决策层 物联网关键技术感知标识技术网络与通信技术云计算技术安全技术 已有物联网相关应用架构无线传感器网络的体系结构EPC/UID…

同三维T80005JEHVA 4K视频解码器

同三维T80005JEHVA视频解码器 可解1路4K30HDMI/VGA/CVBS1路3.5音频 可解电台音频网络流&#xff0c;可同时解4个网络流&#xff0c;分割输出 可预设十个流&#xff0c;任意切换1路流输出 <!--[endif]----><!--[if !vml]--> <!--![endif]----> 介绍&…

逆向分析-Ollydbg动态跟踪Ransomware.exe恶意锁机程序

1.认识Ollydbg Ollydbg是一个新的动态追踪工具&#xff0c;将IDA与SoftICE结合起来的思想&#xff0c;Ring 3级调试器&#xff0c;非常容易上手&#xff0c;己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能&#xff0c;是目前最强大的调试工具。 Oll…

Java——面向对象进阶(二)

前言&#xff1a; 多态&#xff0c;包&#xff0c;final关键字&#xff0c;权限修饰符和代码块 文章目录 一、多态1.1 概念1.2 多态存在条件1.3 多态中调用成员的特点1.4 instanceof关键字 二、包三、权限修饰符四、final 关键字4.1 修饰类4.2 修饰方法4.3 修饰变量 五、代码块…

PHP开发的爱情盲盒交友系统网站源码

源码介绍 PHP开发的爱情盲盒交友系统网站源码 独立后台 源码截图 源码下载 PHP开发的爱情盲盒交友系统网站源码

CV预测:快速使用LeNet-5卷积神经网络

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…