忍者ブログ

カレンダー

01 2025/02 03
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

最新コメント

[07/13 ♀はっか]
[07/13 ♀はっか]
[07/11 ♀はっか]
[07/11 ♀はっか]
[03/16 空竜]

最新トラックバック

プロフィール

HN:
空竜
性別:
女性

バーコード

ブログ内検索

アクセス解析

忍者アナライズ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

構文木とか、懐かしいなオイ

引き続き精神カオス状態。
3時間ほどくだらん文章をガタガタ打ってました。
その後先手必勝で来週出るであろう課題をしてた。
でもね。さすがにね。講義前にやるのは・・・つらいね。
プログラミングだなんてまさに、ね。
問題は考え方だったり方法だから、いくら結果が同じであれ、
そこに辿り着くまでの経過が合ってるかが大問題。
専門用語出しちゃうと「リファクタリング出来てるかい?」ってやつですね。
うまく出来たかどうかはさておき、一応必要とされてる要素はクリアした。
で、このあと・・・

http://kuryu.blog.shinobi.jp/Entry/818/より。
>あるいは途中で教室に入って来た人が教授に
—中略—
>とか。別でやって来た1回生に至っては
>「休み中の課題を何か出して下さい」
>「え、言語は?」
>「Javaでお願いします」
>「え〜っと、じゃあねぇ・・・」
>とか、まじめっこを目の当たりにしたりなんかして。

で、まじめっこに与えられてた課題を自分がやってみたり。
ぐふっ。僕って無駄ッ子(キモス)
とはいえさすがは教授。
出してた課題が今日やってた課題にめっちゃ近いのよね。
だから〜。
その課題で組んだプログラムを改造してみた(爆)
でもこれが案外厄介。
途中まではなんとかなったものの、その先はまだ講義でやってない部分だから。
明日はその先を自力でやってみますかね。
あぁ、大丈夫かなぁ・・・


以下実際にまじめっこに出された課題について。
内容は単純。
「ユーザの入力した数式を解析、実行するプログラムを作れ」というもの。
これを作る時に何が大変って、入力された文字をどう認識させるか、だったりする。
1桁だけの計算なら一文字ずつに区切ってしまえばいい。
オマケに数字の次の文字は演算子、という決まりも出来てしまう。
でも2桁以上だとそうはいかない。
数字の部分は何文字分?ということを常に調べていかなければならない。
でもって、演算子が出て来た時点で数字の部分は終了したことになる。
更に問題はこれだけじゃない。計算する順番だ。
演算子が+と-だけならいい。でも*と/が入ってくると難易度が全然違う。
先頭からただ実行すればいい、という訳にはいかなるから。
つまり。
桁数分でちゃんと区切った上、*や/を優先して計算させる必要がある。
括弧が出て来たのなら、それも考慮しなきゃいけなくなる。
小数点は・・・どうだろう。
教授が整数だけの話をしていたから、ここは後でもいいのかな。
第一、*や/と比べれば大した問題じゃない。

以下、オレの現状。
とりあえず桁数も配慮しながら区切って認識させる部分は出来た。
ここで先に+と-だけでも動く状態にしてしまいたい。
ということで、次は区切ったものを実際に計算する部分を作る。
すでに優先順位が変わることを見越してプログラミングしてるから、
区切った部分は一度配列として保存しておく必要がある・・・と思う。
ここでしなきゃいけない作業は、どの演算子が来たのか、
どの順序で実行するのか、という情報を作ること。
おそらく必要なのは構文木・・・恐怖のノードかコノヤロウ。
これは昔アルゴリズムの講義でやった内容を
そのまま持って来て考えた方が早いかもしれん。
明日は講義のバックアップファイルあさるか・・・
で、これで優先順位を決めてしまうわけだ。
・・・先に構文木がどうなるように作らないといけないか考えないとマズイか。

例えば?『12-4/2*3+1』とか?
ちなみに答えはなんぼよ?『7』?
・・・おぉ。今いいヒントをgoogleさんにもらってしまった。
『12-4/2*3+1』で検索したら『12-((4/2)*3)+1』で計算してくれはった。
考え方はこれ、ということですな。
では実際に構文木な考え方で。
『X+1』だとしよう。Xは『12-Y』。Yは『Z*3』。Zは『4/2』だ。
ということは?Zが『2』、Yは『2*3』で『6』。Xは『12-6』で『18』。
だから『12-6+1』で、あとは前から計算。『6+1』。つまり『7』。
よし。木にしてみようか。分岐は全部2で作ってしまうわけだね。
最初の根はX+1。
Xからは12-Yの枝が伸びてる。1には枝ナシ。即値ってやつですな。
12は即値だから枝ナシ。YからはZ*3の枝。
Zからは4/2の枝。3は即値だから枝ナシ。
4は即値だから枝ナシ。2も即値だから枝ナシ。
はい。これ以上枝は伸びません。
おぉ、なんか出来たな。構文木っぽものが。
んじゃあ明日はこれを実装するだけか。
ん〜先が見えて来た感じがするぞ。

拍手

PR

Trackbacks

TRACKBACK URL :

Comments

Comment Form