做一个基于CVI的方程式解析产生波形,写了几天,对堆栈实在是不熟悉,然后用if一直写..写出几百行,就是没结果..只能求助大神了..
得到了一个字符串"sin((1*2*3*a)/4)*tan(5*(6+7)*a+0.1)",像计算器一样能解析并算出最终结果,a是个一个变量,用以循环得到一个连续的波形.
我的想法是用if,得到sin以及括号,然后在if得到运算符,然后一直循环下去,但是工程实在是太大,一个错误导致最后结果完全错..
用java或者C++都比用C容易很多啊..用C实在是没办法了,只能求助大神了..
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
理解您在处理字符串解析和计算时遇到的挑战,特别是在C语言中手动实现这样的功能确实可能变得复杂。不过,不用担心,这里有一个简化问题的方法,并且推荐使用一些现成的库来帮助您更高效地完成任务。
对于您的需求,一个很好的解决方案是利用已有的数学表达式解析库,这样可以避免手动编写复杂的解析逻辑。在C/C++中,有几个库可以帮助您:
muParser: 这是一个轻量级、高性能的数学表达式解析器库,支持多种函数(包括sin, cos, tan等)和变量。您可以定义变量(如'a'),然后让库来解析并计算表达式的值。
示例代码:
#include "mparser.h"
using namespace mu;
double a = 0.5; // Your variable
Parser p;
p.DefineVar("a", &a); // Define the variable 'a'
p.SetExpr("sin((1*2*3*a)/4)*tan(5*(6+7)*a+0.1)"); // Set your expression
double result = p.Eval(); // Evaluate the expression
exprtk: 另一个强大的C++表达式模板库,它允许你直接从字符串中解析和计算数学表达式。
如果您仍然希望在不使用外部库的情况下进行尝试,那么建议采用递归下降解析或使用状态机来解析表达式。但请注意,这将涉及较深的编译原理知识,且代码会相当复杂。以下是一个简化的思路:
这个过程比较复杂,特别是处理优先级和结合律,因此强烈建议使用上述提到的库来简化工作。
希望这些建议对您有所帮助!如果决定采用库方案,记得查看它们的文档以了解如何正确集成和使用。