關於《高質量》第三版第4 13節例4的更正!

2021-04-13 07:58:37 字數 2534 閱讀 7718

乙個名叫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...