━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 課題2の補足 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●補足 2a *参考になるコマンド UNIX の bc コマンドは数式を読み込んで値を計算する機能をもつ. 実装するプログラムは,このコマンドの簡易版である. *BNF の読み方 A::=B は「AとはBである」,A|B は「AまたはB」の意味である. *構文に合う算術式の例 0 x (a+1) (3*(4*5)) ((x+a)*(y+b)) (4+(3+(2+(1+Z)))) (((7*i)+(7*j))*(7*k)) *参考になる関数 表示関数 show_exp() は tree.c の show_tree() を参考にして作るとよい. *デバッグの方法 プログラム本体 ex2.c の実行結果は期待通りではないかもしれない. その場合には,作成中の関数に一時的に動作確認用の表示処理を加えたり, 新たに debug.c 等の名前で動作確認用プログラムを作ったりして修正する. 必要に応じて Makefile も編集すること. ●補足 2b *式の値を求める別の方法 算術式の値を求めるにはスタックを使う方法もあるが, この課題では,より柔軟な処理が可能な,2分木を使う方法を採用する. *数値への変換の参考資料 数字から数値への変換については,ホームページ上の 「C言語の 数字・数字列」の資料(第2回演習時に公開)が参考になる. *入出力の切り替え 標準入力からデータを読む検査を繰り返す場合,データファイル (ex2.data 等) を作り,ファイルから標準入力へデータを送る シェルの機能を使う. 実行時に,次のように入力データファイルを指定する. ./ex2 < ex2.data また,結果をファイルに保存するには, ./ex2 < ex2.data > ex2.result のように,標準出力のデータをファイルに保存するシェルの機能を使う. ●補足 2c *高度な変形 結合法則 (A+(B+C))=((A+B)+C) や (A*(B*C))=((A*B)*C) を適用できない x や (a+1) や (8+(8*8)) などの式は,変形しないこと. 式全体でなく式の一部分に対してだけ括弧をくくり直せる (a+(b*(c*d))) や (a*((x+(y+z))+1)) のような式も変形しない. 部分式に対する再帰的な式変形もしない.例えば,式 (w+(x+(y+z))) は ((w+x)+(y+z)) へと1度だけ左にくくればよく,(((w+x)+y)+z) にはしない. 結合法則を繰り返し使って,すべての括弧をくくり直す処理は,次回に扱う. *参考になるコマンド 算術式の文字列よりも木の図の方が動作確認しやすいと思うなら, 演習用コマンド ~toshi/show-exp を使うとよい. ────────────────────────────────────── ●補足 2d *発展課題 発展課題に取り組む場合は,あらかじめ動作試験の実施方法を読み, 正常にコンパイルできるように機能拡張するとよい. 特に,ヘッダファイル tree.h や exp.h は,配布したものを そのまま動作試験で使うため,内容を変えないこと. *領域の解放 変形後に不要になる記憶領域があれば解放すること. ●補足 2e ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 演習のホームページ 山田 俊行 https://www.cs.info.mie-u.ac.jp/~toshi/