プログラミングU 第20回

数式の記法 4


いよいよ括弧の省略を認めた中置記法の式の入力(ツリーに変換)を行います.
式にレベルを考えます.
レベル1の式:変数,および( )でくくった式
  例 a , (b+c+d) , (b*c-(d+e)/a)
レベル2の式:レベル1の式,およびレベル1の式を * または / で結んだ式
  例 a , (x+y-z) , (a+b)*c/d*(c-a)
レベル3の式:レベル2の式,およびレベル2の式を + または - で結んだ式
  例 a , a*b+c , a*b*c+d-e/f , (a+b)*c+d
レベル3の式は,すべての式を含みます.
レベル2の式では,+ と - は ( ) の中にしか現れません.
レベル1の式では,* と / も ( ) の中にしか現れません.
レベル1の式の定義で書いた,( )でくくった式は,正確にはレベル3の式を( )でくくった式です. ですから,レベル1の式の定義はまわりまわって自分自身を参照しています. すなわち,間接的な帰納的定義ということになります.

参考プログラムTree4.dpr
+ - を使わないレベル2までの式を変換します.
Shiki[Nth] から始まるレベル1の式を変換するプロシージャ Level1Shiki と, Shiki[Nth] から始まるレベル2の式を変換するプロシージャ Level2Shiki があって, 互いに呼び出しあっています.
今 Level1Shiki の定義を Level2Shiki の定義より上に書いてあるので, Level2Shiki が Level1Shiki を呼び出している箇所は問題ないのですが, Level1Shiki が Level2Shiki を呼び出している箇所が「未定義の識別子」というエラーになってしまいます.
これを解消するために forward という機能があります. 24行目の
          //  procedure Level2Shiki(var Ptr : PTree); forward;
          
の // を消して,有効にしてください.
Level2Shiki の頭の部分(header)だけ書いて後ろに forward; と書いてあります. これは,Level2Shiki の本体がもっと下にあることを意味します. 本体は下でも,ヘッダーが上に書いてあるので,Level1Shiki の中で Level2Shiki を参照できます.

課題 Tree5
レベル3の式を変換するように Tree4 を拡張してください.

問題 前回の課題プログラム KouchiKeisan を利用して次のパズルを解いてください.
次の4つの数字を使って10を作ってください. 使用する演算は加減乗除のみです. 数字の順番は変えてかまいません.
(1) 3 4 7 8
(2) 1 1 5 8