第5章-循環(huán)結(jié)構(gòu)程序設(shè)計_第1頁
第5章-循環(huán)結(jié)構(gòu)程序設(shè)計_第2頁
第5章-循環(huán)結(jié)構(gòu)程序設(shè)計_第3頁
第5章-循環(huán)結(jié)構(gòu)程序設(shè)計_第4頁
第5章-循環(huán)結(jié)構(gòu)程序設(shè)計_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第5章章 循環(huán)結(jié)構(gòu)程序設(shè)計循環(huán)結(jié)構(gòu)程序設(shè)計 P1145.1 為什么需要循環(huán)控制為什么需要循環(huán)控制5.2 用用 while 語句實現(xiàn)循環(huán)語句實現(xiàn)循環(huán)5.3 用用do while 語句實現(xiàn)循環(huán)語句實現(xiàn)循環(huán)5.4 用用for 語句實現(xiàn)循環(huán)語句實現(xiàn)循環(huán)5.5 循環(huán)的嵌套循環(huán)的嵌套5.6 幾種循環(huán)的比較幾種循環(huán)的比較5.7 改變循環(huán)執(zhí)行狀態(tài)改變循環(huán)執(zhí)行狀態(tài) 5.8 循環(huán)程序舉例循環(huán)程序舉例習(xí)題習(xí)題5.1 為什么需要循環(huán)控制為什么需要循環(huán)控制 P114 在實際問題中,在實際問題中, 經(jīng)常會遇到許多具有規(guī)律性的經(jīng)常會遇到許多具有規(guī)律性的重復(fù)運算,重復(fù)運算, 因此在程序中就需要將某些語句重因此在程序中就需要

2、將某些語句重復(fù)執(zhí)行。復(fù)執(zhí)行。 循環(huán)語句由兩部分組成的:循環(huán)條件和循環(huán)體。循環(huán)語句由兩部分組成的:循環(huán)條件和循環(huán)體。 循環(huán)條件循環(huán)條件: : 決定循環(huán)體中的語句是否執(zhí)行的條件。決定循環(huán)體中的語句是否執(zhí)行的條件。 循環(huán)體循環(huán)體: : 一組被重復(fù)執(zhí)行的語句一組被重復(fù)執(zhí)行的語句。 *用循環(huán)算法來求用循環(huán)算法來求 5! P18 可以設(shè)兩個變量,一個變量可以設(shè)兩個變量,一個變量p表示結(jié)果其初值表示結(jié)果其初值為為1(被乘數(shù)),一個變量(被乘數(shù)),一個變量i代表乘數(shù)。代表乘數(shù)。 S1: 使使 p=1 (p稱為乘法器,其初值為稱為乘法器,其初值為1) S2: 使使 i=2 (生成乘數(shù),生成正整數(shù))(生成乘數(shù),生

3、成正整數(shù)) S3: 使使 pi,乘積仍放在變量,乘積仍放在變量p中,中, 可表示為可表示為 pi=p S4: 使使i的值加的值加1,即,即i+1 = i (i 同時也是控制變量)同時也是控制變量) S5: 如果如果i不大于不大于5,返回重新執(zhí)行步驟,返回重新執(zhí)行步驟S3以以及其后的步驟及其后的步驟S4和和S5;否則,算法結(jié)束。;否則,算法結(jié)束。 最后得到最后得到p的值就是的值就是 5! 的值。的值。 實現(xiàn)循環(huán)的方法:實現(xiàn)循環(huán)的方法: (1) 用用while()語句;語句; (2) 用用dowhile()語句;語句; (3) 用用for語句。語句。 在下面各節(jié)中將分別作介紹。在下面各節(jié)中將分別作

4、介紹。5.2 while語句語句 P115 while語句用來實現(xiàn)語句用來實現(xiàn)“當(dāng)型當(dāng)型”循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)。 其一般形式如下:其一般形式如下: while (表達(dá)式表達(dá)式) 語句語句 執(zhí)行過程:執(zhí)行過程: 計算計算表達(dá)式表達(dá)式的值的值 若若表達(dá)式表達(dá)式非非0, 0, 則執(zhí)行語句則執(zhí)行語句, , 然后轉(zhuǎn)然后轉(zhuǎn) 若若表達(dá)式表達(dá)式為為0, 0, 則退出循環(huán)則退出循環(huán), , 執(zhí)行該循環(huán)后的語句。執(zhí)行該循環(huán)后的語句。 其流程圖見圖其流程圖見圖5.2。 特點:特點:先判斷表達(dá)式,后執(zhí)行語句。先判斷表達(dá)式,后執(zhí)行語句。圖圖 5.25.2圖圖5.3例例5.1 求求n。P115用傳統(tǒng)流程圖和NS結(jié)構(gòu)流程圖表示

