微積分のプログラミング プロジェクトでは、シンプソンの 1/3 および 3/8 ルールをモデル化するプログラムをコーディングするように指示されました。
多項式 (つまり、5x^2+7x+10) を使用することになっていますが、これを概念化するのに苦労しています。スキャナの使用から始めましたが、多項式を正しく読み取るためのより良い方法はありますか?
例や参考資料は大歓迎です。
いくつかの入力値を受け取り、出力値を返す Function インターフェイスから始めることをお勧めします。
public interface Function {
double evaluate(double x);
}
多項式の実装を書きます:
public class Poly {
public static double evaluate(double x, double [] coeffs) {
double value = 0.0;
if (coeffs != null) {
// Use Horner's method to evaluate.
for (int i = coeffs.length-1; i >= 0; --i) {
value = coeffs[i] + (x*value);
}
}
return value;
}
}
それをインテグレーターに渡して、その仕事をさせてください。
(開始するための) 簡単な方法は、配列を使用することです。
あなたの例では、次の5x^2 + 7x + 10
ようになります:つまり
{10,7,5}
、インデックス 0 では x^0 の係数 10、インデックス 1 では x^1 では 7、インデックス 2 では x^2 では 10 です。
もちろん、これは最善のアプローチではありません。あなたがどのように表現するかを理解する方法を理解するx^20
Java では、「X^2 項を入力してください」(次に X 項、定数) のように、入力を事前にフォーマットして定数を要求するのが最も簡単です。
それが受け入れられない場合、入力スタイルの違いに対して非常に脆弱になります。+ と - で String.split[ting] によって用語を区切ることができます。これにより、次のようになります。
[5x^2]、[7x]、[10]
次に、「x^2」と「x」を含む文字列を検索して、用語を区別できます
もちろん、最初にスペースと .toLowerCase() を削除して、ユーザーの差異に対処します。
文字列を分割するときは、これらの定数を否定できるように - ケースを識別する必要があります。
1 つは + で、もう 1 つは - で 2 つの分割を行うことができます。「トークン」を保持するオプションを指定して StringTokenizer を使用することもできますが、これはより簡単かもしれませんが、StringTokenizer は一部の人々を少し不快にさせるので、あなたに合ったものを使用してください.
これは、ユーザーが「5x^2 + 10 + 7 x」と入力しても成功することに注意してください。これは便利です。
解析が私の問題だと思います。私はJavaに少し慣れていないので、これは私を悩ませています。
パーサー ジェネレーターを使用する必要があります。
パーサー ジェネレーターは、文法仕様を読み取り、文法との一致を認識できる Java プログラムに変換するツールです。パーサージェネレーター自体に加えて、JavaCC は、ツリー構築 (JavaCC に含まれる JJTree と呼ばれるツールを使用)、アクション、デバッグなど、パーサー生成に関連する他の標準機能を提供します。
JavaCC の FAQ の回答算術式を解析するにはどうすればよいですか?
JavaCC に付属の例を参照してください。
コンパイルに関するテキストを参照してください。
Recursive Descent による式の解析とTheodore Norvellによるチュートリアルを参照してください。