开发者社区 问答 正文

写了几天的方程式解析,实在是写不出来..有没大神帮忙写一个..:报错

做一个基于CVI的方程式解析产生波形,写了几天,对堆栈实在是不熟悉,然后用if一直写..写出几百行,就是没结果..只能求助大神了..

得到了一个字符串"sin((1*2*3*a)/4)*tan(5*(6+7)*a+0.1)",像计算器一样能解析并算出最终结果,a是个一个变量,用以循环得到一个连续的波形.

我的想法是用if,得到sin以及括号,然后在if得到运算符,然后一直循环下去,但是工程实在是太大,一个错误导致最后结果完全错..

用java或者C++都比用C容易很多啊..用C实在是没办法了,只能求助大神了..

展开
收起
kun坤 2020-06-14 09:06:14 444 分享 版权
阿里云 AI 助理回答

理解您在处理字符串解析和计算时遇到的挑战,特别是在C语言中手动实现这样的功能确实可能变得复杂。不过,不用担心,这里有一个简化问题的方法,并且推荐使用一些现成的库来帮助您更高效地完成任务。

使用现有的数学表达式解析库

对于您的需求,一个很好的解决方案是利用已有的数学表达式解析库,这样可以避免手动编写复杂的解析逻辑。在C/C++中,有几个库可以帮助您:

  1. muParser: 这是一个轻量级、高性能的数学表达式解析器库,支持多种函数(包括sin, cos, tan等)和变量。您可以定义变量(如'a'),然后让库来解析并计算表达式的值。

    • 官网: http://muparser.sourceforge.net/
    • 示例代码:

      #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
      
  2. exprtk: 另一个强大的C++表达式模板库,它允许你直接从字符串中解析和计算数学表达式。

    • GitHub: https://github.com/ArashPartow/exprtk
    • 使用方法类似,也是通过定义变量、设置表达式和求值的过程。

如果坚持使用原生C语言

如果您仍然希望在不使用外部库的情况下进行尝试,那么建议采用递归下降解析或使用状态机来解析表达式。但请注意,这将涉及较深的编译原理知识,且代码会相当复杂。以下是一个简化的思路:

  • 分词(Tokenizing): 首先,将输入字符串分割成操作数(数字、变量)、运算符(+、-、*、/、sin、cos等)和括号。
  • 构建抽象语法树(AST): 根据分词结果,构建一个表示数学表达式的树结构。每个节点代表一个操作(如sin函数调用、乘法、加法等),叶子节点是操作数。
  • 遍历AST计算结果: 递归遍历抽象语法树,根据节点类型执行相应的计算操作。

这个过程比较复杂,特别是处理优先级和结合律,因此强烈建议使用上述提到的库来简化工作。

希望这些建议对您有所帮助!如果决定采用库方案,记得查看它们的文档以了解如何正确集成和使用。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: