05循環(huán)程序設計.ppt_第1頁
05循環(huán)程序設計.ppt_第2頁
05循環(huán)程序設計.ppt_第3頁
05循環(huán)程序設計.ppt_第4頁
05循環(huán)程序設計.ppt_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、循環(huán)程序設計,5,目錄,5.1 概述,計算機程序由若干語句順序組成。順序結(jié)構的程序只能按照語句的先后順序從前向后依次執(zhí)行,分支結(jié)構程序雖然允許在執(zhí)行了某個判斷后跳過某些語句執(zhí)行后面的語句,但也只能按語句的前后次序執(zhí)行。有時,需要在程序中重復執(zhí)行某個語句或語句塊,就需要循環(huán)結(jié)構。,生活中的例子,擊鼓傳花:大家坐成一個圈,鼓聲響起的時候?qū)⒒ㄊ樞蚪坏较乱粋€人的手里,依次向下傳遞,當鼓聲突然中斷時停止傳花,花束落在誰的手里便成為輸家 4100米接力賽跑:第1個人跑完100米后將接力棒傳給第2個人,第2個人再跑100米,然后是第3個人,直到第4個人跑完最后一個100米,計算sum=1+2+3+100,

2、1,計算sum=1+2+3+100,1,#include void main( ) int i=1, sum=0 ; while ( i = 100 ) sum = sum + i ; i+ ; printf ( “Sum = %d n”, sum ) ; ,循環(huán)體,循環(huán)控制條件,循環(huán)控制變量,循環(huán)的初始化,計算sum=2+4+6+100,2,#include void main( ) int i=0, sum=0 ; while ( i = 100 ) sum = sum + i ; i+=2 ; printf ( “Sum = %d n”, sum ) ; ,循環(huán)次數(shù)取決于循環(huán)控制變量,5

3、.2 while語句和do-while語句,格式: while( 表達式 ) 語句 do 語句 while( 表達式 ) ;,說明: 括號中的“表達式”是循環(huán)控制條件,但不限于關系表達式和邏輯表達式 “語句”是單一語句,但可以是復合語句 如果while語句的括號后面只有“;”,則循環(huán)體為空。如果do-while語句的括號后面(分號前面)還有其他符號,則出現(xiàn)語法錯誤,while語句的執(zhí)行過程,while語句的執(zhí)行過程是: 計算“表達式”的值; 若“表達式”的值不時0,為“真”,繼續(xù)執(zhí)行;否則,結(jié)束循環(huán),轉(zhuǎn)到while語句后面的語句繼續(xù)執(zhí)行程序; 執(zhí)行“語句”部分,即執(zhí)行循環(huán)體; 返回繼續(xù)執(zhí)行。,

4、do-while語句的執(zhí)行過程,循環(huán)語句的特點,while循環(huán)是“先判斷后循環(huán)”,如果開始時循環(huán)條件不滿足,循環(huán)體就一次也不執(zhí)行 do-while循環(huán)是“先循環(huán)后判斷”,即使第一次判斷的結(jié)果為“假”,循環(huán)體也已經(jīng)執(zhí)行了一次 但不論哪種循環(huán),循環(huán)體中必須包含能夠使循環(huán)條件變?yōu)椤凹佟钡倪\算,循環(huán)的變化形式計算sum=1+2+3+100,3,#include void main( ) int i=1, sum=0 ; while ( i= 100 ) sum = sum + i+ ; printf ( “Sum = %d n”, sum ) ; ,#include void main( ) int

5、i=1, sum=0 ; do sum = sum + i ; i+; while ( i= 100 ); printf ( “Sum = %d n”, sum ) ; ,循環(huán)的嵌套,如果在一個循環(huán)的循環(huán)體內(nèi)包含另一個完整的循環(huán)則稱為循環(huán)的嵌套,其中被嵌套的循環(huán)稱為內(nèi)循環(huán),而嵌套了內(nèi)循環(huán)的是外循環(huán) 內(nèi)循環(huán)還可以嵌套循環(huán),形成多級(層)嵌套,順序打印110的階乘,即1!、2!、10!,4,本題的關鍵是求階乘 數(shù)學上,n!=123(n-1)n,外循環(huán),內(nèi)循環(huán),#include void main( ) int i=1, j ; float f ; while( i = 10 ) j = 1; f

