• 締切済み

数式から不要なカッコを取り除く方法

下記のように数式を与えると、不要なカッコを取り除いた式を返すようなプログラムを作りたいと思っています。 --- (1) A+B+(C*D)+E → A+B+C*D+E (2) ((A*B)*C)/D/E → A*B*C/D/E (3) ((A+B)*C)*D*E → (A+B)*C*D*E VBA、UNIXのシェルあたりで実装できないか検討しています。 いい実装方法があれば教えてください。 よろしくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

質問にある程度ならまじめに構文解析せんでもよかろうと 試しにやってみたらおおはまり。 まあロジックの参考にでもなればと思い貼り付けておきます。 # #coding: sjis #下記のように数式を与えると、不要なカッコを取り除いた式を返すようなプログラムを作りたいと思っています。 #--- #(1) A+B+(C*D)+E → A+B+C*D+E #(2) ((A*B)*C)/D/E → A*B*C/D/E #(3) ((A+B)*C)*D*E → (A+B)*C*D*E # #VBA、UNIXのシェルあたりで実装できないか検討しています。 #いい実装方法があれば教えてください。 # #よろしくお願いします。 def make_stream(s): ____return iter(list(s)) def reduce_paren(inp): ____#tok = inp.next() ____OPS = "+-*/" ____op_stack = [] ____result = [] ____def reduce_paren_sub1(): ________r = [] ________while True: ____________try: ________________tok = inp.next() ____________except : ________________break ____________if tok == '(': ________________r.append(reduce_paren_sub1()) ____________elif tok == ')': ________________return r ____________elif tok in OPS: ________________r.append(tok) ____________else: ________________r.append(tok) ________return r ____def get_lowest_order_op(l): ________op = l[1] ________for i in l[3::2]: ____________if op in list("*/") and i in list("+-"): ________________op = i ________return op ____def reduce_paren_sub2(inp): ________r = [] ________while True: ____________try: ________________term = inp.next() ____________except : ________________break ____________if isinstance(term, list): ________________r2 = reduce_paren_sub2(iter(term)) ________________op = get_lowest_order_op(r2) ________________if op_stack[-1] in list("*/") and op in list("+-"): ____________________r.append(op_stack[-1]) ____________________r.append(term) ________________else: ____________________op2 = inp.next() ____________________if op in list("*/"): ________________________for i in r2: ____________________________r.append(i) ____________________else: ________________________r.append(r2) ____________________r.append(op2) ____________________op_stack.append(op2) ____________else: ________________if term in OPS: ____________________op_stack.append(term) ________________r.append(term) ________return r ____tmp = reduce_paren_sub1() ____inp2 = iter(tmp) ____result = reduce_paren_sub2(inp2) ____return result ____ sampledata = [ ____"A+B+(C*D)+E", ____"((A*B)*C)/D/E", ____"((A+B)*C)*D*E" ] for s in sampledata: ____print "input =", s ____inp = make_stream(s) ____print "output = ", reduce_paren(inp) ____print "####\n\n" pythonスクリプトなので、行頭のインデントのための空白を '_' で置き換えてますのでよろしく。 実行結果: input = A+B+(C*D)+E output = ['A', '+', 'B', '+', 'C', '*', 'D', '+', 'E'] #### input = ((A*B)*C)/D/E output = ['A', '*', 'B', '*', 'C', '/', 'D', '/', 'E'] #### input = ((A+B)*C)*D*E output = [['A', '+', 'B'], '*', 'C', '*', 'D', '*', 'E'] ####

  • nitorin
  • ベストアンサー率55% (11/20)
回答No.2

yacc & lex という選択肢もあります。

参考URL:
http://kmaebashi.com/programmer/devlang/yacclex.html
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・『数式』を評価できるようにプログラミングします。  VBA、または VBScript などで実装できると思います。  問題は評価させるロジック(アルゴリズム)ですね。 ・次のリンクをどうぞ。  http://www.tuat.ac.jp/~tuatmcc/contents/monthly/200206/nuki.xml  数式を評価するには  (1)カッコを評価  (2)乗算・除算を評価  (3)加算・減算を評価  となります。  数字が小さいほど優先順位が高いことになります。  再帰処理すれば楽になります。  つまり、カッコ内の加算・減算は(3)の評価関数を呼ぶ。 ・以上。

参考URL:
http://www.tuat.ac.jp/~tuatmcc/contents/monthly/200206/nuki.xml

