作者BlackMatrix (BlackMatrix)
看板C_and_CPP
標題[問題] Boolean Trea Evaluation
時間Fri Nov 13 15:32:48 2009
( *[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
推 ledia:"~" 下面只有 left child (或是只有 right) 看你存哪邊 11/13 15:36
→ ledia:應該不能拿去 eval 吧 ? 11/13 15:36
→ ledia:換句話說就是, 看到是 '~' 只能 eval 有資料的那一邊 11/13 15:37
→ ledia:其它的才能把左右子樹都 eval 出來用 11/13 15:37
→ BlackMatrix:阿!~~~你說得非常沒有錯 11/13 15:47
※ 編輯: BlackMatrix 來自: 173.56.121.140 (11/13 15:51)
→ BlackMatrix:謝謝, 不過還是有runtime error, 所以我還在改~謝謝 11/13 15:52
推 ledia:eval 要在知道哪個 op 之後再做 11/13 15:54
→ ledia:或者是你的 eval 一開始要檢查, 傳進來是 null 就隨便回傳值 11/13 15:54
→ ledia:不要繼續做下去 (雖然這樣的做法比較不好) 11/13 15:54
→ BlackMatrix:基本上所有的檢查都已經被我寫完了, 剩下這個... 11/13 15:56
→ BlackMatrix:因為我recursion非常非常不拿手 11/13 15:56
→ BlackMatrix:我感覺我基本上都寫錯了, 不管怎麼改就是過不去 11/13 15:57
→ BlackMatrix:如果我放進去TF|F~&就runtime error 11/13 15:59
→ BlackMatrix:可是放進去FF&就會寫說是False 11/13 16:00
→ BlackMatrix:詭異阿!~~~~~ 11/13 16:00
→ BlackMatrix:我好像找到問題了, FF|可以, '~'不管怎樣都不行 11/13 16:01
→ BlackMatrix:弄不好...挨挨 11/13 16:09
推 ledia:你的 code 就是現在文章這樣嗎 ? 11/13 18:30
→ ledia:還是你用置底的貼 code 網頁貼一個最新版本? 11/13 18:30
→ ledia:(eval 的部份) 11/13 18:31
→ BlackMatrix:我只貼了evaluation的部分, 抱歉我睡著了= = 11/13 23:05
※ 編輯: 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)