[問題] Boolean Trea Evaluation

看板C_and_CPP作者 (BlackMatrix)時間16年前 (2009/11/13 15:32), 編輯推噓3(3018)
留言21則, 2人參與, 最新討論串1/2 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 我之前還有PO了一個關於改XYZ的東西已經解決了, 可是我想說萬一有人(?) 用的到我就 放在那邊了 這次的問題比較複雜一點點 就是要算出我的Boolean Tree的結果 假如這是我寫入進去的東西 TF|F~& (T = True, F = False, | = Or, & = And, ~ = ?(其實我只知道他是Unary Operator, 只能拿一個element) 那我的Tree應該是這樣: & / \ | ~ / \ \ T F F 所以說, T||F = T, 其中一方要是T, 那就是T ~的作用就是把F改成T, T改成F 那通過| 我可以求出 T, 在通過~可以求出T 那& = true 因為T&T = True 要用Recursion來寫出這整個東西, 可是我寫的不太對: 另外, 有規定一定要用int 通過這個code, 我希望就是從一個Root當中分段right跟left & / \ Right Left 希望得到的正確結果: 希望他可以給我, if (eval(root) == 1), cout << "Whole statement is true; 之類的東西 else...Whole statement is false 那麼root, 就是我的pointer point到我樹的開頭, 以這個例子來說就是 & = root 程式跑出來的錯誤結果: Runtime error 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) C++ 有問題的code: (請善用置底文標色功能) template <class Object> int eval(Node<Object> *r) { if (isalpha (r->element)) { if (r->element == 'T') { return 1; } else if (r->element == 'F') { return 0; } } int left = eval (r->left); int right = eval (r->right); char op = r->element; if (op == '&') { return(left*right); //if it's true, then it gives me 1, if it's false, then it gives me 0 } else if (op == '|') { if ((right == 1) ||(left == 1)) { return 1; } else if ((right == 0) || (left == 0)) { return 0; } } else if (op == '~') { if (right == 1) return 0; else if (right == 0) return 1; //改掉了, 因為只有right有東西 } } 補充說明: 程序: 錯誤解答 http://nopaste.csie.org/67592 已修正正確解答 http://nopaste.csie.org/1b2f3 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 173.56.121.140

11/13 15:36, , 1F
"~" 下面只有 left child (或是只有 right) 看你存哪邊
11/13 15:36, 1F

11/13 15:36, , 2F
應該不能拿去 eval 吧 ?
11/13 15:36, 2F

11/13 15:37, , 3F
換句話說就是, 看到是 '~' 只能 eval 有資料的那一邊
11/13 15:37, 3F

11/13 15:37, , 4F
其它的才能把左右子樹都 eval 出來用
11/13 15:37, 4F

11/13 15:47, , 5F
阿!~~~你說得非常沒有錯
11/13 15:47, 5F
※ 編輯: BlackMatrix 來自: 173.56.121.140 (11/13 15:51)

11/13 15:52, , 6F
謝謝, 不過還是有runtime error, 所以我還在改~謝謝
11/13 15:52, 6F

11/13 15:54, , 7F
eval 要在知道哪個 op 之後再做
11/13 15:54, 7F

11/13 15:54, , 8F
或者是你的 eval 一開始要檢查, 傳進來是 null 就隨便回傳值
11/13 15:54, 8F

11/13 15:54, , 9F
不要繼續做下去 (雖然這樣的做法比較不好)
11/13 15:54, 9F

11/13 15:56, , 10F
基本上所有的檢查都已經被我寫完了, 剩下這個...
11/13 15:56, 10F

11/13 15:56, , 11F
因為我recursion非常非常不拿手
11/13 15:56, 11F

11/13 15:57, , 12F
我感覺我基本上都寫錯了, 不管怎麼改就是過不去
11/13 15:57, 12F

11/13 15:59, , 13F
如果我放進去TF|F~&就runtime error
11/13 15:59, 13F

11/13 16:00, , 14F
可是放進去FF&就會寫說是False
11/13 16:00, 14F

11/13 16:00, , 15F
詭異阿!~~~~~
11/13 16:00, 15F

11/13 16:01, , 16F
我好像找到問題了, FF|可以, '~'不管怎樣都不行
11/13 16:01, 16F

11/13 16:09, , 17F
弄不好...挨挨
11/13 16:09, 17F

11/13 18:30, , 18F
你的 code 就是現在文章這樣嗎 ?
11/13 18:30, 18F

11/13 18:30, , 19F
還是你用置底的貼 code 網頁貼一個最新版本?
11/13 18:30, 19F

11/13 18:31, , 20F
(eval 的部份)
11/13 18:31, 20F

11/13 23:05, , 21F
我只貼了evaluation的部分, 抱歉我睡著了= =
11/13 23:05, 21F
※ 編輯: BlackMatrix 來自: 128.238.244.111 (11/14 00:47) ※ 編輯: BlackMatrix 來自: 173.56.121.140 (11/14 10:48) ※ 編輯: BlackMatrix 來自: 173.56.121.140 (11/14 10:49)
文章代碼(AID): #1A_GkY2s (C_and_CPP)
文章代碼(AID): #1A_GkY2s (C_and_CPP)