6、= 1; while( j = i ) f = f * j; j + ; printf( “ %2d! = %.0f n”, i, f ); i + ; ,對比程序: #include void main( ) int i=1; float f = 1; while( i = 10 ) f = f * i; printf( %2d! = %.0f n, i, f ); i + ; ,循環(huán)的嵌套不僅可以發(fā)生在相同語句之間,如while嵌套while、do-while嵌套do-while,while語句和do-while語句也可以互相嵌套 (1)while(.)(2)while() while()

7、do while(); (3)do(4)do while()do while() ; while() ;,錯誤的嵌 套形式,循環(huán)必須是完整的,不允許內(nèi)外循環(huán)交叉嵌套 f = 1; while( i 10) i=1; do f = f * i; i +; while( i10 );,混亂的控 制條件,內(nèi)外循環(huán)的循環(huán)控制條件通常是分開的,相對獨立的 i=1; s=0; while ( i 3 ) s = s + f; i = 1; f=1; while( i5) i +=2; f = f * i; i+ ;,應用舉例,方法一:將輸入的5位數(shù)看作是5個獨立的數(shù)字字符,依次讀取每一個數(shù)字字符,將其轉(zhuǎn)化

8、為對應的數(shù)字后再求和 將數(shù)組字符ch轉(zhuǎn)化為數(shù)字的方法為ch-0,輸入一個5位數(shù),計算并輸出各位的和,5,#include void main( ) char ch ; int i=0, sum = 0; printf(“Enter a number with 5 digits: ”); while( i 5 ) ch = getchar( ); sum += ch - 0 ; /* 將數(shù)字字符轉(zhuǎn)化為對應的數(shù)字 */ i+ ; printf( “Sum of these 5 digits is %dn”, sum ) ; ,幾種常見運算: 如果ch為數(shù)字字符,則表達式ch - 0的值為對應的數(shù)字

9、 如果ch為大寫字母,則表達式 ch-A+z 為對應的小寫字母 如果ch為小寫字母,則表達式 ch-a+A 為對應的大寫字母,方法二:將輸入的5位數(shù)看作一個整數(shù),先讀取該整數(shù),再分離出各位數(shù)字 對于整數(shù)x,其個位數(shù)為 x%10 要求整數(shù)x的十位數(shù),可以先令x=x/10,再求x的個位數(shù),輸入一個5位數(shù),計算并輸出各位的和,5,#include void main( ) int x, x1, r, sum = 0; printf(Enter a number: ); scanf( %d, ,任意輸入一行字符,統(tǒng)計字母a和A的個數(shù),6,#include void main( ) char ch; i

10、nt count=0; printf( Enter characters: ); do ch = getchar( ); if( ch=A | ch=a ) count+; while( ch != n ); printf( Counter of a or A: %dn , count ); ,利用公式 求 的近似值,7,分析:等式右邊的第n項為 因此可將公式變形為 如何計算(-1)n+1 呢?可能首先想到的是用指數(shù)運算,其實大可不必,可以取f的初值為-1,那么第1項為f=-f,第2項也是f=-f,,#include void main( ) int f = -1, n =1 ; float

11、t, pi = 0 ;/* t為最后一項的值 */ do f = -f ;/* 第n項的符號 */ t = 1.0 / ( 2*n -1 ) ;/* 用1.0是為了避免整除 */ pi += f * t ; n+ ; while( t 1e-5 ); pi = 4 * pi ; printf( PI = %.4f n, pi ) ; ,5.3 for語句,for語句是最常用的循環(huán)控制語句。for語句的功能強大,使用靈活,變化多樣,for語句的用法,for( 表達式1 ; 表達式2 ; 表達式3 ) 語句 “表達式1”用于循環(huán)的初始化 “表達式2”是for語句的循環(huán)控制條件,可以是任何形式的表達

12、式 “表達式3”用于修改循環(huán)控制變量的值,目的是使“表達式2”的值變?yōu)?,以結(jié)束循環(huán) “語句”部分是for語句的循環(huán)體,可以是單一語句,也可以是復合語句,for語句的執(zhí)行過程,使用for語句編程計算sum=1+2+3+100,8,#include void main( ) int i, sum=0 ; for( i =1 ; i=100 ; i+) sum += i ; printf( Sum = %d n, sum ); ,任意輸入10個數(shù),求平均值,9,#include void main( ) int i ; float x, sum=0 ; printf( Enter 10 numbe