関連するQ&A

  • EXCEL VBAで数式の追加変更を行いたい

    VBA初心者です。 下記の様な表を作成して、月末の累計処理を行っています。 表 A B C D 1 部署 累計 1月 2月 2 a 2000 1000 1000 3 b 1800 1000 800 : : : B2セルに、(=C2+D2)という式を入れています。 月末あらたに、E列に表を追加作成し、B2セルの数式を(=C2+D2+E2)に変更したいと思っていますが、VBAで数式の取得変更は可能ですか? もし可能であるなら、どういったプログラム記述になるのか、教えて頂きたいです。 宜しくお願い致します。 (説明している表がわかりにくくて、申し訳ありません。)

  • Excel関数で文字列を数式にする方法

    解決策を見つけれなかったのでお願いします C1の値が1でE1の値が15なら A15の値を表示したいのです =IF(C1=1,"=A" & E1,"=B" & E1) 上記の式を入れても”=A15”となるだけで 数式になりません VBAを使わずして解決する方法がありますでしょうか 宜しくお願いします

  • エクセル関数(複雑な) { }←このカッコについて

    {=SUM(IF(Sheet1!$B$2:$B$500="F",IF(Sheet1!$C$2:$C$500="kkkk",IF(Sheet1!$A$2:$A$500=5502,Sheet1!$E$2:$E$500,0),0),0))} 上記のような数式があり次のような→{ }カッコがついていますが 数式に少しでもカーソルを置くと式が壊れてしまいます。{ }←このカッコが消えてしまいます。コピーも出来ない状態です。 この式を使いKKKKの部分をSSSSに書き変えたりしてベースを作りたいのですがどうしたらこのカッコが壊れないように書き換えられますか? ※この数式私が作ったものではないのです。  難しくて構造がよくわからないのでどなた分かる方が  おりましたら教えてください。

  • 数式が解けません

    下記数式を x について解きたいのですが, 解けません>< どなたか解き方を教えていただけないでしょうか? a^2x^2 - 2a√{(1-x^2)(b^2-a^2x^2)} - 4acx + d^2 - (a^2 + b^2 + c^2) = 0 ※a,b,c,dは定数です.

  • エクセルの数式を教えてください。

    質問が悪かったようなので、詳しく書きます。 A1に1、B1に1の場合はA/B、B1に1、C1に1の場合はB/C、C1に1、D1に1の場合はC/Dとなるような数式はありますでしょうか? 下記の数式をどう改良したら良いかわかりません。 =IF(AND(SUM(A1:B1)=2,A1=1,B1=1),"A/B","") 宜しくお願いいたします。

  • EXCELで入力された式の値を求めて自動計算

    A B C D E 1|データNO |数値1| 数値2| 数値3| 2| 1| 0.3 | 0.2 | 0.5 | 3| 2| 0.3 | 0.2 | 0.5 | 4| 3| 0.3 | 0.2 | 0.5 | -------------------------------------------- 10| 2/1| 数式1| 数式2 | 数式3 | 11| 3/2| 数式4| 数式5 | 数式6 | 12| 【求めたい値】 数式1には=C3/C2、数式2には=D3/D2、数式3には=E3/E2 数式4には=C4/C3、数式2には=D4/D3、数式3には=E4/E3 B列の2/1というのをそのまま式にしたいです。 2/1、3/2などは規則性はありません。その都度変わります。 C列の式ではC列の値を、D列の式ではD列の値を用います。 関数で=MATCH(LEFT(D34,SEARCH("/",D34,1)-1),D1:D23,0))と入れ、C3の値を求めようと思いましたが この時点でエラーになりました。=MATCH(2,D1:D23,0)だと大丈夫なのですが・・・。 関数でやるととても式が長くなりそうなので、VBAの方が良いかとも思っています。 どのようにコード、もしくは式を書けば希望の値が得られるでしょうか? VBAの場合は2/1などの数値を入れた時点で自動計算できれば嬉しいです。 よろしくお願いします。

  • エクセル2010で、数式を貼り付けたい

      A     B    C     D 1 商品名  単価  購入数  合計 2 りんご   100  20     2000 (数式:B2*C2) 3 みかん   80  10     800 (数式:B3*C3) という表があります。 E1に、D1(とE2にD2)の数式を、コピペで貼り付ける方法内でしょうか。   A     B    C     D    E 1 商品名  単価  購入数  合計 数式情報 2 りんご   100  20     2000 B2*C2 3 みかん   80  10     800  B3*C3 どうしても、Dの数式をコピーして、Eに貼り付けても結果の合計が表示されてしまいます。 (一度、C1コピー⇒メモ帳に貼り付け⇒エクセルにコピーも考えましたが、  エクセルに貼り付けた時点で、2000の結果が入りました・・・。) 手で入力して、Concatしてもいいのですが、 もし、コピペですむなら、コピペで解決したいのです。 どなたか解決方法をご存知の方がいらっしゃいましたら ご教授お願いします。

  • EXCELで式での空白セルの挿入方法

    A列は空白行で、B列は数値が入っていたり空白だったりする行で構成されています。 またC列からD列までの全ての行には数値が入っています。 この時A列に条件付き数式を入力して、B列が空白でなければB列に空白セルを挿入して現B列からD列を右にシフトさせたいのですが、数式で可能でしょうか? 数式で可能ならばA列に入力する式を、不可能なら参考のためVBAでの記述をお教え頂けると嬉しいです。(VBAはあまり理解しておりませんが。) 例 【処理前】 A列 B列 C列 D列 E列     22   33  44          55  66     77   88  99         100  101 【処理後】 A列 B列 C列 D列 E列 式       22  33  44 式       55  66 式       77  88  99 式      100  101 2万行の処理を1回のみしたいです。 宜しくお願いします。

  • VBAで複数の数式セルを最終行までコピーするには?

    エクセルで下記のような表を作成しています。    A   B   C   D 1 項目1 数式 数式 数式 2 項目2 3 項目3   ・   ・   ・ B1~D1の数式は項目1を参照したものです。 この時、2行目以下~最終行まで数式をコピーするには、 どのようなVBAを書けばよいでしょうか? よろしくお願い致します。

  • これを一つの数式にしたい。

    こんばんは。 セルが A1 809900円 B1 A1÷20 C1 8×20+31 D1 C1÷20 E1 B1÷D1 F1 E1×8 G1 F1×20 H1 31×E1 I1 G1+H1=809900円 を一つの式にしたいのです。教えて下さい。

専門家に質問してみよう