• 締切済み

電卓ソフトを作るには逆ポーランド法で良いのですか?

 プログラミングの勉強をしながら式入力型の電卓を作りたいと思い調べたところ「逆ポーランド法」を知りました。  まず四則演算出来るものを作り最終的には関数電卓を目指そうと思っているのですが、この「逆ポーランド法」を取り入れた計算プログラムを学べば良いのでしょうか?もっと適している他の手法はありますか? 公開されている式入力型の電卓ソフトはどのような手法でプログラムされているのでしょうか?(なかなか式入力型のサンプルが見つからなくて…。)  言語はActiveBasicを使用していますが、情報が少ない為VisualBasicのサイトで勉強しています。 宜しくお願いいたします。

noname#68635
noname#68635

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

訂正の訂正 If InStr("(*/-+", Mid(str, pos - 1, 1)) > 0 Then

noname#68635
質問者

お礼

BLUEPIXYさんサンプルまで乗せて頂きありがとうございます。とても参考になります。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

If InStr("(*/-+)", Mid(str, pos - 1, 1)) > 0 Then の部分を If InStr("*/-+", Mid(str, pos - 1, 1)) > 0 Then に修正して下さい。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2ですが、バグってますね。 カッコが複数ある時に、なんかうまく行かないみたいです。 恥ずかしい。(>_<)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

逆ポーランド記法は、式の解析が簡単なので、作りやすいかもしれませんね。 逆ポーランド記法を解するする処理ルーチンを作って、一般入力式を逆ポーランド記法に変換するルーチンを作って渡しても良いと思いますが、四則演算くらいなら、構文解析やりつつ計算するのもそれほどは難しくはないです。 サンプルとしてVBで四則演算を理解して計算する関数を書いてみました 参考にしてみて下さい。 '"(3+5)*7-2"の様な文字列で与えられた式を計算する Public Function calc(ByVal str As String) As Double Const STACKSIZE = 3 Dim cstack(STACKSIZE) As String, csp As Integer '演算子スタック Dim vstack(STACKSIZE) As Double, vsp As Integer '値スタック Dim level As Integer Dim sign As Integer, frac As Double Dim wk As Double, cwk As String, c Dim buff As String Dim pos As Integer str = Replace(str, " ", "") '式からスペースを取り除く vsp = STACKSIZE csp = STACKSIZE csp = csp - 1 'スタックは使う前に-1する cstack(csp) = "@" 'empty mark wk = 0: sign = 0: frac = 10 For pos = 1 To Len(str) '一文字ずつ走査する c = Mid(str, pos, 1) '現在着目している文字 If "0" <= c And c <= "9" Then '数字 If sign = 0 Then sign = 1 If frac = 10 Then wk = wk * frac + Val(c) Else wk = wk + Val(c) * frac frac = frac / 10 End If Else If c = "." Then '小数点 If frac < 1 Then MsgBox "小数点が2つ以上ある" calc = 0 Exit Function Else frac = 1 / 10 End If Else '数ではない If sign <> 0 Then '初めの時は積まない、例えば-で始まる数の時 vsp = vsp - 1 vstack(vsp) = sign * wk End If wk = 0: sign = 0: frac = 10 '数の初期化 If c = "-" Then '符号のマイナスの処理 If pos = 1 Then '最初にマイナス符号があれば符号 sign = -1 GoTo nextLoop Else If InStr("(*/-+)", Mid(str, pos - 1, 1)) > 0 Then 'マイナス符号の前が演算子の時符号 sign = -1 GoTo nextLoop End If End If End If Select Case c Case "*", "/" cwk = cstack(csp) '直前の演算子を取り出す If cwk = "@" Or cwk = "+" Or cwk = "-" Then '現在の演算子が優先である csp = csp - 1 cstack(csp) = c Else If cwk = "*" Then '掛け算する vstack(vsp + 1) = vstack(vsp + 1) * vstack(vsp) Else If cwk = "/" Then '割り算する vstack(vsp + 1) = vstack(vsp + 1) / vstack(vsp) End If End If vsp = vsp + 1 cstack(csp) = c End If Case "-", "+" cwk = cstack(csp) If cwk = "@" Then csp = csp - 1 cstack(csp) = c Else Select Case cwk Case "+" vstack(vsp + 1) = vstack(vsp + 1) + vstack(vsp) Case "-" vstack(vsp + 1) = vstack(vsp + 1) - vstack(vsp) Case "*" vstack(vsp + 1) = vstack(vsp + 1) * vstack(vsp) Case "/" vstack(vsp + 1) = vstack(vsp + 1) / vstack(vsp) End Select vsp = vsp + 1 cstack(csp) = c End If Case "(" 'カッコ中身でcalcを呼び出す pos = pos + 1 level = 1 'カッコの組の数 sign = 1 buff = "" Do While pos <= Len(str) c = Mid(str, pos, 1) If c = ")" Then level = level - 1 If level = 0 Then wk = calc(buff) Exit Do End If Else If c = "(" Then level = level + 1 End If buff = buff & c pos = pos + 1 Loop If level > 0 Then 'カッコの数が合っていない時 wk = calc(buff) pos = pos - 1 End If Case ")" 'ありえないはず MsgBox ("閉じカッコが多すぎる") Case Else MsgBox (c & "は使用できない文字です") End Select End If End If nextLoop: Next vsp = vsp - 1 vstack(vsp) = sign * wk cwk = cstack(csp) Do Until "@" = cwk Select Case cwk Case "+" vstack(vsp + 1) = vstack(vsp + 1) + vstack(vsp) Case "-" vstack(vsp + 1) = vstack(vsp + 1) - vstack(vsp) Case "*" vstack(vsp + 1) = vstack(vsp + 1) * vstack(vsp) Case "/" vstack(vsp + 1) = vstack(vsp + 1) / vstack(vsp) End Select vsp = vsp + 1 csp = csp + 1 cwk = cstack(csp) Loop calc = vstack(vsp) End Function

  • nagare
  • ベストアンサー率33% (280/831)
