VB.NET2005 TIPS / 理数系 |
S0002 数式演算 |
最終更新:2007/05/10 再掲 |
●解説
S0001 数式処理で得られた後置記法の文字列数式を演算する方法。但し記号演算ではなく、変数などに値を代入して数値演算する方法である。
●原理
オペランド、オペレータ(数学関数含む)などの因子を取り出し、オペランドなら値スタックにスタッキング
し、オペレータなら、値スタックから必要なオペランドをラストアウトし、そのオペレータで演算し、値スタックに積む。数式がなくなったら、値スタックに残った値が求める解となる。
A+B*Cの後置記法である ABC*+ を例にして以下に解説する。この場合はA、B、Cは数値であるとする。
- Aを文字列から取り出す。オペランドなので、値スタックに積む。
- Bを文字列から取り出す。オペランドなので、値スタックに積む。
- Cを文字列から取り出す。オペランドなので、値スタックに積む。
-
*を文字列から取り出す。*はオペレータなので、値スタックから、CとBを取り出し、B*Cの演算をし、その結果mを値スタックに積む。この時、オペランドの順番は大切
(-
や/、^の時は答えを間違ってしまう。)。
- +を文字列から取り出す。+はオペレータなので、値スタックから、mとAを取り出し、A+mの演算をし、その結果vを値スタックに積む。vが演算結果である。
●仕様
○数式仕様
S0001 数式処理に同じとする。単純演算子の場合は、オペランドが二つ、関数の場合は、オペランドは一つである。
○変数、定数への代入
変数、常数、定数があれば、文字ではなく、値を別途見つけてスタックする。
●方法
以下のような処理方法、手順となる。
-
値スタックを置く。
-
数式(因子列)から因子を一つ取り出す。
-
オペランドであれば、以下のようにして値を代入し、値スタックに積む。
・数値:リテラルからDoubleに変換し値スタックに積む。
・変数:X,Yかによって、別途用意されたプログラム上の変数の値を値スタックに積む。
・定数:定数配列から対応する値を持ってきて値スタックに積む。
・常数:今のところ、π のみ。コモン常数PIの値を値スタックに積む。
オペレータであれば、以下のようにしてオペランドを得て、演算し値スタックに積む。
・単純演算子:値スタックから、値v1(最上部)、v2(二番目)を取出し、v2 op v1 とし、結果を値スタックに積む。
・関数:値スタックから、値v1(最上部)のみを取出し、f(v1)を演算(標準関数の呼出、あるいは自分で演算)し、結果を値スタックに積む。
-
2.から繰り返す。
-
数式(因子列)がなくなったら終了。
|