第三章邏輯思維與計算機解題續課件_第1頁
第三章邏輯思維與計算機解題續課件_第2頁
第三章邏輯思維與計算機解題續課件_第3頁
第三章邏輯思維與計算機解題續課件_第4頁
第三章邏輯思維與計算機解題續課件_第5頁
已閱讀5頁,還剩64頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 三 章 邏輯思維與計算機解題(續)第 三 章 邏輯思維與計算機解題(續)例 3-3 求10!/*/* 程序名:3_3.cpp(循環語句示例) */* 作 者:wuwh */* 編制時間:2002年9月20日 */* 主要功能:計算10 的階乘 */*#include / 預編譯命令void main() / 主函數 / 主函數開始int i = 0, j = 0, k = 0; / 聲明 i,j,k 為整型變量,并初始化為0long sum = 1; / 聲明 sum 為長整型變量,并初始化為1for (i = 10; i = 1; i = i-1) / 用 for 循環作累乘運算cout

2、 i= i ; / 顯示isum = sum * i; / 每一步乘積cout tsum= sum endl; / 顯示每一步乘積for (j = 1; j = 5500; j = j+1) / 用 for 循環延遲時間for (k = 1; k = 10000; k = k+1);/用 for 循環延遲時間 cout 10!= sum endl;/ 顯示運算結果 /主函數結束2例 3-3 求10!/*#include void main() int i = 0, j = 0, k = 0; long sum = 1; for (i = 10; i = 1; i = i-1)cout i= i

3、 ; sum = sum * i; cout tsum= sum endl; for (j = 1; j = 5500; j = j+1)for (k = 1; k = 10000; k = k+1); cout 10!= sum endl; 3#include 3i=10sum=10i=9sum=90i=8sum=720i=7sum=5040i=6sum=30240i=5sum=151200i=4sum=604800i=3sum=1814400i=2sum=3628800i=1sum=362880010!=3628800該程序的運行結果如下:4i=10sum=10該程序的運行結果如下:4將1

4、0!展開為10987654321讓整型變量 i 去表示10,9,1讓長整型變量sum來表示乘積,初始時讓其為1將求10的階乘考慮成累乘問題,讓 i = 10 去乘sum 再將積存至 sum 中,即sum = sum * i之后讓 i = i - 1,再用上式累乘,不斷地反復做這兩個運算,從 i = 10,9,1。就完成了求10!的任務。見圖3.2求 10! 的思路是,5將10!展開為10987654321求 圖3.26圖3.26恰好計算機擅長做這種重復操作,使用 for循環是最佳選擇。讓循環控制變量 i 就是數字 10,9,1。i 的初值為 10,終值為 1。for 循環的三個表達式為:表達式

5、1 為 i = 10;表達式2 為 i = 1;表達式3 為 i = i - 1;7恰好計算機擅長做這種重復操作,使用 for循環是最佳選擇。7for循環的NS圖為了以后講解的方便,有必要使用更為簡便的N-S結構流程圖,如圖3.3for (i=1; i=100; i=i+1)循環體圖3.38for循環的NS圖for (i=1; i=100; i=iif (sum = 3)cout This man is char(64+k) endl;g=1;這一段程序可以讀作:如果sum真的為 3 時,做下面兩件事(1)輸出做好事的人;(2)將本題的有解標志置為 1。其中(sum=3)為條件判斷語句中的條件

6、,根據其真假使程序分支。例 3-1 的解要用到分支語句,即需要判斷當四句話中有 3 句為真時,我們要將該人判定為做好事者。請看如下程序段9if (sum = 3)例 3-1 的解要用到分支語句下面我們畫出分支程序的NS流程圖,這種圖直觀清晰,一目了然。圖3.410下面我們畫出分支程序的NS流程圖,這種圖直觀清晰,一目了if ( 表達式 ) 語句 1;else 語句 2;如果表達式為真,執行語句1;否則執行語句2if ( 表達式 )語句塊 1;else語句塊 2;11if ( 表達式 ) 語句 1;11一般格式if ( 表達式 ) 語句 1;如果表達式為真,執行語句 1;否則什么都不做.if (

7、 表達式 )語句塊 1; 如果表達式為真,做語句塊 1 的內容;否則什么都不做;12一般格式12舉例:實現如圖函數圖3.513舉例:實現如圖函數圖3.513/*/* 程 序 名:3_4.cpp(分支程序示例) */* 作 者:wuwh */* 編制時間:2001年8月 */* 主要功能:實現符號函數 */*#include / 預編譯命令void main()/ 主函數 / 主函數開始int x=0,y=0;/ 聲明x,y為整型變量,并初始化為0cout 請輸入x x;/ 從鍵盤輸入整數送至x中if (x0)/ 如果x0,將1賦給yy=1;elseif (x=0)/ 如果x=0,將0賦給yy=

