リソースxmlに文字列として保存した正方形の周囲長(4 * a)のような数式を、アクティビティの値に割り当てる必要があります。したがって、次のようになります。
アクティビティ:
int a = (formula from xml)
そしてXML:
<resources>
<string name="square_perimeter">4*a</string>
</resources>
それを行う方法はありますか?
とは[34 20 2A 20 31 36]
?
これは、コンピュータが string に遭遇したときに表示されるもの"4 * 16"
です。そして、あなたと同じように、それだけを与えられたとき、それらの不可解な数がなぜ 64 に相当する必要があるのか わかりません.
したがって、それを実際に評価するために、コンピューター/アルゴリズムは、入力をチャンクに分割することから始めます。式を空白で区切る必要があると仮定しましょう (4*4
は違法です4 * 4
が、大丈夫です )。その知識に基づいて、式を[34]
, [2A]
, に分割でき[31 36]
ます。
[34]
数字である文字を表します4
=> その部分は 4 を意味します[2A]
は数学演算子である文字*
を表します => この前の部分とこの後の部分を掛ける必要があります。[31 36]
は との略で1
、6
どちらも数字です。=> 1 * 10 + 6 を計算 => 16 です。その時点で、乗算を実行する必要があり、4 と 16 があることがわかっているため、4*16 を計算して結果を得ることができます。
"[numbers] [*/+-] [numbers]" のみなど、厳密な規則に従う非常に単純な式が必要な場合は、そのための小さなパーサーを作成するのは非常に簡単です。
しかし、数学はすぐに複雑になり、すでに "10 + 5 * 2" では、左から右に評価する場合に 10 + 5 を加算しないことが要求されます。これは間違った結果になるからです。
そのため、次のような変数を含む複雑な式を評価するために記述する必要があるコードの量"5a^2 * sin(a) +1"
は非常に大きくなります。すべての数学的規則とすべての特殊なケースをカバーする必要があります。
問題に戻ります。本当にテキスト式を使用したい場合は、面倒なことをしてくれるライブラリを探してください。たとえば、文字列形式で与えられた数式を評価すると、いくつか言及されます。
式をテキストにする必要がない場合は、次のようにすることができます。
メソッドの名前を xml データベースに入れ、そのメソッドのソリューションをアプリに実装します。ユーザーはその名前でメソッドを選択し、その名前に基づいて適切なメソッドを呼び出します。欠点は、それを解決できるコードを作成できるように、すべての式を知っている必要があることです。
非常に基本的な例:
public int calculate(String method, int value1, int value2) {
if ("square".equals(method)) {
return value1 * value1;
} else if ("add".equals(method)) {
return value1 + value2;
} else if ("substract".equals(method)) {
return value1 - value2;
} else {
return 0;
}
}
数式で使用される値もどこかに来る必要があります。どのようにそれを行う予定かわかりません。