5、算法,見圖5.3(a)和圖5.3(b)。100n=1根據(jù)流程圖寫出程序:根據(jù)流程圖寫出程序:#include int main( ) int i=1,sum=0; while (i100”,因,因此在循環(huán)體中應(yīng)該有使此在循環(huán)體中應(yīng)該有使i增值以最終導(dǎo)致增值以最終導(dǎo)致i100的的語句,今用語句,今用“i+;”語句來達(dá)到此目的。語句來達(dá)到此目的。 如果無此語句,則如果無此語句,則i的值始終不改變,循環(huán)永不的值始終不改變,循環(huán)永不結(jié)束。結(jié)束。5.3 do while( ) 語句語句 P117一般形式為:一般形式為: do 循環(huán)體語句循環(huán)體語句 while (表達(dá)式表達(dá)式);執(zhí)行過程:執(zhí)行過程: 執(zhí)行

6、循環(huán)體執(zhí)行循環(huán)體 計算表達(dá)式值計算表達(dá)式值 若表達(dá)式的值為真若表達(dá)式的值為真( (非非0), 0), 則轉(zhuǎn)則轉(zhuǎn) 若表達(dá)式的值為假若表達(dá)式的值為假(0), (0), 則結(jié)束循環(huán)則結(jié)束循環(huán)可以用圖表示其流程??梢杂脠D表示其流程。請注意請注意do while循環(huán)用循環(huán)用NS流程圖的表示形式。流程圖的表示形式。特點:特點:是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。圖圖5.4例例5.3用用do while( )語句求語句求n。先畫出流程圖,見圖先畫出流程圖,見圖5.5。圖圖5.5圖圖5.6100n=1程序如下:程序如下:#include int main( )

7、int i,sum=0; i=1; do sum=sum+i; i+; while (i=100) ; printf(“%d”,sum); return(0); 在一般情況下,用在一般情況下,用while語句和用語句和用do-while語句處理同一問題時,若二者的循環(huán)體部語句處理同一問題時,若二者的循環(huán)體部分是一樣的,它們的結(jié)果也一樣。分是一樣的,它們的結(jié)果也一樣。 *但是如果但是如果while后面的表達(dá)式一開始就為后面的表達(dá)式一開始就為假假(0值值)時,兩種循環(huán)的結(jié)果是不同的。時,兩種循環(huán)的結(jié)果是不同的。例例5.3 while( ) 和和 do while( ) 循環(huán)的比較。循環(huán)的比較。(1

8、) #include #include int main ( ) int main( ) int sum=0,i; int sum=0,i; scanf(“%d”,&i); scanf(%d,&i); while (i=10) do sum=sum+i; sum=sum+i; i+; i+; while (i10時,二者結(jié)果就不同了。時,二者結(jié)果就不同了。5.4 * for 語語 句句 P120 C語言中的語言中的for語句使用最為靈活,不僅語句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循且可以用于循環(huán)次數(shù)不確定而只給

9、出循環(huán)結(jié)束條件的情況,它完全可以代替環(huán)結(jié)束條件的情況,它完全可以代替while語句。語句。 for語句的一般形式語句的一般形式: for(表達(dá)式表達(dá)式1;表達(dá)式;表達(dá)式2;表達(dá)式;表達(dá)式3) 語句語句執(zhí)行過程:執(zhí)行過程: (1)先求解表達(dá)式先求解表達(dá)式1。(2)求解表達(dá)式求解表達(dá)式2,若其值為真,若其值為真(值為非值為非0),則執(zhí)行,則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。若為假步。若為假(值為值為0),則結(jié)束循環(huán),轉(zhuǎn)到第,則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。步。(3) 求解表達(dá)式求解表達(dá)式3。(4) 轉(zhuǎn)回上面第轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。步驟繼

