chap04_程序流程控制(二)_第1頁
chap04_程序流程控制(二)_第2頁
chap04_程序流程控制(二)_第3頁
chap04_程序流程控制(二)_第4頁
chap04_程序流程控制(二)_第5頁
已閱讀5頁,還剩54頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、預習任務預習任務l思考:為什么寫程序有時要用循環結構?思考:為什么寫程序有時要用循環結構?什么時候使用循環結構?什么時候使用循環結構?lC語言有哪些循環控制語句?它們的語法格語言有哪些循環控制語句?它們的語法格式是什么?式是什么?l經典的程序你知道哪些?經典的程序你知道哪些?1 1內容提要內容提要l語句與程序流程語句與程序流程l順序結構順序結構l選擇結構選擇結構l循環結構循環結構lbreak與與continuel應用舉例應用舉例2 2生活中循環的例子生活中循環的例子l擊鼓傳花:擊鼓傳花:大家坐成一圈,鼓聲響起的時候將花束順序交到下一大家坐成一圈,鼓聲響起的時候將花束順序交到下一個人的手里,依次

2、向下傳遞,當鼓聲突然中斷時停止個人的手里,依次向下傳遞,當鼓聲突然中斷時停止傳花,花束落在誰的手里便成為輸家。傳花,花束落在誰的手里便成為輸家。l4100米接力賽跑:米接力賽跑:第第1個人跑完個人跑完100米后將接力棒傳給第米后將接力棒傳給第2個人,第個人,第2個人個人再跑再跑100米,然后是第米,然后是第3個人,直到第個人,直到第4個人跑完最后個人跑完最后一個一個100米。米。l共同點:共同點:都要完成相同的任務都要完成相同的任務都有結束條件都有結束條件3 3構成有效循環的條件:循環體循環結束條件 什么是循環?什么是循環?為什么要使用循環?為什么要使用循環?1001nyn問題問題1 1:問題

3、問題2:2: 在許多問題中需要用到循環控制。循環結構是結構化程序設計的基本結構之一,它和順序結構、選擇結構共同作為各種復雜程序的基本構造單元。5 5循環結構循環結構l循環結構:程序中的某些語句和代碼,在循環結構:程序中的某些語句和代碼,在“預設條件預設條件”的控制下可以執行多次。的控制下可以執行多次。l 相關的控制語句相關的控制語句while dowhile for6 6while語句語句l語法語法while(表達式)(表達式)語句塊語句塊l表達式可以是表達式可以是任何合法的任何合法的C語言表達式語言表達式,其其計算結果用于判斷語句塊是否該被執行計算結果用于判斷語句塊是否該被執行。l語句塊是需

4、要重復執行語句的集合,它也語句塊是需要重復執行語句的集合,它也被稱為被稱為循環體循環體。7 7while語句的執行流程語句的執行流程(1)計算表達式的值。若計算表達式的值。若為真,則轉步驟為真,則轉步驟(2);否則退出循環,執行否則退出循環,執行while的后續語句。的后續語句。(2)執行語句塊,并返回執行語句塊,并返回步驟步驟(1)。8 8N 表表達達式式為真為真?語語句句塊塊Ywhile語句的使用語句的使用l例例4.6 求累加和。求累加和。從鍵盤讀入從鍵盤讀入int型正整數型正整數n,計算,計算 的值并輸出的值并輸出9 9l分析:分析:加法操作重復執行加法操作重復執行。因此可設兩個變量。因

5、此可設兩個變量sum和和i,sum初值為初值為0,i初值為初值為1。然后把。然后把i加加到到sum上,重復上,重復n次,每次次,每次i的值加的值加1。這。這樣就可以實現從樣就可以實現從1到到n的累加。的累加。nii1nnii211例例4.6主要代碼主要代碼i = 1;sum = 0;while ( i = n )sum += i;i+;1010while語句說明語句說明l本例中變量本例中變量i承載了控制循環次數的作用,對承載了控制循環次數的作用,對于這類變量,我們稱之為于這類變量,我們稱之為循環控制變量循環控制變量。l通常情況下,循環體內都會有語句對循環控制通常情況下,循環體內都會有語句對循環

