0

数学関数とx(a、b)の範囲を取得して、そのグラフを表示したい小さなアプリケーションに取り組んでいます。

ある時点で、xの関数を実行するメソッドを呼び出します。私はTextFieldから関数(例:f(x)= 2 * x + 1)を取得し、それをJavaコードとして使用するという点でスタックしています

まあ言ってみれば:

class Myclass extends JFrame{
    blah blah ...
    JLabel lblFx =new JLebel("f(x=)");
    JTextfield Fx = new JTextField();

    //and lets say that this method calculate the f(x).
    //get as argument the x
    double calculateFx(double x){
        return  2*x+1; // !!!!BUT HERE I WANT TO GET THIS 2*x+1 FROM TextField!!!!!
    }

}

何か案が?

4

3 に答える 3

5

ScriptEngineを使用できます。以下の例を参照してください。これは、JTextFieldのコンテンツを使用するように適応させることができます。

注:"2x+1"は有効な式ではありません。すべての演算子を含める必要があるため、この場合は次のようになります"2*x+1"

public static void main(String[] args) throws ScriptException {
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");

    String formula = "2 * x + 1"; //contained in your jtextfield

    for (double x = 0; x < 10; x++) {
        String adjustedFormula = formula.replace("x", Double.toString(x));
        double result = (Double) engine.eval(adjustedFormula);
        System.out.println("x = " + x + "  ==>  " + formula + " = " + result);
    }
}

出力:

x = 0.0  ==>  2 * x + 1 = 1.0
x = 1.0  ==>  2 * x + 1 = 3.0
x = 2.0  ==>  2 * x + 1 = 5.0
x = 3.0  ==>  2 * x + 1 = 7.0
x = 4.0  ==>  2 * x + 1 = 9.0
x = 5.0  ==>  2 * x + 1 = 11.0
x = 6.0  ==>  2 * x + 1 = 13.0
x = 7.0  ==>  2 * x + 1 = 15.0
x = 8.0  ==>  2 * x + 1 = 17.0
x = 9.0  ==>  2 * x + 1 = 19.0
于 2012-07-27T14:54:03.240 に答える
3

あなたが探しているものはeval、いくつかの言語では「」と呼ばれています。ただし、Javaにはそのようなものは直接ありません。

Javaには、他の言語(JavaScript、Ruby、Pythonなど)で記述されたコードの「eval」をサポートする「と呼ばれるスクリプトインターフェイスとjavax.script、Javaコンパイラへのアクセスを提供する「 と呼ばれるツールパッケージjavax.toolsがあります。ツール)。上級プログラマーの場合、別のアプローチは、パーサージェネレーターを使用してテキストフィールドから文字列を解析し、それを何らかの方法で解釈することです。

残念ながら、これらは初心者向けの高度な概念です。「eval」を直接サポートする別の言語でプログラムを作成することを検討してください。

于 2012-07-27T14:51:05.910 に答える
0

この素晴らしいExprlibを見つけました!

「このパッケージは、2 + 2やcos(x /(2 * pi))* cos(y /(2 * pi))などの浮動小数点数の数式を解析して評価します。

設計の優先事項は、有用なエラーメッセージを伴う使いやすさ、アプレットへの統合の容易さ、および優れたパフォーマンス(評価の高速化とダウンロード時間の短縮)でした。機能と柔軟性は最優先事項ではありませんでしたが、コードは十分に単純なので、好みに合わせて変更するのは難しくありません。」

私の例では

class Myclass extends JFrame{
    blah blah ...
    JLabel lblFx =new JLebel("f(x=)");
    JTextfield Fx = new JTextField();
    String formula = Fx.getText();//2*x+1  OR  cos(x) OR lot of other functions

    //and lets say that this method calculate the f(x).
    //get as argument the x
    double calculateFx(double x){
        // The Expr Object that will representing the mathematical expression
        Expr expr = null;

        try {
            // parsing function formula to mathematical expression
            expr = Parser.parse(formula);
        } catch (SyntaxException e) {
            System.err.println(e.explain());
            return;
        }

        // Define(make) what will be the variable in the formula, here x
        Variable vx = Variable.make("x");
        // Set the given value(x) in variable
        vx.setValue(x);

        //return (mathematical) expression's value. See more for Expr lib how work...
        return expr.value();//
    }

}

最後に、プロジェクトのどこかでcalculateFx(x)、指定されたxに対して、f(x)値を取得します。

于 2016-08-23T12:12:16.800 に答える