2017-08-19 8 views
2

与えられた数式のかっこを文字列としてバランスさせる関数を実装しようとしています。バランスが取れているかどうかだけでなく、文字列を変更する必要があります。カッコのバランスをとる機能

数式には三角関数が含まれる可能性があるので、この関数の後にradians()を追加したいと思います。Pythonでは三角関数が度を求めながら入力をラジアンとして受け取るためです。

したがってtan(65)tan(radians(65))になります。
cos(65) + sin(35)cos(radians(65)) + sin(radians(35))
cos((30 - 10) * 2)なりこれまでcos(radians((30 - 10) * 2))

なり、私がやったことはsin(radians(cos(radians(cos(sin(を置き換えるためにreplace()を使用し、同じことがすべての残りの三角関数のために行くされています。しかし、問題は、文字列(数学方程式)がかっこ - 不均衡になることです。

この問題を解決する関数を作成するにはどうすればよいですか?

答えて

1

ここでは、radians(を適切な場所に挿入し、かっこのバランスをとっておくアルゴリズムの概要を示します。これは、あらかじめ括弧が実際に釣り合っていて、文字列リテラルにアンバランスな括弧がない場合(例えば、len("abc(d"))に機能します。しかし、それはひどく不名誉なようには見えません。

replace()を使用しないでください。代わりに、cos(またはその他のtrig関数の使用法を見つけるには、find()を使用してください。カウンタをゼロに設定します。その後、右の括弧[(cos(]の直後から文字列をスキャンします。開始括弧に遭遇したら、カウンターを1つ増分します。閉じ括弧に遭遇したら、カウンタを1減らします。あなたのカウンターが-1に達すると、あなたのtrig関数の閉じ括弧が見つかりました。その場所に新しい閉じカッコを挿入し、を入力し、次にを挿入します。radians(はtrig関数の直後に挿入します。

文字列内のすべてのtrig関数を処理するまで、これを続けます。

+0

'cos(0)'は有効ですが検出されません( 'cos'と'( ')の間に空白があります)おそらく正規表現が必要になるでしょう: – jp48

+0

@ jp48: OPはアルゴリズムの試行でその可能性を考慮しなかった。文字列は何らかの形で前処理されている可能性を排除するか、 'cos'を' cos(ラジアン) 'や'おそらく、私はそのような詳細を私の答えに含めるべきでしたが、私はそれらを残して答えを "アルゴリズムの概要"と呼ぶことにしました。私は答えに細部の正確な量を持っていて、時にはオーバーシュートやアンダーシュート –

+0

@ jp48:正規表現について少しは知っていますが、関数とそれに対応する閉じ括弧の両方を見つける方法がわかりません。どのようにすることができますか?それは完全な答えの価値があるでしょう。 –

2

あなたはcosdegcosを交換して定義することができます。

def cosdeg(x): 
    return cos(radians(x)) 

または(ラムダ版):

cosdeg = lambda x : cos(radians(x)) 

そして、他の三角関数と同じように。

+0

私はこの答えが好きです。これは、OPが解決策として当然取っていたものよりも良い方法を示しています。 – trincot

+0

非常に良い答え。しかし、私のプログラムでは、入力は 'eval()'関数によって評価されます。時間と使いやすさのために、私は新しい機能を定義することはできません。 –

関連する問題