6、控制變量進行修改,以變量進行修改,以控制循環結束的時機控制循環結束的時機。l累加和后面要學的階乘是一重循環最典型的應累加和后面要學的階乘是一重循環最典型的應用,初學者應好好體會。用,初學者應好好體會。1111dowhile語句語句ldowhile語句又稱語句又稱直到型循環語句直到型循環語句l語法語法do語句塊語句塊 while ( 表達式表達式 );1212dowhile語句執行流程語句執行流程(1)執行語句塊,執行語句塊,即循環體。即循環體。 (2)計算表達式的計算表達式的值。若為真,則值。若為真,則轉轉(1) ;否則退;否則退出循環,執行下出循環,執行下一條語句。一條語句。1313N語語句

7、句塊塊Y 表表達達式式為為真真?dowhile的使用的使用l例例4.7 求階乘。求階乘。從鍵盤讀入從鍵盤讀入int型正整數型正整數n,計算,計算n!并輸出。!并輸出。1414l分析:分析:n!= 1 * 2 * 3 * * n,乘法操作重復執行。與上一題類似,可設兩乘法操作重復執行。與上一題類似,可設兩個變量個變量fac和和i,fac初值為初值為1,i初值為初值為1。然后將然后將i乘以乘以fac,重復,重復n次,每次次,每次i的值加的值加1。這樣就可以實現從。這樣就可以實現從1到到n的累乘。的累乘。例例4.7主要代碼主要代碼int n, i;double fac;/* 輸入輸入n的值的值 */

8、i = 1;fac = 1;do fac *= i;i+; while( i = n );1515dowhile語句說明語句說明l階乘變量階乘變量fac定義成定義成double類型,這時因為類型,這時因為階階乘運算很容易超出乘運算很容易超出int的范圍的范圍。選用。選用double類類型可支持大一些的數。型可支持大一些的數。l即便如此,即便如此,VC環境下環境下170以上的階乘也超出以上的階乘也超出了了double的范圍。的范圍。 1616whilewhile語句和語句和do-whiledo-while語句的比較語句的比較: :在一般情況下,用在一般情況下,用whilewhile語句和用語句和

