-1

これは、この質問のフォローアップです。この時点で、プログラムが自分で変数を識別し、次のように表示するのではなく、ユーザーに変数値 .so を要求するようにします。

Enter an Expression: 

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     

Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94    

プログラムは次のように機能する必要があります。

Enter an Expression: 

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     

your variables are : X1,X2,Y    

now Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94    

そのため、ユーザーは変数が何であるかをマシンに伝える必要がなくなりました。どうすればこれを達成できますか?

この質問を確認しましたが、必要なものとはかなり異なり、Pythonにもあります

更新:具体的には、変数を見つけることができるように、分流場アルゴリズムを反復したいと考えています。http://paste.ubuntu.com/9999494/の下にパーサー コードのリンクを配置しました。

4

2 に答える 2

0

次のアルゴリズムをお勧めします。

  1. テキストを「(」、「)」または「,」で区切られたトークンに分割します
  2. トークンを検索して、既知の関数と数値を除外します
  3. 残りはすべて変数

Java 8 ストリームを使用した可能な実装を次に示します。

List<String> getVariables(String expression, List<String> functions) {
    return Collections.list(new StringTokenizer(expression, "(),")).stream()
        .map(Object::toString)
        .filter(token -> !functions.contains(token))
        .filter(token -> !token.matches("\-?\d+\.?\d*"))
        .collect(Collectors.toList());
}
于 2015-02-01T11:33:54.623 に答える
0

すべての関数の名前を保存してから、関数でも数値でもないすべての引数を探す必要があります。

したがって、入力をスキャンすると、とが関数であり、 3 が数値であるADD(X, DIV(3, Y))ことを検出する必要があります。これにより、X と Y が残ります。したがって、これらは変数でなければなりません。基本的に、括弧を検出した場合は常に、一致する閉じ括弧を探し、それらの括弧の内容をコンマで分割し、各部分を評価する必要があります。部分が数値でも関数でもない場合、それは変数でなければなりません。ADDDIV

于 2015-02-01T10:36:07.827 に答える