回答No.1

逆ポーランド法を用いて電卓の作成は当然できますよ でも、VECTORなどで公開されている電卓ソフトは逆ポーランド法ではなく、独自の手法だと思います 逆ポーランド法はスタック(PUSH/POP)を使うのでVBなら配列でやると思いますのでREDIMを使えば大丈夫でしょう

noname#68635
質問者

お礼

独自ですか…、私にはまだまだ無理ですので出来ることからやっていこうと思います。 ありがとうございました。

関連するQ&A

  • 逆ポーランド記法

    電卓もどきのアルゴリズムを教えて下さい 指定された数式を解読して、演算結果を求める処理を作成したいのですが・・・・ 今考えている手順は (1) 数式を解析して 逆ポーランド記法の中間言語にして於いておく (2) 逆ポーランド記法の中間言語を演算して答えを求める と考えているのですが・・・ << 例 >>  演算式 1+2×3=    答え 7  演算式 (1+2)×3=  答え 9 大昔の知識ですのでもっとシンプルな方法が有りましたらアドバイス頂けませんでしょうか?

  • スタック C言語

    四則演算のプログラミング(C++)をスタックを用いて作りたいのですがどうすればいいのか全く分かりません。 スタックの原理は分かるのですが…。 かなり検索してスタックの四則演算を少し見ましたが、まともに載ってるのがあまりなく…。ポーランド記述法つかうのか?とか…ドンドンわからなくなりました。 分かるかた、教えてください。 プログラミング載せてくれたら助かりますが、方針だけでも大丈夫です。 作りたいプログラミングは自分で式を入力して、実行結果にその答えが表示されるというものです。また、入力する式はポーランド記述法のものではなく、普通の式(4*2+1 など)です。

  • 逆ポーランド記法への変換方法を教えてください。

    Visual Studio C++ 6.0で逆ポーランド電卓のプログラムを作っていますが、式の変換方法がわからないので教えていただければ助かります。 たとえば (8 + 9 * -8) * 10 だと 8 9 -8 * + 10 * に変換できますが、  -(8 + 9 * -8) * 10 だとどう変換すればよいのかがわかりません。

  • 電卓プログラムを作りたい。

    わたしは、プログラムの初心者なのですが、力不足でプログラムが作れないのでご協力おねがいします。 データをすべて整数で演算子は、1個だけ用い、標準入力を受け取り、リターンキーが押されると、その解答を標準出力に表示するような、加減乗除の四則演算と整数剰余の演算を繰り返し行うことが可能な電卓プログラムを作りたいのですが、、、。

  • 電卓のプログラムソース探しています

    電卓の四則演算のプログラムを探しています。もし知っている方。持っている方いましたら情報提供お願いいたします。

  • 関数電卓

    四則演算、16進、10進、8進数変換が行える電卓(c言語)のプログラムを探しています。もし知っている方。持っている方いましたら情報提供お願いいたします。

  • 逆ポーランド記法における単項演算子などの処理

    開いていただきありがとうございます。 質問内容は題名の通りなのですが、 中置記法の式を逆ポーランド記法に変換して計算を行う際に単項演算子をどのように扱うかで悩んでいます。+-などのように文脈に応じて意味合いが変化するものもあり、もうひとつスマートに処理することができません。 また前置・後置インクリメントなどに対応するとしたらなおざりに処理するわけにもいきませんし、三項演算子に至ってはどのように処理すればいいのかさっぱりです。 電卓に留まらず、簡単な処理系に組み込むという前提で、これらをどのように使えばよいかご教示いただければと存じます。

  • C#.NET 電卓プログラムについて

    今C#.NETで電卓プログラムを作成しようとしているのですが うまくいきません。 クリックされた数値に対し四則演算を行い、テキストボックスに 演算結果を出すという結果にしたいのですが、うまくすすみません。 どなたか教えていただけませんか。

  • 逆ポーランド記法

    逆ポーランド式12*3+というのがあります。これを、スタックをつかって評価しようと思ったのですが、 スタック 上位⇔下位   入力記号列 12*3+ 1      2*3+ 21      *3+ 2       3+ 23      + 5 こんな感じの評価でいいんですか?くだらない質問すいませんm(__)m

  • 四則演算のみの電卓まjavaプログラム

    四則演算のみの簡易電卓javaプログラムがわかりません。 数字・クリア・イコールはすべてボタンで表されている、 よくあるタイプの電卓です。 ネット上で探しましたが、ありそうで見つかりませんでした。記述をお願い致します。

専門家に質問してみよう