10、續(xù)執(zhí)行。(5) 循環(huán)結(jié)束,執(zhí)行循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句。語句下面的一個語句。for語句的執(zhí)行過程語句的執(zhí)行過程 可以用圖可以用圖5.8來表來表示示for語句的執(zhí)行語句的執(zhí)行過程。過程。圖圖5.8for語句一般的應(yīng)用形式語句一般的應(yīng)用形式 for ( 循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 語句語句 例如例如: int sum=0; for( i=1; i=100 ; i+) sum=sum+i ; 可以看到它相于以下可以看到它相于以下while語句:語句: int sum=0; i=1; while (i=100) sum=sum+i; i

11、+; 說明:說明:P121 (1)對于以上)對于以上for語句的一般形式語句的一般形式 for ( 循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 語句語句 也可以改寫為也可以改寫為while循環(huán)的形式:循環(huán)的形式: 表達(dá)式表達(dá)式1; while (表達(dá)式表達(dá)式2) 語句語句 表達(dá)式表達(dá)式3; (2)for語句的一般形式中的語句的一般形式中的“表達(dá)式表達(dá)式1”可以省略,此時應(yīng)在可以省略,此時應(yīng)在for語句之前給語句之前給循環(huán)變量賦初值。循環(huán)變量賦初值。 注意:省略表達(dá)式注意:省略表達(dá)式1時,時, 其后的分號不能省略。其后的分號不能省略。 如如 : sum=0;

12、i=1; for( ;i=100 ; i+ ) sum=sum+i; 執(zhí)行時,跳過執(zhí)行時,跳過“求解表達(dá)式求解表達(dá)式1”這一步,這一步,其他不變。其他不變。(3) 如果表達(dá)式如果表達(dá)式2省略,即不判斷循環(huán)條省略,即不判斷循環(huán)條件,件, 循環(huán)無終止地進行下去。循環(huán)無終止地進行下去。 也就是認(rèn)為表達(dá)式也就是認(rèn)為表達(dá)式2始終為真。始終為真。 例如:例如: sum=0; for ( i=1 ; ; i+) sum= sum + i; 表達(dá)式表達(dá)式1是一個賦值表達(dá)式,表達(dá)式是一個賦值表達(dá)式,表達(dá)式2空缺??杖?。 它相當(dāng)于:它相當(dāng)于: sum=0; i=1; while (1) sum=sum+i; i+

13、; 圖圖5.95.9 (4) 表達(dá)式表達(dá)式3也可以省略,此時程序設(shè)計者應(yīng)另外增也可以省略,此時程序設(shè)計者應(yīng)另外增加語句,以便保證循環(huán)能正常結(jié)束。加語句,以便保證循環(huán)能正常結(jié)束。 如:如: sum=0; for (i=1; i=100; ) sum=sum+i; i+; (5)可以省略表達(dá)式)可以省略表達(dá)式1和表達(dá)式和表達(dá)式3,只有表達(dá)式,只有表達(dá)式2,即只,即只給循環(huán)條件。如:給循環(huán)條件。如: sum=0; i=1; sum=0; i=1; for( ; i=100; ) while(i=100) sum=sum+i; 相當(dāng)于相當(dāng)于 sum=sum+i; i+; i+; 在這種情況下,完全等同

14、于在這種情況下,完全等同于while語句。語句。 但但for語句比語句比while語句功能強,除了可以給出循環(huán)條件外,還語句功能強,除了可以給出循環(huán)條件外,還可以賦初值,使循環(huán)變量自動增值等??梢再x初值,使循環(huán)變量自動增值等。(6)*三個表達(dá)式都可省略。三個表達(dá)式都可省略。 如:如: for( ; ; ) 語句語句 相當(dāng)于:相當(dāng)于: while (1) 語句語句 即不設(shè)初值,不判斷條件即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式認(rèn)為表達(dá)式2為真值為真值),循,循環(huán)變量不增值。環(huán)變量不增值。 無終止地執(zhí)行循環(huán)體。無終止地執(zhí)行循環(huán)體。 (7) 表達(dá)式表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表可以是設(shè)置循環(huán)變量初