13、rs one by one: n ); for( i =1 ; i=10 ; i+) scanf( %f, ,循環(huán)的嵌套,for語句可以嵌套for語句構成循環(huán)的嵌套,也可以與while語句、do-while語句互相嵌套,順序打印110的階乘,即1!、2!、10!,10,#include void main( ) int i, j ; float f ; for( i=1; i = 10 ; i+ ) f = 1; for( j=1; j = i ; j+ ) f = f * j; printf( %2d! = %.0f n, i, f ); ,#include void main( ) int

14、 i=1, j ; float f ; while( i = 10 ) j = 1; f = 1; while( j = i ) f = f * j; j + ; printf( “ %2d! = %.0f n”, i, f ); i + ; ,打印幾何圖形,11,對于這類問題,每行中星號的個數(shù)、總行數(shù)等都應該用循環(huán)結(jié)構進行控制,而不是直接輸出若干行字符串,#include void main( ) int i, j ; for(i=1; i = 4; i+ ) for( j = 0; ji ; j+ ) putchar( ); for( j = 1; j=6 ; j+ ) putchar(*

15、); putchar(n); ,甲、乙兩個會計進行點鈔票比賽,甲的速度為5張/秒,乙為8張/秒。乙在甲已經(jīng)點了100張鈔票后才開始,問:要多長時間乙就可以超過甲?,12,經(jīng)過 t 秒,甲點過的鈔票數(shù)有 x=100+5t 張,乙的為 y=8t 張 問題就是求 yx 時的 t 值,#include void main( ) int t ; int x=100, y=0 ; for( t=0 ; x y ; t+ ) x = 100+5*t ; y = 8 * t; printf( Time is %d secondsn, t); ,for語句的變化形式,可以省略for語句的“表達式1”或“表達式3

16、”,也可以都省略(相當于while語句),#include void main( ) char ch ; for( ; (ch=getchar( ) ) !=n ; ) putchar( ch ) ; ,將用鍵盤輸入的若干字符順序輸出到屏幕上,13,如果省略“表達式2”,則循環(huán)控制條件總為“真”,下面的語句是“合法”的,但構成了“死循環(huán)”: for( i=1; ; i+) sum += i ;,下面的程序在運行時會因為“除以零”而出錯: #include void main( ) char i ; int sum=0 ; for( i=1; ; i+)sum += 1000 / i ; pri

17、ntf( sum=%d n, sum); ,5.4 循環(huán)的控制,復雜的循環(huán)控制條件 對循環(huán)的控制問題,不僅僅是防止“死循環(huán)”,還包括選擇恰當?shù)臅r機,正確地結(jié)束循環(huán)有的時候,循環(huán)控制條件是復雜的,還可能是多種條件的綜合,假設每個班最多有30個人,依次輸入每個人的成績,如果輸入的不是0100之間的數(shù),或者已經(jīng)輸入了30個數(shù),則結(jié)束輸入,計算平均成績,14,#include void main( ) int i = 0, flag=1 ; float score, ave = 0 ; printf( Enter scores one by one:n ); while ( i 100 ) flag

18、= 0; else ave += score; i+ ; if( i 0 ) ave = ave / i; printf(Average: %.2fn, ave); ,【例】 輸入兩個正整數(shù) m 和 n,求其最大公約數(shù)和最小公倍數(shù)。,分析: 1. 用輾轉(zhuǎn)相除法求最大公約數(shù)。 m 對 n 求余數(shù)為 a,若a0,則 m n,n a,繼續(xù)求余;否則 n 為最大公約數(shù)。 例如,設 m=12, n=21,次數(shù)被除數(shù) 除數(shù) 余數(shù),1122112,2,21,12,9,3,12,9,3,4,9,3,0,3,注意 保留m、n的原始值,以便求最小公倍數(shù),#include main ( ) int m, n, m1

