- いよいよ括弧の省略を認めた中置記法の式の入力(ツリーに変換)を行います.
- 式にレベルを考えます.
- レベル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
|