15、值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。 如如: i=1; for (sum=0; i=100; i+) sum=sum+i; 表達(dá)式表達(dá)式3也可以是與循環(huán)控制無關(guān)的任意表達(dá)式。也可以是與循環(huán)控制無關(guān)的任意表達(dá)式。 (8)表達(dá)式)表達(dá)式1和表達(dá)式和表達(dá)式3可以是一個簡單的表達(dá)可以是一個簡單的表達(dá)式,也可以是逗號表達(dá)式,即包含一個以上的簡式,也可以是逗號表達(dá)式,即包含一個以上的簡單表達(dá)式,中間用逗號間隔。單表達(dá)式,中間用逗號間隔。 例:例: for(sum=0,i=1; i=100; i+) sum=sum+i; (9) 表達(dá)式表達(dá)式2一般是

16、關(guān)系表達(dá)式一般是關(guān)系表達(dá)式 ( 如如 i=100 ) 或邏輯表達(dá)式或邏輯表達(dá)式 ( 如如ab & xy ) , 但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零,就執(zhí)行循環(huán)體。其值為非零,就執(zhí)行循環(huán)體。 for( i=0 ;(c=getchar()!=n ; i+=c ); for( ; (c=getchar( )!=n; ) printf(%c,c); 分析下面兩個例子:分析下面兩個例子: for( i=0 ;(c=getchar()!=n ; i+=c ); 在表達(dá)式在表達(dá)式2中先從終端接收一個字符賦給中先從終端接收一個字符賦給c,然后,然后判斷此賦值

17、表達(dá)式的值是否不等于判斷此賦值表達(dá)式的值是否不等于n(換行換行符符),如果不等于,如果不等于n,就執(zhí)行循環(huán)體。,就執(zhí)行循環(huán)體。 它的作用是不斷輸入字符,將它們的它的作用是不斷輸入字符,將它們的ASCII碼相碼相加,直到輸入一個加,直到輸入一個“換行換行”符為止。符為止。 注意:注意:此此for語句的循環(huán)體為空語句,把本來要語句的循環(huán)體為空語句,把本來要在循環(huán)體內(nèi)處理的內(nèi)容放在表達(dá)式在循環(huán)體內(nèi)處理的內(nèi)容放在表達(dá)式3中,作用是中,作用是一樣的。一樣的。 for( ; (c=getchar( )!=n; ) printf(%c,c); 只有表達(dá)式只有表達(dá)式2,而無表達(dá)式,而無表達(dá)式1和表達(dá)式和表達(dá)式

18、3。 其作用是每讀入一個字符后立即輸出該字符,其作用是每讀入一個字符后立即輸出該字符,直到輸入一個直到輸入一個“換行換行”為止。為止。 *請注意請注意: 從終端鍵盤向計算機輸入時,是在從終端鍵盤向計算機輸入時,是在按按Enter鍵以后才送到內(nèi)存緩沖區(qū)中去的。鍵以后才送到內(nèi)存緩沖區(qū)中去的。 運行情況:運行情況: computer (輸入輸入) computer (輸出輸出) 而不是而不是 ccoommppuutteerr強調(diào)強調(diào): 運行情況:運行情況: computer (輸入輸入) computer (輸出輸出) 而不是而不是 ccoommppuutteerr 即不是從終端敲入一個字符馬上輸出

19、一個即不是從終端敲入一個字符馬上輸出一個字符,而是按字符,而是按Enter鍵后數(shù)據(jù)送入內(nèi)存緩沖鍵后數(shù)據(jù)送入內(nèi)存緩沖區(qū),然后每次從緩沖區(qū)讀一個字符,再輸區(qū),然后每次從緩沖區(qū)讀一個字符,再輸出該字符。出該字符。強調(diào)強調(diào) P124 (10) C99 允許在允許在 for 語句的語句的 表達(dá)式表達(dá)式1中定義變中定義變量并賦初值。量并賦初值。 例如:例如: for ( int i=1; i=100; i+) sum = sum + i;顯然,這課使程序簡練、靈活、方便。顯然,這課使程序簡練、靈活、方便。所定義的變量只限于所定義的變量只限于for循環(huán)中,在循環(huán)外不能循環(huán)中,在循環(huán)外不能使用此變量。使用此變

20、量。5.5 循環(huán)的嵌套循環(huán)的嵌套 P124 一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。這就是多層循環(huán)。 三種循環(huán)三種循環(huán)(while循環(huán)、循環(huán)、dowhile循環(huán)和循環(huán)和for循環(huán)循環(huán))可可以互相嵌套。以互相嵌套。 例如,下面幾種都是合法的形式:例如,下面幾種都是合法的形式:(1) while( ) while( ) (2) do do while( ); while( );(3) for(;) for(; ;) (4) while( ) do whil

21、e( ); (5) for(; ;) while( ) (6) do for (; ;) while( );5.6 幾種循環(huán)的比較幾種循環(huán)的比較 P122(1) 三種循環(huán)都可以用來處理同一問題。三種循環(huán)都可以用來處理同一問題。 一般情況下它們可以互相代替。一般情況下它們可以互相代替。(2) while( )和和dowhile( )循環(huán),只在循環(huán),只在while后面指后面指定循環(huán)條件,在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束定循環(huán)條件,在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束的語句的語句(如如i+,或,或i=i+1等等)。 for循環(huán)可以在表達(dá)式循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束中包含使循環(huán)趨于結(jié)束的操作,甚至

22、可以將循環(huán)體中的操作全部放到表的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式達(dá)式3中。中。 因此因此for語句的功能更強,凡用語句的功能更強,凡用while循環(huán)能完循環(huán)能完成的,用成的,用for循環(huán)都能實現(xiàn)。循環(huán)都能實現(xiàn)。續(xù)續(xù)(3) 用用while( )和和dowhile( )循環(huán)時,循環(huán)變量初循環(huán)時,循環(huán)變量初始化的操作應(yīng)在始化的操作應(yīng)在while( )和和dowhile( )語句之語句之前完成。前完成。 而而for語句可以在表達(dá)式語句可以在表達(dá)式1中實現(xiàn)循環(huán)變量的初中實現(xiàn)循環(huán)變量的初始化。始化。(4) while( )循型、循型、dowhile( )循環(huán)和循環(huán)和for循環(huán),循環(huán),可以用可以

23、用break語句跳出循環(huán),用語句跳出循環(huán),用continue語句結(jié)語句結(jié)束本次循環(huán)。束本次循環(huán)。5.7 改變循環(huán)執(zhí)行的狀態(tài)改變循環(huán)執(zhí)行的狀態(tài)5.7.1 break語句提前終止循環(huán)語句提前終止循環(huán) P126 一般形式:一般形式: break ; 說明:說明: break語句只能用于循環(huán)語句語句只能用于循環(huán)語句 (while, for ,dowhile) 和和switch語句中。語句中。功能:功能: break語句可以使流程跳出語句可以使流程跳出switch結(jié)構(gòu),結(jié)構(gòu),繼續(xù)執(zhí)行繼續(xù)執(zhí)行switch語句下面的一個語句。語句下面的一個語句。 break語句還可以用來從循環(huán)體內(nèi)跳出循語句還可以用來從循環(huán)

24、體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),環(huán)體,即提前結(jié)束循環(huán), 接著執(zhí)行循環(huán)下面的語句。接著執(zhí)行循環(huán)下面的語句。計算計算 r=1 到到 r=10 時的圓面積,直到面積時的圓面積,直到面積area大于大于100為止。為止。如:如:pi=3.1415;for(r=1; r100) break; printf(%f,area); 從上面的從上面的for循環(huán)可以看到:循環(huán)可以看到:當(dāng)當(dāng)area100時,執(zhí)行時,執(zhí)行break語句,提前結(jié)束循語句,提前結(jié)束循環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。環(huán),即不再繼續(xù)執(zhí)行其余的幾次循環(huán)。5.7.2 continue語句語句 P127一般形式:一般形式: continue;作

25、用作用: 為結(jié)束本次循環(huán),即跳過循環(huán)體中下面為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定。環(huán)的判定。continue語句和語句和break語句的區(qū)別是語句的區(qū)別是: continue語句只結(jié)束本次循環(huán),而不是終止整語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。個循環(huán)的執(zhí)行。 break語句則是結(jié)束整個循環(huán)過程,不再判斷語句則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。執(zhí)行循環(huán)的條件是否成立。 如果有以下兩個循環(huán)結(jié)構(gòu):如果有以下兩個循環(huán)結(jié)構(gòu): (1) while (表達(dá)式表達(dá)式1) 語句組語句組1 if (表達(dá)

26、式表達(dá)式2) break; 語句組語句組2 (2) while (表達(dá)式表達(dá)式1) 語句組語句組1 if (表達(dá)式表達(dá)式2) continue; 語句組語句組2 圖圖5.13圖圖5.14程序(1)的流程圖如圖5.13所示,而程序(2)的流程如圖5.14所示。注意注意: 圖圖5.13 和和 圖圖5.14 中當(dāng)中當(dāng)“表達(dá)式表達(dá)式2”為真時流程的轉(zhuǎn)向。為真時流程的轉(zhuǎn)向。例例5.5 P127把把100200之間的不能被之間的不能被3整除的數(shù)輸出。整除的數(shù)輸出。#include int main( ) int n; for ( n=100; n=200; n+) if (n%3=0) continue;

27、 printf(%d,n); return(0); 5.8 程序舉例程序舉例 P131 例例5.7 P131 用用/41-1/3+1/5-1/7+公式求公式求的近似值,的近似值,直到最后一項的絕對值小于直到最后一項的絕對值小于10-6為止。為止。 用用N-S結(jié)構(gòu)化流程圖表示算法結(jié)構(gòu)化流程圖表示算法(見圖見圖5.15)。N-S結(jié)構(gòu)化流程圖結(jié)構(gòu)化流程圖圖圖 5.15/ 程序如下:程序如下:#include int main( ) int s; float n,t,pi; t=1;pi=0; n=1.0; s=1; while ( (fabs(t) ) 1e-6 ) pi=pi+t; n=n+2;

28、s=-s; t=S/n; pi=pi*4; printf( “pi=%10.6fn,pi); return(0);/*運行結(jié)果為:運行結(jié)果為: pi= 3.141594 */例例5.8 求求 fibonacci 數(shù)列數(shù)列 40個數(shù)。個數(shù)。 P133這個數(shù)列有如下特點:第這個數(shù)列有如下特點:第1,2兩個數(shù)為兩個數(shù)為1,1。從第從第3個數(shù)開始,該數(shù)是其前面兩個數(shù)之和。個數(shù)開始,該數(shù)是其前面兩個數(shù)之和。即即: f1=1 (n=1) f2=1 (n=2) fn=fn-1+fn-2 (n3)這是一個有趣的古典數(shù)學(xué)問題:這是一個有趣的古典數(shù)學(xué)問題:有一對兔子,從出生后第有一對兔子,從出生后第3個月起每個月

29、都生一個月起每個月都生一對兔子。小兔子長到第對兔子。小兔子長到第3個月后每個月又生一個月后每個月又生一對兔子。對兔子。假設(shè)所有兔子都不死,問每個月的兔子總數(shù)為假設(shè)所有兔子都不死,問每個月的兔子總數(shù)為多少?解此題的算法如圖多少?解此題的算法如圖5.16所示。所示。圖圖5.16程序如下程序如下:#include int main( ) long int f1,f2; int i; f1=1;f2=1; for(i=1; i=20; i+) printf(%12ld %12ld ,f1,f2); if (i%2=0) printf(n); f1=f1+f2; f2=f2+f1; return(0);

30、運行結(jié)果為:運行結(jié)果為: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 57022887 9227465 14930352 24157817 39088169 63245986 102334155 程序中在程序中在printf函數(shù)中輸出格式符用函數(shù)中輸出格式符用“%12 ld”,而不是用,而不是用“%12d”, 在在Turbo C

31、這是由于在第這是由于在第23個數(shù)之后,整數(shù)個數(shù)之后,整數(shù)值已超過整數(shù)最大值值已超過整數(shù)最大值32767,因此必須用,因此必須用“%ld”格式輸出。格式輸出。 if 語句的作用是使輸出語句的作用是使輸出4個數(shù)后換行。個數(shù)后換行。 i是循環(huán)變量,當(dāng)是循環(huán)變量,當(dāng)i為偶數(shù)時換行,而為偶數(shù)時換行,而i每增值每增值1,就要計算和輸出就要計算和輸出2個數(shù)個數(shù)(f1,f2),因此,因此i每隔每隔2換一次行相當(dāng)于每輸出換一次行相當(dāng)于每輸出4個數(shù)后換行輸出。個數(shù)后換行輸出。 例例5.9 輸入一個大于輸入一個大于3的數(shù)的數(shù)m,判斷,判斷m是否素數(shù)。是否素數(shù)。P135 算法如圖算法如圖5.19所示。所示。圖5.19

32、 *我們采用的算法是這樣的:我們采用的算法是這樣的: 讓讓m被被2到到k 除,如果除,如果m能被能被2k 之中任何一個之中任何一個整數(shù)整除,則提前結(jié)束循環(huán),整數(shù)整除,則提前結(jié)束循環(huán), 此時,此時, i必然小于或等于必然小于或等于k(即即m); 如果如果m不能被不能被2k(即即m)之間的任一整數(shù)整除,之間的任一整數(shù)整除,則在完成最后一次循環(huán)后,則在完成最后一次循環(huán)后, 此時,此時,i還要加還要加1,因此,因此i=k+1,然后才終止循環(huán)。,然后才終止循環(huán)。*因此,在循環(huán)之后判別因此,在循環(huán)之后判別 i 的值是否大于或等于的值是否大于或等于k+1,就可知就可知 m 是否素數(shù)。是否素數(shù)。 若是,則表明

33、未曾被若是,則表明未曾被2k之間任一整數(shù)整除過,之間任一整數(shù)整除過,因此輸出因此輸出“是素數(shù)是素數(shù)”。 否則,輸出否則,輸出“不是素數(shù)不是素數(shù)”。程序如下:程序如下:#include #include int main( ) int m,i,k; scanf(%d,&m); k=sqrt(m); for (i=2;i=k;i+) if (m%i=0) break; if (i=k) printf(%d is not a Prime numbern,m); else printf(%d is a Prime mubern,m); return(0); 運行情況如下:運行情況如下:1717 is

34、a Prime number 例例5.10 求求100200間的全部素數(shù)。間的全部素數(shù)。 P137 在例在例5.9的基礎(chǔ)上,對本題用一個嵌套的的基礎(chǔ)上,對本題用一個嵌套的for循環(huán)即可處理。循環(huán)即可處理。程序如下:程序如下: #include #include int main() int m,k,i,n=0; for (m=101; m=200; m=m+2) k=sqrt(m); for (i=2;i=k+1) printf(%d ,m); n=n+1; if (n%10=0) printf(n); printf (n); return(0); 運行結(jié)果如下:運行結(jié)果如下:101 103

35、107 109 113 127 131 137 139 149151 157 163 167 173 179 181 191 193 197199 n的作用是累計輸出素數(shù)的個數(shù),控制每行的作用是累計輸出素數(shù)的個數(shù),控制每行輸出輸出10個數(shù)據(jù)。個數(shù)據(jù)。 例例5.11 電文加密(電文解密)。電文加密(電文解密)。P138 為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密為使電文保密,往往按一定規(guī)律將其轉(zhuǎn)換成密碼,收報人再按約定的規(guī)律將其譯回原文。碼,收報人再按約定的規(guī)律將其譯回原文。 加密方法:可以按以下規(guī)律將電文變成密碼,加密方法:可以按以下規(guī)律將電文變成密碼, 將字母將字母A變成字母變成字母E,a變成

36、變成e,即變成其后的第,即變成其后的第4個字母;個字母; W變成變成A,X變成變成B,Y變成變成C,Z變成變成D。 見圖見圖5.20。 字母按上述規(guī)律轉(zhuǎn)換,非字母字符不變。字母按上述規(guī)律轉(zhuǎn)換,非字母字符不變。 如如 “china!” 轉(zhuǎn)換為轉(zhuǎn)換為 “Glmre!” 。 輸入一行字符,要求輸出其相應(yīng)的密文輸入一行字符,要求輸出其相應(yīng)的密文(碼碼)。圖圖5.20#include int main() char c; c=getchar(); while ( c !=n ) if(c=a & c=A & cW & cw&c=z) c=c-22; /*/ else c=c+4; printf(%c,c

37、); c=getchar(); printf(“n”); return(0);運行結(jié)果如下:運行結(jié)果如下: China! Glmre!第第5章章 作業(yè)作業(yè) 完成下列題目的編程。完成下列題目的編程。 ( P140-P141) 5.5題題 要求要求 a、n由健盤輸入由健盤輸入 5.8題題 5.11題題 5.12題題 5.16題題 要求圖形輸出的行數(shù)要求圖形輸出的行數(shù)n由健盤輸入由健盤輸入備用備用分析下列程序段寫出結(jié)果#include int main() int n=0; while (n=1) n+; printf(“%dt”,n); return(0); 運行結(jié)果:1 2說明:留心“邊界值”2. #include int main( ) int

溫馨提示

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

最新文檔

評論

0/150

提交評論