19、, n1, a; printf (輸入兩個正整數(shù):); scanf (%d, %d, ,【例】 輸入兩個正整數(shù) m 和 n,求其最大公約數(shù)和最小公倍數(shù)。,【例5.3 】用Newton迭代法求下面方程在1.5附近的近似根。 2x3 - 4x2 + 3x - 6 = 0,1.5 附近意為取初值 x0 = 1.5,2. 把 xn 存于變量 x 中,x存于 y 中,則容易求得 y: y = - f(x) / f (x) f(x) 應自己求,計算機不會求導,xn+1 = xn +x 即等于 x + y 此后 x 值已無用,可將 xn+1 的值存于 x 中。語句 x = x + y,xn+1,xn,x,3

20、. y是相鄰兩次迭代的差,可用 |y| 作迭代終止條件。,#include #include main ( ) float x, y, y1, eps ; printf (輸入 : ) ; scanf (%f, ,【例】 打印九九乘法口訣。,#include main ( ) int m, n; m = 1; while ( m =9 ) n = 1; while ( n = m ) printf (%1d%1d=%-4d, m, n, m*n ); n+; printf (n); m+; ,?,#include main ( ) int m, n; for ( m =1; m =9 ; m+

21、 ) for ( n = 1; n = m; n+ ) printf (%1d%1d=%-4d, m, n, m*n ); printf (n); m+; ,一. break 語句 用 break 語句可以結(jié)束 switch 結(jié)構和三種循環(huán)。,【例5.6】 判斷整數(shù) m 是否為素數(shù)。,因此,判斷 m 是否為素數(shù)的算法是: 1、依次用 2 k 之間的數(shù)整除 m,如果找到某個整數(shù) r 能整除 m,則 m 必不是素數(shù); 2、如果找不到 r,則可以斷定 m 為素數(shù)。,分析: 素數(shù)是能被其他整數(shù)整除的數(shù),即如果 m 是素數(shù),則必然存在 r、t(1 r、t m)使得 m = r t 成立,#include

22、 #include main ( ) int m, i, k; printf (輸入一個整數(shù):); scanf (%d, ,結(jié)束循環(huán),即轉(zhuǎn)到 for 循環(huán)的下一個語句 break 總是與 if 的一起使用,二. continue 語句 用 continue 語句可以結(jié)束本次循環(huán),即忽略循環(huán)體中剩余的語句。,【例】 打印 100200 之間不能被 3 整除的整數(shù)。,#include main ( ) int n; for ( n = 100; n = 200; n+) if ( n%3 = 0) continue; printf (%d , n); ,能整除,不打印,main() int i,j