8、0;elsey=-1;/ 否則(x0),將-1賦給ycout 當x= x 時, y= y endl; / 輸出x,y的值 /主函數結束14/*NS圖圖3.615NS圖圖3.615NS圖有了上述了解之后,我們來看解“誰做的好事”的程序框圖圖3.716NS圖有了上述了解之后,我們來看解“誰做的好事”的程序框圖圖現在我們來分析“誰做的好事”的NS流程圖。它是由兩大塊組成的,如圖3.8循環體for(k=1; k=4; k+)語句1;圖3.8第一塊循環結構第二塊分支結構17現在我們來分析“誰做的好事”的NS流程圖。它是由兩大塊組 第一塊是循環結構,功能是產生被試對象,依次為A、B、C、D。并測試四句話有

9、多少句為真,如有3句為真,則可確定做好事者,同時置有解標志為1。 第二塊為分支結構,功能是判斷是否無解,如為真,則輸出無解信息。 這是粗看。再往細看,第一塊的循環體又由兩塊組成,如圖3.9,中含兩條賦值語句中含一條分支語句18 第一塊是循環結構,功能是產生被試對象,依次我們講這一段是希望你掌握NS圖,這對今后的學習會有好處。按照程序框圖很容易寫出程序(如下頁所示)thisman = 64+k;sum=( thisman!=A )+ ( thisman=C )+ ( thisman=D )+ ( thisman!=D );圖3.9sum = 3真假輸出該被測試者;有解標志置1;19我們講這一段是

10、希望你掌握NS圖,這對今后的學習會有好處。/ */ * 程 序 名:3_5.cpp */ * 作 者:wuwh */ * 編制時間:2001年8月 */ * 主要功能:誰做的好事 */ *#include / 預編譯命令void main() / 主函數 / 主函數開始int k=0,sum=0,g=0; / 聲明變量為整數類型,且均初始化為0char thisman= ;for(k=1;k=4;k=k+1) / k既是循環控制變量,也表示第k個人 / for 循環體開始thisman = 64+k;sum=( thisman!=A ) + ( thisman=C ) + ( thisman=

11、D ) + ( thisman!=D );if (sum=3) / 如果4句話有3句話為真,則輸出該人/ 輸出做好事者cout 做好事者為 char(64+k) endl;g=1; / 有解標志置1 / for 循環體結束if (g!=1) / 則輸出無解信息 cout Cant found! endl; / 主函數結束20/ *#include void main() int k =0, sum =0 , g =0; char thisman = ;for ( k = 1; k = 4 ; k = k+1 ) thisman = 64 + k;sum = ( thisman != A ) +

12、( thisman=D ) + ( thisman=C ) + ( thisman !=D );if ( sum=3 ) cout 做好事者為 char(64+k) endl;g=1; if (g!=1) cout Cant found! endl;21#include 21/ */ * 程 序 名:3_6.cpp */ * 作 者:wuwh */ * 編制時間:2001年8月 */ * 主要功能:誰做的好事 */ *#include / 預編譯命令void main()/ 主函數 / 主函數開始int k=0,sum=0,g=0;/ 聲明變量為整數類型,且均初始化為0for(k=1;k=4;

