2016-12-05 7 views
0

数式表現ソルバーのようなworlfram alphaをプログラミングしようとしています。 現在の障害は、どの開閉ブラケットが対応しているかを把握していることです。数式用のプログラム入力文字列の解析

たとえば、((1 * 3)/(4/2))の中のどの括弧が一致しているかはわかります。プログラムは、これらのセクションのそれぞれを個別に解決し、そうするとき、元のセクションを答えに置き換えます。

それは、製品とそのセクションを置き換える3、および((1 * 3)/(4/2))は今(3/(4/2))なりますので、そのため、例えば、プログラムは((1 * 3)/(4/2))で解決しようとする最初のセクションでは、(1 * 3)だろう。

私の現在のコードは、ここに参考にしている場合はhttp://pastebin.com/Xpayzbff、処理する関数はparse()です。

ありがとうございます!

+4

(http://stackoverflow.com/users/2617068/tigerhawkt3?tab=profile)を、電卓があります初心者のコーディングプロジェクトに最適な選択ではありません。あなたは、代わりにカードゲームやボードゲームのようなものをプログラミングすることを検討するかもしれません。 – TigerhawkT3

+0

ソルバーが何か他のものであるためソルバーではなくインミックス式評価プログラムを実装するには、再帰を理解して使用する必要があります。 – DyZ

+0

@ TigerhawkT3または3つの独立したargを持つ少なくとも1つの操作1 – Maltysen

答えて

0

私はあなたのためにコードを書くつもりはないので、それはポイントを打ち負かしてくれるかもしれませんが、おそらくあなたが望むのはShunting-yard algorithmです。オペレーター(オペランドはのオペランド)をポストフィックス(コンピュータで評価するのは簡単で、オペレーターの後にオペランドがあります)に変換します。ここで

は、Pythonのbooleanログインのためにそれをやった人です:https://msoulier.wordpress.com/2009/08/01/dijkstras-shunting-yard-algorithm-in-python/

また、あなたはそれから操作できるAST、に直接文を解析してみてください。

また、tokenizer moduleのpythonについてもチェックしてください。

0

大括弧で囲まれた式を、別のリストを含むシンボルのリストとして扱います。したがって、"((1 * 3)/(4/2))"[['1', '*', '3'], '/', ['4', '/' '2']]で表されます。記号のリストを 'ノード'と呼ぶ。

文字列を反復するときに、スタックしている「ブラケットペア」(またはノード)を追跡するスタックを維持します。スタック内の最後のノードにシンボルを追加します(current_node)。各'('で、ノードに新しいノードを追加します。をスタックに追加します。各')'でスタックをポップして、親ノードにいるようにしてください。さらにシンボルが追加されます。

次に、最終的な値が得られるまで、最初に各ノードを再帰的に評価することができます。

このコードをリバースエンジニアリングします。

def parse(expr): 
    stack = [[]] 
    for i in expr: 
     current_node = stack[-1] 
     if i == '(': 
      new_node = [] 
      current_node.append(new_node) 
      stack.append(new_node) 
     elif i == ')': 
      stack.pop() 
     elif not i.isspace(): 
      current_node.append(i) 

    return stack[0] 

print(parse('(1 * 3)/(4/2)')) # [['1', '*', '3'], '/', ['4', '/', '2']] 

チェックアウトこの質問:私は[私のプロファイルに]言うよう Python parsing bracketed blocks