• ベストアンサー

Pascalにて入力した式の演算

タイトルのとおり、Pascalにて入力した式の演算を行うプログラムを作ろうと考えています。 例えば 1 + 3 * 3 = と入力すると10と出力されるようなものです。 そこで、アルゴリズムとしては 式を全てcharとしてread 括弧があるか探し、あるなら括弧閉じるを探す 括弧内で乗除算を探す その右と左の数をintegerなりに変換して演算 以下同様に計算 …という風に考えました。 そこで質問なのですが、 式のreadをするとき、変数は配列型でいいのでしょうか 配列型だとひとつの配列に二桁以上の数ひとつだけ、という風にしか収納出来ないと思うので、これでは不可能な気もします。 また配列型では不可ならどうすればいいでしょうか。 次に、式をreadした後、そのreadをどのようにして終わらせるか 以上二点がよく分からないので、よろしければお答え願います。 また私の考えが大きく違う時等も御指示お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.1

私だったら、プログラムを次のステップに分けて考えます。 1.一文字ずつ式を読む。式の終わりは = とする。 2.式を要素に分ける。要素とは 数値 + - * / ( ) など。 3.式を逆ポーランド記法に変換する。 4.逆ポーランド記法の式を計算する。 ステップ1で式のreadをするとき、というかreadした文字を溜め込むのは配列でよいでしょう。 ステップ2で要素に分ける際、配列で数字が連続していたらひとまとめに扱うようにします。私だったら、ここでintegerに変換します。また、一つのアイデアとしては + - * / ( ) に「答としてありえない数値」を割り当てて変換しては。例えば '+'は-10000、'-'は-10001 などに。そうすれば式をintegerの配列で表現できます。(あまりよろしくないかな?) 以降はPHAPHAPHAさんの考えるアルゴリズムを実行する訳ですが、式を計算する手法としては逆ポーランド記法を経由するのが常套手段のようです。検索してみてはどうでしょうか。 この段階では、あまりPascalに依存するところはありませんね。

PHAPHAPHA
質問者

お礼

いろいろと参考になりました。 逆ポーランド記法がイマイチピンと来なかったので少し考えてみたいと思います。 複数桁の数字を一桁ずつ読み込んでする、ということで上手く進められそうです。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

えっと, 「逆ポーランド記法に直してから計算する」のは多分無駄です>#1. 少なくとも「陽に逆ポーランド記法に直す」のは無駄です. 「入力した式をすぐに計算して終わり」なら「逆ポーランド記法に直しつつ直接計算する」, 「入力した式をいったんためておいて後で計算する」なら「構文解析をしてから構文木を作る」のが今のスタンダードではないかな.

PHAPHAPHA
質問者

お礼

逆ポーランド記法についての記述、ありがとうございました。 参考に頑張ります。

すると、全ての回答が全文表示されます。

関連するQ&A