9、用do-whiledo-while語語句處理同一問題時,若二者的循環體部分是一句處理同一問題時,若二者的循環體部分是一樣的,它們的結果也一樣。但是如果樣的,它們的結果也一樣。但是如果whilewhile后面后面的表達式一開始就為假的表達式一開始就為假(0)(0)時,兩種循環的結果時,兩種循環的結果是不同的。是不同的。l讀程題(讀程題(2)1818for語句語句lfor語句是語句是C語言中最常用、功能也最強大語言中最常用、功能也最強大的循環控制語句的循環控制語句l語法語法for ( 表達式表達式1 ; 表達式表達式2 ; 表達式表達式3 )語句塊語句塊lfor語句有三個表達式,表達式語句有三個表

10、達式,表達式2是控制循是控制循環的條件。環的條件。1919for語句執行流程語句執行流程(1)計算表達式計算表達式1。(2)計算表達式計算表達式2。若。若為真,則轉為真,則轉(3);否則退出循環。否則退出循環。(3)執行語句塊,即執行語句塊,即循環體。循環體。(4)計算表達式計算表達式3,轉,轉(2)。2020N語語句句塊塊Y 表表達達式式2為為真真?表表達達式式1表表達達式式3for語句說明語句說明l表達式表達式1、表達式、表達式2、表達式、表達式3均可以省略。均可以省略。l當表達式當表達式2省略時,默認其計算結果為真。省略時,默認其計算結果為真。2121for語句的使用語句的使用l例例4.

11、8 數列求和。數列求和。已知一個數列如下,求該數列前已知一個數列如下,求該數列前1000項的和。項的和。2222l分析:欲求該數列的和,可設兩個變量分析:欲求該數列的和,可設兩個變量sum和和item,sum初值為初值為0,item初值為數列的初值為數列的第一項第一項1。然后把。然后把item加到加到sum上,重復上,重復1000次,每次循環時,對次,每次循環時,對item的值進行修改的值進行修改。這樣就可以實現數列元素的累加。這樣就可以實現數列元素的累加。.12) 1(,.,51,31, 11isili = 1, 2, .例例4.8主要代碼主要代碼int i, sign;double ite

12、m, sum;sum = 0;/* 初值置為初值置為0 */sign = 1;for ( i = 1 ; i = 1000 ; i+ )item = sign / ( 2.0 * i - 1 ); /* 計算每一次的累加項計算每一次的累加項item */sum += item;/* 將累加項將累加項item加到總和加到總和sum上上 */sign = -sign;/* 計算下一個累加項的符號計算下一個累加項的符號sign */2323例例4.8說明說明l本在求解累加項本在求解累加項item時,使用了一定的編程時,使用了一定的編程技巧技巧。litem也可以直接根據通項公式求解:也可以直接根據通項

13、公式求解: item = pow( -1, i + 1 ) / ( 2.0 * i - 1 );其中,其中,pow是冪函數,使用時需包含頭文件是冪函數,使用時需包含頭文件math.h。該方法比較直觀,但函數調用及求冪計算的系統該方法比較直觀,但函數調用及求冪計算的系統開銷相對較大,不如例題中的高效。開銷相對較大,不如例題中的高效。2424l單選題(單選題(5)l讀程題(讀程題(3)2525循環嵌套循環嵌套l在循環語句的循環體中,也可以再次出現循環在循環語句的循環體中,也可以再次出現循環語句,這種情況稱為語句,這種情況稱為循環嵌套循環嵌套。l循環嵌套廣泛用于各類問題與算法中,如行列循環嵌套廣泛用

14、于各類問題與算法中,如行列式求解、矩陣處理、排序、二維文本圖形打印式求解、矩陣處理、排序、二維文本圖形打印等。等。 2626 一個循環體內又包含另一個完整的循環結構 稱為循環的嵌套。內嵌的循環中還可以嵌套 循環,這就是多層循環。 三種循環(while循環、do-while循環和for循 環)可以互相嵌套。 下面幾種都是合法的形式:(1) while( ) (2) do (3) for(;) while( ) do for(;) while( ); while( ); (4) while( ) (5) for(;) (6) do do while( ) for(;) while( ) while

15、( ) 二重循環二重循環u假設外循共循環假設外循共循環m次,內循環共循環次,內循環共循環n次,則:次,則: 內外循環用到的循環變量名不能相同內外循環用到的循環變量名不能相同 外循環每循環外循環每循環1次,內循環需要完成整個次,內循環需要完成整個n次循環次循環 內循環的循環體共執行內循環的循環體共執行mn次次時針與分針: 時針外循環 分針內循環加法表打印加法表打印l例例4.9 加法表打印。加法表打印。要求打印如下所示的九九加法表。要求打印如下所示的九九加法表。1+1= 22+1= 3 2+2= 43+1= 4 3+2= 5 3+3= 64+1= 5 4+2= 6 4+3= 7 4+4= 85+1

16、= 6 5+2= 7 5+3= 8 5+4= 9 5+5=106+1= 7 6+2= 8 6+3= 9 6+4=10 6+5=11 6+6=127+1= 8 7+2= 9 7+3=10 7+4=11 7+5=12 7+6=13 7+7=148+1= 9 8+2=10 8+3=11 8+4=12 8+5=13 8+6=14 8+7=15 8+8=169+1=10 9+2=11 9+3=12 9+4=13 9+5=14 9+6=15 9+7=16 9+8=17 9+9=183131加法表打印加法表打印l分析分析對于二維圖形或者矩陣的打印問題,一般需要兩重對于二維圖形或者矩陣的打印問題,一般需要兩重

17、循環。循環。外層循環控制輸出行數,內層循環控制每一外層循環控制輸出行數,內層循環控制每一行中的輸出項數,而行中的輸出項數,而具體輸出內容具體輸出內容則可能與循環控則可能與循環控制變量有關制變量有關。本題中,加法表一共本題中,加法表一共9行,所以外層循環控制變量行,所以外層循環控制變量i從從1變化到變化到9,內存循環控制每一行輸出的加法等,內存循環控制每一行輸出的加法等式數量,第式數量,第i行不超過行不超過i個式子,因此內層循環控制個式子,因此內層循環控制變量變量j從從1變化到變化到i,而每個式子具體輸出的內容則,而每個式子具體輸出的內容則包括包括“+”、“=”、循環控制變量、循環控制變量i、循

18、環控制變、循環控制變量量j、i與與j的和。的和。3232例例4.9主要代碼主要代碼int i, j;for ( i = 1 ; i = 9 ; i+ )/* 外層循環:控制行數外層循環:控制行數 */for ( j = 1 ; j = i ; j+ )/* 內存循環:控制輸出的等式數內存循環:控制輸出的等式數 */printf( %d+%d=%2d , i, j, i+j ); /* 輸出具體內容輸出具體內容 */printf( n );/* 每行最后應有一個回車換行每行最后應有一個回車換行 */3333梯形打印梯形打印l例例4.10 梯形打印。梯形打印。要求打印如下所示的等腰梯形。要求打印如

19、下所示的等腰梯形。 * * *l分析:本圖形共分析:本圖形共4行,所以行,所以外層循環控制變量外層循環控制變量i從從1變化到變化到4。對每一行來說,它由空格、星號。對每一行來說,它由空格、星號和回車組成,空格和星號的數量不相等,因此和回車組成,空格和星號的數量不相等,因此內存循環需要兩個,分別用來控制空格數和星內存循環需要兩個,分別用來控制空格數和星號數。號數。3434例例4.10主要代碼主要代碼int i, j;for ( i = 1 ; i = 4 ; i+ )/* 外層循環:控制行數外層循環:控制行數 */for ( j = 1 ; j = 4-i ; j+ ) /* 內層循環:控制空格

20、數內層循環:控制空格數 */printf( );/* 輸出空格輸出空格 */for ( j = 1 ; j = 2*i+1 ; j+ )/* 內層循環:控制星號數內層循環:控制星號數 */printf( * );/* 輸出星號輸出星號 */printf( n );/* 輸出回車輸出回車 */3535內容提要內容提要l語句與程序流程語句與程序流程l順序結構順序結構l選擇結構選擇結構l循環結構循環結構lbreak與與continuel應用舉例應用舉例3636break與與continuelbreak與與continue是兩個較為特殊的流程是兩個較為特殊的流程控制關鍵詞,主要用于循環的中斷控制。控制

21、關鍵詞,主要用于循環的中斷控制。l兩者的區別是:兩者的區別是:break是結束本層循環體的是結束本層循環體的運行,退出本層循環運行,退出本層循環;continue只是結束只是結束本次循環體的運行,并未退出循環體本次循環體的運行,并未退出循環體。3737breakbreak語語句和句和continuecontinue語語句句 continue和break的區別continue語句只結束本次循環,而不是終止整個循環的執行。 while(表達式1) for if(表達式2) continue; 0breakbreak語語句和句和continuecontinue語語句句 continue和break的

22、區別 break語句則是結束整個循環過程,不再判斷執行循環的條件是否成立。 while(表達式1) for if(表達式2) break; break#include int main( )int i, n;for ( i = 1 ; i = 5 ; i+ )printf( Enter n : );scanf( %d, &n );if ( n 0 )break;printf( n = %dn, n );printf( The end.n );return 0;4040運行結果運行結果Enter n : 3n = 3Enter n : 4n = 4Enter n : -5The end.

23、continue#include int main( )int i, n;for ( i = 1 ; i = 5 ; i+ )printf( Enter n : );scanf( %d, &n );if ( n 1),用),用2 去除它,如果存在去除它,如果存在可以整除的情況,則可以整除的情況,則n不是質數,否則必為不是質數,否則必為質數。質數。4545n例例4.12主要代碼主要代碼k = (int)sqrt(n);for ( i = 2 ; i k )printf( %d is a prime.n, n );elseprintf( %d is not a prime.n, n );4

24、646例例4.12說明說明l本例需要確保本例需要確保n為正數。因此除了在輸入時為正數。因此除了在輸入時對用戶進行提示外,在讀取對用戶進行提示外,在讀取n時,也用時,也用dowhile循環對用戶輸入進行了判斷和限制。循環對用戶輸入進行了判斷和限制。l質數判斷是質數判斷是C語言中較為經典的題目,初學語言中較為經典的題目,初學者應認真加以領會并掌握。者應認真加以領會并掌握。4747窮舉法窮舉法l例例4.13 百錢百雞問題。百錢百雞問題。公雞公雞5錢一只,母雞錢一只,母雞3錢一只,小雞錢一只,小雞1錢三只。錢三只。一百錢買一百只雞,問公雞、母雞、小雞各幾一百錢買一百只雞,問公雞、母雞、小雞各幾只?只?

25、l分析:設公雞、母雞、小雞的數量分別為分析:設公雞、母雞、小雞的數量分別為a、b、c,則有,則有48481003/35100cbacba百錢百雞問題分析百錢百雞問題分析l方程數量少于變量個數,因此有多個解。方程數量少于變量個數,因此有多個解。l該方法的思路是,從問題出發,對原問題該方法的思路是,從問題出發,對原問題進行分析、建模,并對這個模型進行求解進行分析、建模,并對這個模型進行求解,以模型的解作為原問題的解。,以模型的解作為原問題的解。4949百錢百雞問題分析百錢百雞問題分析l在計算機領域中,解決此問題有另一個思在計算機領域中,解決此問題有另一個思路:首先判斷問題的解空間,也即解的可路:首

26、先判斷問題的解空間,也即解的可能范圍是多少,進而在此空間上搜尋符合能范圍是多少,進而在此空間上搜尋符合題意的解。題意的解。l窮舉法窮舉法就是這類方法的一個典型代表:它就是這類方法的一個典型代表:它把解空間之內的所有解都挨個嘗試一遍,把解空間之內的所有解都挨個嘗試一遍,判斷是否符合問題的要求,符合的就作為判斷是否符合問題的要求,符合的就作為求解結果。求解結果。5050百錢百雞問題分析百錢百雞問題分析l在本題中,在本題中,a、b、c的可能范圍分別是的可能范圍分別是0, 20、0, 33和和0, 100l這樣解空間就是這樣解空間就是0, 0, 00, 0, 120, 33, 100l在此空間內,符合

27、方程組的就是問題的解。在此空間內,符合方程組的就是問題的解。5151例例4.13主要代碼主要代碼int a, b, c;for ( a = 0 ; a = 20 ; a+ )for ( b = 0 ; b = 33 ; b+ )for ( c = 0 ; c = 100 ; c+)if ( a+b+c=100 & 15*a+9*b+c=300 )printf( %d, %d, %dn, a, b, c );5252例例4.13說明說明l在判斷解是否符合題目要求時,代碼中使在判斷解是否符合題目要求時,代碼中使用了用了15*a+9*b+c=300,而不是原先,而不是原先的第二個方程,這樣做是為了防止出現整的第二個方程,這樣做是為了防止出現整數除問題。數除問題。l本題可進一步優化:當本題可進一步優化:當a、b確

溫馨提示

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

評論

0/150

提交評論