乙個名叫cao_julians的網友對《高質量》第三版第4.13節例4的實現提出了質疑,我認真核對後也覺得欠妥。問題主要是對true的定義和理解。現在更新如下:
例4:協助破案。假設已經查清,有a、b、c、d、e五個嫌疑人可能參與製造了一起銀行搶劫案,但是不知道其中到底哪幾個人是真正的案犯。不過,有確鑿證據表明:
① 如果a參與了作案,則b一定也會參與。
② b和c兩人中只有一人參與了作案。
③ c和d要麼都參與了作案,要麼都沒有參與。
④ d和e兩個人中至少有一人參與作案。
⑤ 如果e作案,則a和d一定參與作案。
是不是有點繞口?我們可以用數理邏輯中的正規表示式來表示上述論斷:
① a→b
② (b∧ c)∨( b∧c)
③ (c∧d)∨( c∧ d)
④ (d∨e)
⑤ e→(a∧d)
我們現在用1(可理解為true)表示作案,0(可理解為false)表示未作案,則每個人的取值範圍就是。然後我們在5個人取值的所有可能的組合空間中進行搜尋,如果某個組合同時滿足這5條線索,那麼它就是本案的答案了。於是,上述正規表示式可以進一步表示為下列c++/c邏輯表示式:
① a == 0 ||(a == 1 && b == 1)
② b + c == 1
③ c == d
④ d + e >= 1
⑤ e == 0 ||(e == 1 && a == 1 && d == 1)
我們用另乙個變數count來表示組合空間中某乙個組合能夠滿足幾條論斷,如果出現了這樣乙個組合:它同時滿足了這5條論斷,那麼它就是我們要找的組合。
程式見示例4-21。
示例4-21
#include
int main(void)
} } }
} finish:
printf ("suspect a is %s./n", ( a == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect b is %s./n", ( b == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect c is %s./n", ( c == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect d is %s./n", ( d == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect e is %s./n", ( e == 1 ) ? "a criminal" : "not a criminal");
return 0;}
輸出結果如下:
suspect a is not a criminal.
suspect b is not a criminal.
suspect c is a criminal.
suspect d is a criminal.
suspect e is not a criminal.
上述方法有些捨近求遠。
實際上,這個問題的更好的解決辦法是直接使用所有邏輯表示式的「與」的結果來判斷,即定義count為邏輯變數並修改為hasfound,此法更直接了當。實現如下:
首先把邏輯表示式改為:
① !a || (a && b)
② (b && !c) || (!b && c)
③ (c && d) || (!c && !d)
④ d || e
⑤ !e || (e && a && d)
**就可以如下修改為:
#include
int main(void)}}
}}finish:
printf ("suspect a is %s./n", ( a == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect b is %s./n", ( b == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect c is %s./n", ( c == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect d is %s./n", ( d == 1 ) ? "a criminal" : "not a criminal");
printf ("suspect e is %s./n", ( e == 1 ) ? "a criminal" : "not a criminal");
return 0;
}輸出結果如下:
suspect a is not a criminal.
suspect b is not a criminal.
suspect c is a criminal.
suspect d is a criminal.
suspect e is not a criminal.
感謝網友cao_julians的熱心和支援!謝謝!
android權威程式設計第三版第8章挑戰
修改4個部分,先修改list item crime的布局,然後需要相應地修改crime和crimelab,新增 boolean isrequespoilice以及出初始化srequespoilice的值,將id為3的倍數的crime物件設定為需要呼叫 最後在criemlistfragment中修改,...
王爽彙編 第三版 第7章問題7 9
下面是給出的初始 assume cs codesg,ss stacksg,ds datasg stacksg segment dw 0,0,0,0,0,0,0,0 stacksg ends datasg segment db 1.display 這裡是4 16個位元組 db 2.brows db 3...
王爽彙編 第三版 第13章實驗13
1 編寫並安裝 int7ch 中段例程,功能為顯示乙個用0結束的字串,中斷例程安裝在0 200處。如下 assume cs code data segment db welcome to masm 0 data ends code segment start mov ax,0 mov es,ax m...