13、k=k+1)/ 循環從k為1到4,sum=0;/ 循環體內的初始化if (k!=1) sum=sum+1;/ 如A的話為真,則讓sum加1;if (k=3) sum=sum+1;/ 如B的話為真,則讓sum加1;if (k=4) sum=sum+1;/ 如C的話為真,則讓sum加1;if (k!=4) sum=sum+1;/ 如D的話為真,則讓sum加1;if (sum=3)/ 若有三句話為真,則做下列兩件事cout This man is char(64+k) endl;/ 輸出做好事者g=1;/ 讓有解標志置1if (g!=1)/ 則輸出無解信息 cout Cant found! endl

14、;/ 主函數結束22/ *for ( k = 1; k = 4; k = k+1 )sum=0;if ( k != 1 ) sum = sum+1; / 如A的話為真, 則讓sum加1;if ( k =3 ) sum = sum+1; / 如B的話為真,則讓sum加1;if ( k =4 ) sum = sum+1; / 如C的話為真,則讓sum加1;if ( k != 4 ) sum = sum+1; / 如D的話為真,則讓sum加1; . . . 23for ( k = 1; k = 4; k = k+1 )/ */ * 程 序 名:3_7.cpp */ * 作 者:wuwh */ * 編

15、制時間:2001年8月 */ * 主要功能:誰做的好事 */ *#include / 預編譯命令void main() / 主函數 / 主函數開始int k=0,g=0; / 聲明變量為整數類型,且均初始化為0for(k=1;k=4;k=k+1) / k既是循環控制變量,也表示第k個人 / for 循環體開始if (k!=1)+(k=3)+(k=4)+(k!=4)=3) / 如果4句話有3句話為真,則輸出該人/ 輸出做好事者cout 做好事者為 char(64+k) endl;g=1; / 有解標志置1 / for 循環體結束if (g!=1) / 則輸出無解信息 cout Cant foun