23、,x=0; for(i=0;i2;i+) x+; for(j=0;j=3;j+) if(j%2) continue; x+; x+; printf(“x=%d”,x); ,第一次循環(huán) 第二次循環(huán) x=1 j=0 x=1 x=5 j=1 j=2 x=2 j=1 j=3 j=3 x=6 x=7 x=3 x=4 x=8,X=8,main(0 int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+; b+;break; case 3: a+;b+; printf(

24、“a=%d,b=%d”,a,b); ,a=2,b=1,【例】 按照下面的遞推公式,求 Fibonacci 數(shù)列1,1,2,3,5,8的前40項: F1 = 1n 1 F2 = 1n 2 Fn = Fn-1 + Fn-2n 3,分析,(4) 此數(shù)列增長很快,宜用長整型。每行輸出4個數(shù),即每輸出4個數(shù)后輸出一個換行符。,(1) F1、F2 直接賦值并輸出;,(2) 進行 19 次循環(huán),每次計算并輸出兩項;,(3) F3 = F1+ F2,此后 F1已無用,F(xiàn)3可存于 F1,即用語句F1 = F1+ F2,F4 = F2+ F3,F(xiàn)3已在 F1中,此后F2已無用,F(xiàn)4可存于F2,即用語句 F2 =

25、F2+F1,依此類推算出f5、f6直至f39、f40,#include main ( ) int i; long int f1, f2; f1 = 1; f2 = 1; printf (%16ld%16ld, f1, f2 ); for ( i = 2; i = 20; i+) f1 = f1 + f2; f2 = f2 + f1; printf (%16ld%16ld, f1, f2 ); if ( i % 2 = 0 ) printf (n); ,【例】 判斷m是否為素數(shù),【例】 求100200之間的全部素數(shù)。,#include #include main ( ) int m, i, k;

26、 printf (輸入一個整數(shù):); scanf (%d, else printf (%d不是素數(shù)n, m); ,int n=0;,for ( m = 101; m 200; m = m + 2 ) if ( n % 10 = 0 ) printf (n);,if ( i k ) printf (%6d, m ); n+; ,#include #include main ( ) int m, i, k, n = 0; for ( m = 101; m k ) printf (%6d, m); n+; ,【例】張丘建的“百雞問題”:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、母

27、、雛各幾何 ?,#include main ( ) int cocks = 0, hens, chicks; while (cocks = 19 ) hens = 0; while ( hens = 33 ) chicks = 100 - cocks - hens; if ( 5 * cocks + 3 * hens + chicks / 3 = 100 ) printf ( %d %d %dn, cocks, hens, chicks ); hens = hens + 1; cocks = cocks +1; ,順序打印1001000之間所有9的倍數(shù),如果一個數(shù)同時也是7的倍數(shù)則停止打印,1

28、6,#include void main( ) int i ; for( i=100; i1000; i+) if( i % 9 !=0 ) continue ; printf( %5d, i ) ; if( i % 7 =0 ) break; ,goto語句,goto語句是從早期程序設計語言遺留下來的一個語句,稱為無條件跳轉(zhuǎn)語句,已被淘汰 goto語句的使用格式是: goto 語句標號 ; “語句標號”是一個特殊的標識符,由字母、數(shù)字或下劃線組成(第一個字符不能是數(shù)字),后面跟冒號“:”,放在語句行的最前頭,#include void main( ) int i =100; while( i

29、1000 ) if( i % 9 !=0 ) goto Next ; printf( “%5d”, i ) ; Next:i +; ,打印所有的1001000之間的9的倍數(shù),18,谷角猜想:對于任意一個自然數(shù) n,若n為偶數(shù),則將其除以2;若n為奇數(shù),則將其乘以3,然后再加1。如此反復,經(jīng)過有限次運算后,總可以得到自然數(shù)1。試編程驗證之。,21,#include void main( ) int n ; printf( Enter a number: ) ; scanf( %d, ,5.6 程序調(diào)試,對于程序設計而言,即使優(yōu)秀的程序員也不能保證不會犯錯誤 一個優(yōu)秀的程序,不在于使用了先進的算法

30、,而在于僅僅包含少量的錯誤 程序中的錯誤是在所難免的,關鍵是發(fā)現(xiàn)并糾正錯誤 初學程序設計的人有必要從一開始就養(yǎng)成良好的習慣,培養(yǎng)嚴謹?shù)墓ぷ髯黠L,并逐步掌握一些編程技巧,程序調(diào)試的一般策略,程序中的錯誤一般可分為 語法錯誤比較容易發(fā)現(xiàn),通常,有語法錯誤的程序不能通過編譯和連接,也就不能生成可執(zhí)行的程序 邏輯錯誤又叫語義錯誤,也就是不能正確地表達所需要的功能,是較常見的錯誤之一。其外部表現(xiàn)為,程序可以運行,但有時出錯,有時又不出錯。邏輯錯誤通常比較難于被發(fā)現(xiàn),查錯和糾錯對任何程序員來說都是挑戰(zhàn) 設計錯誤比較少見,通常是由于對問題的分析不徹底造成的,糾正這類錯誤需要重新設計程序,調(diào)試程序的一般步驟為

31、: 靜態(tài)檢查,也就是人工檢查,是在完成程序設計后,在上機調(diào)試前,仔細地對程序代碼進行全面的檢查通過靜態(tài)檢查,不僅可以發(fā)現(xiàn)程序中的語法錯誤,也可以發(fā)現(xiàn)邏輯錯誤,甚至發(fā)現(xiàn)設計上的缺陷為便于查錯,應力求做到編碼的標準化、文檔化,增強編碼的可讀性、可理解性、可維護性要做到:采用結(jié)構化方法,劃分功能模塊和程序段,采用必要的縮進和對齊,簡化表達式,每行只有一個語句,盡量使用注釋,使用有意義的標識符, 動態(tài)檢查,是指通過上機調(diào)試發(fā)現(xiàn)錯誤的過程。完成編碼后,可以借助編譯程序檢查隱藏的語法錯誤,如錯誤標識符、非法的表達式、錯誤的函數(shù)調(diào)用等。利用連接程序,可以檢查連接錯誤,如調(diào)用了未定義的函數(shù)、缺乏必要的函數(shù)定義等。通過試運行程序,可以發(fā)現(xiàn)一些邏輯錯誤,如錯誤的計算、有問題的輸入和輸出等,程序中的錯誤有兩種,即Error和WarningError是必須要糾正的,任何Error都會導致編譯或連接失敗Warning一般不影響生成可執(zhí)行的“程序”,但程序有缺陷合格的程序員不僅要糾正致命Error,也要糾正Warn

溫馨提示

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

評論

0/150

提交評論