【问题标题】:Android with Math Parser带有数学解析器的 Android
【发布时间】:2017-04-18 21:07:01
【问题描述】:

我的 Android 程序有问题。我使用 mxparser 作为我的数学解析器。我将它添加到我的库中。使用此程序键入程序后没有显示错误,但是当我在运行时单击某个按钮时程序出现错误。我多次尝试调试它,我确信错误来自解析器。有什么想法吗?

  private OnClickListener ButtonClicked= new OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
        Function f = new Function("f(x) = "+funcText.getText().toString());
        Expression xlexp = new Expression("f("+xlText.getText().toString()+")",f);
        Expression xuexp = new Expression("f("+xuText.getText().toString()+")",f);
        double c = xlexp.calculate();
        double d = xuexp.calculate();
        String xlString = String.valueOf(c);
        String xuString = String.valueOf(d);
        fxlText.setText(xlString);
        fxuText.setText(xuString);

    }

    };

更新:

These are my inputs

这是错误信息(我认为是 xD)

感谢 LutzL 一直关注我 :D

更新2:

我编辑了代码:

private OnClickListener ButtonClicked= new OnClickListener()
{
@Override
public void onClick(View v)
{
    xlText.getText();
    xuText.getText();

    String firstString=xlText.getText().toString();
    String secondString=xuText.getText().toString();
    double xl = Double.parseDouble(firstString);
    double xu = Double.parseDouble(secondString);

double f=2*xl+1;
double f2=2*xu+1;
String xlstring = String.valueOf(f);
String xustring = String.valueOf(f2);

    fxlText.setText(xlstring);
    fxuText.setText(xustring);

}

};

这是有效的。在这段代码中,我得到了 xl 和 xu 的值,然后将其插入到我创建的函数中(2*x+1)。但我需要的是一个代码,它也可以从用户那里获得功能。这就是我使用 mxparser 的原因。

更新3:

我开始调试它并this shows(未找到源)。不知道是什么意思。任何想法? :(

【问题讨论】:

  • 发布您的堆栈跟踪
  • 删除多余的转换。 .getText() 已经是字符串,无需转换为字符串。您还可以使用fxlText.setText(c),因为编译器会自动插入对Double.toString(c) 的调用以获取预期的String 参数。这与允许您使用的机制相同,例如,println("c= "+c)
  • 对不起。今天刚开始学安卓。我有点不明白你说的并这样做。它仍然会出错:(@LutzL
  • 您究竟使用什么作为输入字符串?错误信息是什么,请将其粘贴到您的问题中。 -- 你可以忽略我的风格提示,因为它们不会影响错误。请不要在 cmets 中发布对您问题的更新,直接编辑您的问题,如果代码没有改变错误情况,请替换您的代码,或者如果它改变了错误,请添加一个包含新代码的部分。
  • 如果你能提供一个最小的完整工作代码,这对你和我们也会有帮助,比如` ... main() { String funcTextStr =" ... ", xlTextStr = “……”; ...` 并输出到控制台并报告结果输出,包括。错误信息,如果有的话。 -- 相反,从onClick 方法中删除mxmath 调用,只需将字符串一起粘贴到输出文本字段中而不评估任何数学,这应该显示错误是在mxmath 还是在GUI 构造中。

标签: java android parsing math


【解决方案1】:

这篇文章发表已经三年了。你可以使用开源的ParserNG

它支持算术运算、方程求解、微积分、积分、基本统计、函数/公式定义,可用于绘图等。

评估一个表达式很简单:

    MathExpression expr = new MathExpression("(34+32)-44/(8+9(3+2))-22"); 
    System.out.println("result: " + expr.solve());

    result: 43.16981132075472

或者使用变量和计算简单的表达式:

 MathExpression expr = new MathExpression("r=3;P=2*pi*r;"); 
System.out.println("result: " + expr.getValue("P"));

或者使用函数:

MathExpression expr = new MathExpression("f(x)=39*sin(x^2)+x^3*cos(x);f(3)"); 
System.out.println("result: " + expr.solve());

result: -10.65717648378352

或评估给定点的导数(注意它在幕后进行符号微分(不是数值),因此准确性不受数值近似误差的限制):

MathExpression expr = new MathExpression("f(x)=x^3*ln(x); diff(f,3,1)"); 
System.out.println("result: " + expr.solve());

 result: 38.66253179403897

在 x=3 时区分 x^3 * ln(x) 一次。 你现在可以区分的次数是 1。

或数值积分:

MathExpression expr = new MathExpression("f(x)=2*x; intg(f,1,3)"); 
System.out.println("result: " + expr.solve());

result: 7.999999999998261... approx: 8

此解析器速度相当快,并且具有许多其他功能。

通过绑定到 Objective C 将其移植到 Swift 的工作已经结束。

更新

由于 cmets 中的请求,我创建了 Android 端口作为您项目的简单依赖项。

你可以得到那个here

或者只是将它添加到存储库末尾的根 build.gradle 中:

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

同时添加到您应用的 build.gradle 文件中,在您的依赖项下,添加:

dependencies {
            implementation 'com.github.gbenroscience:parserng-android:0.1.1'

    }

免责声明:ParserNG 由我创作。

【讨论】:

猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 2011-04-25
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2010-09-11
  • 1970-01-01
相关资源
最近更新 更多