16、d! endl; / 主函數結束上述程序可以簡化為:24/ *for ( k = 1; k = 4 ; k = k+1 )if (k!=1)+(k=3)+(k=4)+(k!=4)=3) cout 做好事者為 char(64+k) endl; g=1; 25for ( k = 1; k = 4 ; k = k+1 for( k= 1; k= 4; k= k+ 1 ) if ( ( ( k != 1) + ( k = 3) + ( k = 4 ) + ( k != 4 ) ) = 3 ) cout “做好事者為” char( 64+ k )endl; g = 1; 26 for( k= 1; k=

17、 4; k= k+ 1 第 四 章 邏輯判斷與解題思路第 四 章 邏輯判斷與解題思路某地刑偵大隊對涉及六個嫌疑人的一樁疑案進行分析:A、B 至少有一人作案;A、E、F 三人中至少有兩人參與作案;A、D 不可能是同案犯;B、C 或同時作案,或與本案無關;C、D 中有且僅有一人作案;如果 D 沒有參與作案,則 E 也不可能參與作案。試編一程序,將作案人找出來。邏輯表達式28某地刑偵大隊對涉及六個嫌疑人的一樁疑案進行分析:邏輯表達式1、邏輯與,運算符為 &圖4.1為了解這道題,我們要研究邏輯運算符與邏輯表達式。如圖電路A 表示開關A合上;B 表示開關B合上;A&B 表示燈亮;291、邏輯與,運算符為

18、 &圖4.1為了解這道題,我們要研究邏1 表示真,0 表示假,這是邏輯變量的取值,非真即假ABA&B111100010000301 表示真,0 表示假,這是邏輯變量的取值,非真即假AB2、邏輯或,運算符為|圖 4.2如圖電路A 表示開關A合上;B 表示開關B合上;A|B 表示燈亮;312、邏輯或,運算符為|圖 4.2如圖電路311 表示真,0 表示假ABA | B111101011000321 表示真,0 表示假ABA | B11110101103、邏輯非,運算符為 !兩隊比賽籃球,變量 A 表示 A 隊到場,!A 表示 A 隊不到場,變量 B 表示 B 隊到場,!B 表示 B 隊不到場。這場

19、球賽能夠賽成,得兩隊都到場。假定 “能賽成” 用邏輯變量 C 表示,則C = A & B333、邏輯非,運算符為 !33賽不成當然用 !C 表示,D= !C,D 表示賽不成則D = !A | !B理解為 A 不到場或 B 不到場,球賽無法進行。34賽不成當然用 !C 表示,D= !C,34思路:1、案情分析:將案情的每一條寫成邏輯表達式,第一條用 CC1 表示,第二條用 CC2 表示,35思路:1、案情分析:35CC1:A和B至少有一人作案令 A 變量表示 A 作案,B 變量表示 B 作案ABCC1000101011111顯然這是或的關系,有CC1= ( A | B )36CC1:A和B至少有

20、一人作案ABCC100010101111CC2:A和D不可能是同案犯可以分析為:A 如果是案犯,D一定不是案犯,寫成A & ( !D )D 如果是案犯,A一定不是案犯,寫成 D &( !A )A 和 D 都不是案犯,寫成 (!A) & (!D)這三者之間是或的關系,因此有CC2 = !( A & D )37CC2:A和D不可能是同案犯37CC2 = !( A & D )ADA&DCC2100111100001010138CC2 = !( A & D )ADA&DCC21CC3:A、E、F 中至少有兩人涉嫌作案分析有三種可能第一種,A 和 E 作案,(A & E)第二種,A 和 F 作案,(A

21、& F)第三種,E 和 F 作案,(E & F)這三種可能性是 或 的關系,因此有CC3 = (A & E)|(A & F)|(E & F)我們寫出 CC3 的真值表。39CC3:A、E、F 中至少有兩人涉嫌作案39AEFCC311111101101101110010010010000000CC3 = (A&E)|(A&F)|(E&F)40AEFCC3111111011011011100100100CC4:B和C或同時作案,或都與本案無關第一種情況:同時作案(B & C)第二種情況:都與本案無關(!B & !C)兩者為或的關系,因此有 CC4 = (B & C) | (!B & !C)BC!B

22、!CB&C!B&!CCC5110010110010000110000001101141CC4:B和C或同時作案,或都與本案無關BC!B!CB&CCC5:C、D中有且僅有一人作案CC5=(C & !D) | (D & !C)4242CC6:如果D沒有參與作案,則E也不可能參與作案。分析這一條比較麻煩一些,可以列出真值表再歸納DE!ECC6含 義1101D作案,E也作案可能1011D作案,E不作案可能0011D不作案,E也不可能作案可能0100D不作案,E卻作案不可能43CC6:如果D沒有參與作案,則E也不可能參與作案。DE!ECCC6=D | !E1011以上是案情分析,已經化成了計算機可解的邏

23、輯表達式44CC6=D | !E1011以上是案情分析,已經化成了計算 6個人每個人都有作案或不作案兩種可能,因此有 種組合,從這些組合中挑出符合6條分析的作案者。 定義 6 個整數變量,分別表示 6 個人A,B,C,D,E,F。枚舉每個人的可能性讓 0 表示不是罪犯;讓 1 表示就是罪犯。2、采取枚舉方法,枚舉什么呢?枚舉組合45 6個人每個人都有作案或不作案兩種可能ABCDEF00000000000100001011111146ABCDEF000000000001000010 寫一個從000000到111111的程序for( A=0;A=1;A=A+1) for( B=0;B=1;B=B+

24、1) for( C=0;C=1;C=C+1) for( D=0;D=1;D=D+1) for( E=0;E=1;E=E+1) for( F=0;F=1;F=F+1) coutABCDEF endl; 47 寫一個從000000到111111的程序47 for( F=0;F=1;F=F+1) coutABCDEF endl; 循環體4848 for( E=0;E=1;E=E+1) for( F=0;F=1;F=F+1) coutABCDEF endl; 循環體49 for( D=0;D=1;D=D+1) for( E=0;E=1;E=E+1) for( F=0;F=1;F=F+1) coutAB

25、CDEF endl; 循環體50 50 for( A=0;A=1;A=A+1) for( B=0;B=1;B=B+1) 循 for( C=0;C=1;C=C+1) 環 for( D=0;D=1;D=D+1) 體 for( E=0;E=1;E=E+1) for( F=0;F=1;F=F+1) coutABCDEF endl; 51515252為了給出每個人是否為罪犯的信息,程序中定義了一個二維數組。char info29=“不是罪犯”,“是罪犯”;有兩個字串每串最多有91個英文字符是罪犯0不是罪犯0012345678info為數組名1053為了給出每個人是否為罪犯的信息,程序中定義了一個二維數組

26、char 是說,info 數組的元素為字符,2為下標,表示有兩個字符串,每個字符串最多有91個字符。因為英文字符占一個字節,而漢字占兩個字節,故四個漢字要占 8 個英文字符的地方。每一字串后面自動跟一個空字符0因此可以看出:第 0 號字符串 info0 的內容為“不是罪犯”。第 1 號字符串 info1 的內容為“是罪犯”。54char 是說,info 數組的元素為字符,2為下標,表在輸出時用cout “ A: ” infoA endl;如果A為0,則輸出 A:不是罪犯如果A為1,則輸出 A:是罪犯參考程序 4_1.cpp(案情分析)55在輸出時用55/*/* 程 序 名:3_4.cpp */

27、* 作 者:wuwh */* 編制時間:2001年8月 */* 主要功能:案情分析 */*#include void main(void) /案情分析 /A和B至少有一人作案; cc1=(A | B) /A和D不可能是同案犯; cc2=(A & (!D)|(D & (!A) /A,E,F中至少有兩人涉嫌作案 cc3=(A & E )| / (A & F )| / (E & F ) /B和C或同時作案或都與本案無關 cc4=(B & C)|(!B & !C) /C,D中有且僅有一人作案; cc5=(C & !D)|(D & !C) /如果D沒有參與作案,則E也不可能參與作案; cc6=D | (

28、!E) /編程找出犯罪嫌疑人. int cc1,cc2,cc3,cc4,cc5,cc6; /定義6個變量,分別表示6句話 int A,B,C,D,E,F; /定義6個變量,分別表示6個人 char info29 = 不是罪犯, 是罪犯; /定義二維數組,給出是否罪犯信息 56/* for (A=0;A=1;A=A+1) / 枚舉A for (B=0;B=1;B=B+1) / 枚舉B for (C=0;C=1;C=C+1) / 枚舉C for (D=0;D=1;D=D+1) / 枚舉D for (E=0;E=1;E=E+1) / 枚舉E for (F=0;F=1;F=F+1) / 枚舉F cc1

29、=A | B; cc2=!(A & D); cc3=(A & E )| (A & F)|(E & F); cc4=(B & C)|(!B & !C); cc5=(C & !D)|(D & !C); cc6=D|(!E); 57 for (A=0;A=1;A=A+1) /測試6句話都為真時, 才輸出誰是罪犯 if ( cc1+cc2+cc3+cc4+cc5+cc6 = 6 ) /輸出判斷結果 cout A: infoA endl; cout B: infoB endl; cout C: infoC endl; cout D: infoD endl; cout E: infoE endl; cout F: infoF endl; /輸出結束 /循環結束 5858討 論59討 論59大家參與討論的題五位跳水高手將參加十米高臺跳水決賽,有好事者讓五個人據實力預測比賽結果。A選手說:B第二,我第三;B選手說:我第二,E第四;C選手說:我第一,D第二;D選手說:C最后,我第

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論