C語言程序設(shè)計 第四章 循環(huán)語句和轉(zhuǎn)移語句_第1頁
C語言程序設(shè)計 第四章 循環(huán)語句和轉(zhuǎn)移語句_第2頁
C語言程序設(shè)計 第四章 循環(huán)語句和轉(zhuǎn)移語句_第3頁
C語言程序設(shè)計 第四章 循環(huán)語句和轉(zhuǎn)移語句_第4頁
C語言程序設(shè)計 第四章 循環(huán)語句和轉(zhuǎn)移語句_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第4 4章章 循環(huán)語句和轉(zhuǎn)移語句循環(huán)語句和轉(zhuǎn)移語句4.1 for循環(huán)循環(huán)4.2 while循環(huán)循環(huán)4.3 do-while循環(huán)循環(huán) 4.4 跳轉(zhuǎn)語句跳轉(zhuǎn)語句4.5 循環(huán)的嵌套循環(huán)的嵌套4.6 程序設(shè)計舉例程序設(shè)計舉例4.1 for循環(huán)循環(huán)循環(huán)循環(huán): 就是有規(guī)律地重復(fù)執(zhí)行某些語句的過程。 例如:要計算0到360度的正弦函數(shù),要求每隔0.1度計算一次,如果沒有循環(huán)結(jié)構(gòu),則: . x=0.0; y=sin(x); printf(“y=%f”,y); x=0.1; y=sin(x*3.14159/180.0); printf(“y=%f”,y); 對于如此簡單的問題,需要10000多條語句。 循環(huán)結(jié)

2、構(gòu)來處理重復(fù)計算的問題。對于上述問題可以用以下程序:for(i=0;i=3600;i+) x=i*3.14159/180.00; y=sin(x); printf(“y=%f”,y); 顯然,這段程序簡潔易懂。顯然,這段程序簡潔易懂。4.1 for4.1 for循環(huán)循環(huán)for語句的一般格式為: for(表達式1;表達式2;表達式3) 語句表達式1用于循環(huán)賦初始值,它只能執(zhí)行一次;表達式2是循環(huán)條件;表達式3用于對循環(huán)條件的修改,以使循環(huán)能于結(jié)束。求解表達式求解表達式1表達式表達式2語句語句求解表達式求解表達式3for循環(huán)下面的語句循環(huán)下面的語句非非00例1:求從1加到100的程序。#inclu

3、de void main() int s,i; s=0; for(i=1;i=100;i+) s=s+i; printf(sum=%d,s); 循環(huán)體!結(jié)果:sum=5050for語句-范例 #include void main(void ) int i,n; long fact=1; printf(please input n:); scanf(%d,&n); for(i=1;i=n;i+) fact*=i; printf(%d!=%ld,n,fact);例例2:求求n!對對forfor語句作幾點說明:語句作幾點說明:(1)可以將表達式1放到for語句之前,在for語句內(nèi)缺省表達式1。 例如

4、: s=0,i=1; for(; i=100; i+) s=s+i;對對forfor語句作幾點說明:語句作幾點說明:(2)表達式2如果缺省(分號不能缺省),相當(dāng)于表達式2永遠為非0(“真”),從而循環(huán)無終止地進行下去。 例如: s=0; for(i=1; ;i+) s=s+i;(3)可以把表達式3改為表達式語句移到循環(huán)體的尾部,作為循環(huán)體的一部分。 例如: s=0; for(i=1;i=100;) s=s+i; i+; 對對for語句作幾點說明語句作幾點說明:對對for語句作幾點說明:語句作幾點說明:(4)可以把與循環(huán)控制變量無關(guān)的循環(huán)初始化操作放入表達式1中,也可以把循 環(huán)體中與循環(huán)變量無關(guān)

5、的操作放到表達式3中。 例如: for(s=0,i=1;i=100;i+) s=s+i; 其中,s=0,i=1是逗號表達式。對對for語句作幾點說明語句作幾點說明:(5)如果循環(huán)體中沒有任何語句,則應(yīng)該加一個分號。 例如: s=0; for(i=1; i=100; s=s+i, i+) ; ;此分號不能少!例例3: 求一個等差數(shù)列前求一個等差數(shù)列前n項的和:項的和: ai+1-ai=d (i=1,2,3)分析:分析:1 輸入輸入n、d和等差數(shù)列的第一個數(shù)和等差數(shù)列的第一個數(shù)a的取值。的取值。 2 sum 、i的初值置的初值置0 3 a+sumsum 4 計算數(shù)列中下一個數(shù)的取值計算數(shù)列中下一個

6、數(shù)的取值 a+da 5 i+1i 6 重復(fù)重復(fù)3、4、5步直到步直到i大于大于n 7 輸出結(jié)果輸出結(jié)果nfor語句-范例#include void main(void) int a , d , n , i ; int ai , sum=0 ; printf(“input a=?td=?tn=?n”) ; scanf(“%d%d%d”, &a,&d,&n) ; ai=a; for(i=1; i=n ; i+) sum+=ai ; ai+=d ; printf(“sum=%dn” , sum) ;例例4 求求Fibonacci數(shù)列數(shù)列1,1,2,3,5,8 的前的前30個數(shù)個數(shù)F1=1 F2=1

7、Fn=Fn-1+Fn-22=1+1 3=1+25=2+3 8=3+5在一次循環(huán)中計算兩項,遞推公式為:在一次循環(huán)中計算兩項,遞推公式為:F1=1 F2=1 (初值)(初值)F1=F1+F2F2=F2+F1 #include void main( ) long int f1, f2; int i, n; printf (“ Input n:”); scanf (“ %d”, &n); f1=f2=1; for (i=1;i=n;i+) printf(“%ldt%ldn”,f1,f2); f1=f1+f2; f2=f2+f1; 練習(xí):練習(xí): 已知已知a1=10,a2=-3、an=3an-1+an-

8、2,求,求an前前10項之和。項之和。分析:從第分析:從第3項起都可以根據(jù)公式求出,可項起都可以根據(jù)公式求出,可設(shè)變量設(shè)變量x表示當(dāng)前項,表示當(dāng)前項,sum表示和,通過表示和,通過8次循環(huán),求出第次循環(huán),求出第3項到第項到第10項當(dāng)前項的項當(dāng)前項的值,并累加到值,并累加到sum中。中。#include void main(void) int a1=10,a2=-3,i,x,sum; sum=a1+a2; for(i=3;i=10;i+) x=3*a2+a1; sum+=x; a1=a2; a2=x; printf(前前10項和項和=%dn,sum); 例5 利用公式計算ex=1+x/1!+x2

9、/2!+x3/3!+xn/n!對于求級數(shù)的和,常用兩類方法:1)通項公式法t0=1 ti=xi/i! (i=1,2,.n)2)遞推公式法t0=1 ti= ti-1 .x/i (i=1,2,n)對于本題使用遞推公式法計算量要小。程序如下: #include void main(void) int i,n; double t,x,ex; ex=1.0; t=1.0; printf(“Enter value of n,x:”); scanf(“%d%lf”,&n,&x); for (i=1;in;i+) t*=x/i; ex+=t; printf(“exp(%f)=%lfn”,x,ex); 例6 求

10、10個大于0小于100的數(shù)中的最大數(shù)和最小數(shù)置初值的方法一般有兩種:1)極值法:取有界數(shù)據(jù)的上界作為最小值的初值,取有界數(shù)據(jù)的下界作為最大的初值2)成員法:取一批數(shù)據(jù)的第一個數(shù)作為最大值和最小值的初值。本程序采用極值法#include void main( ) int a, i, max, min; max=0; min=100; for (i=1;i=10;i+) scanf(“%d”, &a); if (maxa) min=a; printf(“Max=%d,Min=%dn”,max,min); for語句的特點:語句的特點:1、使用了三個表達式、使用了三個表達式2、循環(huán)控制變量可以在循環(huán)

11、體內(nèi)使用,也可、循環(huán)控制變量可以在循環(huán)體內(nèi)使用,也可以不使用,僅用來控制循環(huán)次數(shù)以不使用,僅用來控制循環(huán)次數(shù)3、從正常出口離開循環(huán)時,循環(huán)控制變量會、從正常出口離開循環(huán)時,循環(huán)控制變量會超過終值超過終值4.2 while4.2 while循環(huán)循環(huán)whilewhile語句的一般格式為:語句的一般格式為: while(while(表達式表達式) ) 語句語句whilewhile語句的執(zhí)行過程為:語句的執(zhí)行過程為: (1)(1)計算并判斷表達式的值。若值為計算并判斷表達式的值。若值為0 0,則結(jié)束,則結(jié)束循環(huán),退出循環(huán),退出whilewhile語句;若值為非語句;若值為非0 0,則執(zhí)行循,則執(zhí)行循環(huán)

12、體。環(huán)體。 (2)(2)轉(zhuǎn)步驟轉(zhuǎn)步驟(1)(1)。while語句的執(zhí)行過程語句的執(zhí)行過程 執(zhí)行過程: 計算表達式并判斷循 環(huán) 體=0非0 #include void main(void) int a = 1, sum = 0; while(a = 100) sum += a; a+; printf(%d, sum); while語句語句-范例范例 100例例1:求求 n n=1注意注意“邊界值邊界值”的選擇的選擇!應(yīng)有使循環(huán)趨于應(yīng)有使循環(huán)趨于結(jié)束的語句!結(jié)束的語句! 例例2 2 利用輾轉(zhuǎn)相除法,求兩個正整數(shù)的最大公約數(shù)利用輾轉(zhuǎn)相除法,求兩個正整數(shù)的最大公約數(shù)算法:算法: (1 1) 若若j=0

13、j=0,則,則i i為最大公約數(shù)為最大公約數(shù) (2 2) 若若j j不為不為0 0 將將i i除以除以j j,余數(shù)為,余數(shù)為k k i=j i=j;j=kj=k 轉(zhuǎn)(轉(zhuǎn)(1 1) #include void main() int i, j, temp; printf(“Enter 2 integers:”); scanf(“%d%d”,&i,&j); while( j ) temp=i%j; i=j; j=temp; printf(“Gcd=%dn”,i); 例例3 將鍵盤輸入復(fù)制到屏幕,直到按下一個回車將鍵盤輸入復(fù)制到屏幕,直到按下一個回車鍵為止鍵為止.#include void main(

14、 ) char c; c=getchar( ); while(c!=n) putchar( c ); c=getchar( ); while語句的特點:語句的特點: 1、循環(huán)一般由條件控制、循環(huán)一般由條件控制 2、在循環(huán)體內(nèi)至少有一條語句能對循環(huán)、在循環(huán)體內(nèi)至少有一條語句能對循環(huán)條件產(chǎn)生影響,以防止死循環(huán)條件產(chǎn)生影響,以防止死循環(huán) while語句練習(xí)練習(xí)練習(xí):輸入一批整數(shù),以輸入一批整數(shù),以0為結(jié)束,輸出其中的為結(jié)束,輸出其中的最大值。最大值。分析:采用分析:采用“打擂臺打擂臺”的方法,即兩兩相比,的方法,即兩兩相比,大大 者留下,當(dāng)所有數(shù)比完時留下的那個數(shù)者留下,當(dāng)所有數(shù)比完時留下的那個數(shù)

15、為最大。程序用一個變量為最大。程序用一個變量max保存(留保存(留 下)每兩兩相比中大的那個數(shù)。下)每兩兩相比中大的那個數(shù)。 #include void main(void)int x,max;printf(“請輸入數(shù)字,輸入請輸入數(shù)字,輸入0結(jié)束結(jié)束:n);scanf(%d,&x);max=x;while(x)scanf(%d,&x);if(maxx) max=x;printf(max=%dn,max);1、功能:、功能:do-while語句一般完成直到型循環(huán),語句一般完成直到型循環(huán),2、格式為:、格式為:do 語句塊語句塊while(表達式)(表達式);3、do-while語句控制流程為:

16、先執(zhí)行一次循環(huán)體內(nèi)的語句,然語句控制流程為:先執(zhí)行一次循環(huán)體內(nèi)的語句,然后再求判終表達式的值,若判終表達式的值為后再求判終表達式的值,若判終表達式的值為“非非0”,則重,則重復(fù)執(zhí)行循環(huán)體,否則當(dāng)表達式的值為復(fù)執(zhí)行循環(huán)體,否則當(dāng)表達式的值為“0”時,循環(huán)結(jié)束。時,循環(huán)結(jié)束。4.3 do-while4.3 do-while循環(huán)循環(huán) 執(zhí)行過程: 計算表達式并判斷循 環(huán) 體=0非0#include void main(void) int i,sum=0; i=1; dosum=sum+i; i+; while(i=100); printf(“%d”,sum);do-while語句-范例 100例例1:

17、求求 n n=1無論表達式的值無論表達式的值是多少,循環(huán)體是多少,循環(huán)體至少執(zhí)行一次!至少執(zhí)行一次! 例例2 從鍵盤輸入一個字符,判別其是否為大從鍵盤輸入一個字符,判別其是否為大寫字母,如果是,則將其轉(zhuǎn)換為小寫字母并寫字母,如果是,則將其轉(zhuǎn)換為小寫字母并輸出;否則不轉(zhuǎn)換,不輸出;并提示是否繼輸出;否則不轉(zhuǎn)換,不輸出;并提示是否繼續(xù)輸入(按續(xù)輸入(按y繼續(xù))。繼續(xù))。#include #include void main() char ch, answer; do printf(“Enter a letter:”); ch=getchar( ); if(isupper(ch) printf(“%

18、c”,ch+a-A); getchar( ); printf(“ndo you want to try again?(y/other letter)”); answer=getchar( ); getchar( ); while (answer=Y | answer=y);do-whiledo-while語句與語句與whilewhile語句的本質(zhì)區(qū)別語句的本質(zhì)區(qū)別nwhilewhile語句是先計算并判斷表達式的值。若其語句是先計算并判斷表達式的值。若其值為非值為非 0 0,則執(zhí)行循環(huán)體;若其值為,則執(zhí)行循環(huán)體;若其值為0 0,則退,則退出循環(huán)。出循環(huán)。ndo-whiledo-while語句則首

19、先執(zhí)行循環(huán)體,然后再計算語句則首先執(zhí)行循環(huán)體,然后再計算并判斷表并判斷表 達式的值。因此,達式的值。因此,do-whiledo-while語句語句至至少要執(zhí)行一次循環(huán)體少要執(zhí)行一次循環(huán)體。4.4 跳轉(zhuǎn)語句跳轉(zhuǎn)語句1_break語句語句 1. break語句的功能:用于從循環(huán)體內(nèi)跳出循環(huán)體,語句的功能:用于從循環(huán)體內(nèi)跳出循環(huán)體,即即提前結(jié)束提前結(jié)束循環(huán)。循環(huán)。2.使用要點:使用要點:break只能用在只能用在循環(huán)語句循環(huán)語句和和switch語句語句中中.for(r=1;r100) break; printf(“%f”,area); break語句語句-范例范例例例1:計算計算r=1到到r=10的

20、圓面積的圓面積,當(dāng)面積大于當(dāng)面積大于100時結(jié)束循環(huán)時結(jié)束循環(huán).break語句語句-范例范例break語句例語句例2: 某銀行利息某銀行利息2.8%(以復(fù)利計)。假設(shè)以復(fù)利計)。假設(shè)某儲戶存入本金某儲戶存入本金8000元,當(dāng)滿足以下條件之一,儲元,當(dāng)滿足以下條件之一,儲戶從銀行將錢取出。戶從銀行將錢取出。 (1)儲蓄滿)儲蓄滿10年年 (2)連本帶息超過)連本帶息超過10000元元 編程求儲戶會在第幾年將錢取出,取出時連本帶息編程求儲戶會在第幾年將錢取出,取出時連本帶息是多少?是多少?#include void main(void) int year; float money=8000; fo

21、r(year=1;year10000) break; printf(“%d year %fn”,year,money);break語句例語句例3: 百雞問題:一只公雞百雞問題:一只公雞5元錢,一只母元錢,一只母雞雞3元錢,三只小雞元錢,三只小雞1元錢,現(xiàn)有元錢,現(xiàn)有100元錢,要買元錢,要買100只雞,是否可以?要求三種雞都有。只雞,是否可以?要求三種雞都有。分析:設(shè)公雞、母雞、小雞各分析:設(shè)公雞、母雞、小雞各x、y、z只,則可知只,則可知z=100-x-y,且,且 5x+3y+z/3=100 break語句語句-范例范例#include void main(void) int x,y,z;

22、for(x=1;x20;x+) for(y=1;y34;y+) z=100-x-y; if(z%3=0)&(5*x+3*y+z/3)=100) break; if(y34) printf(“cook=%d hen=%d chicken=%dn”,x,y,z); printf(“this is one solution.n”); break; 4.4 跳轉(zhuǎn)語句跳轉(zhuǎn)語句2_ continue語句語句1、功能、功能:結(jié)束本次循環(huán)結(jié)束本次循環(huán),接著判定下一次是否執(zhí)行循環(huán)。接著判定下一次是否執(zhí)行循環(huán)。2、continue與與break的區(qū)別的區(qū)別:continue只結(jié)束本次循環(huán)只結(jié)束本次循環(huán),而不是終止

23、整個循環(huán)。而而不是終止整個循環(huán)。而break終止本層循環(huán),不再會去判斷執(zhí)行循環(huán)體的終止本層循環(huán),不再會去判斷執(zhí)行循環(huán)體的條件是否成立。條件是否成立。 例:把例:把100200之間的不能被之間的不能被3整除的數(shù)輸出整除的數(shù)輸出.#include void main(void) int n; for(n=100;n=200;n+) if (n%3=0) continue; printf(“%d”,n); 4.4 4.4 跳轉(zhuǎn)語句跳轉(zhuǎn)語句3 goto3 goto語句語句gotogoto語句用于將控制轉(zhuǎn)到標(biāo)號所指定的語句去執(zhí)行。語句用于將控制轉(zhuǎn)到標(biāo)號所指定的語句去執(zhí)行。 它的一般格式為:它的一般格式為

24、: 或或: goto 標(biāo)號;標(biāo)號; 標(biāo)號:語句標(biāo)號:語句標(biāo)號:語句標(biāo)號:語句goto 標(biāo)號;標(biāo)號; 例:例: 100 #include 求求 n void main( ) n=1 int i,sum=0; i=1;運行結(jié)果為運行結(jié)果為:5050 loop :if (i=100) sum=sum+i; i+; goto loop; printf(“%d”,sum); 說明:說明:目前目前goto語句很少使用語句很少使用,過多的使用過多的使用goto語語句會降低程序的可讀性。句會降低程序的可讀性。4.5 4.5 循環(huán)的嵌套循環(huán)的嵌套多重循環(huán)多重循環(huán): : 嵌套多層循環(huán)結(jié)構(gòu)的循環(huán)。嵌套多層循環(huán)結(jié)構(gòu)的

25、循環(huán)。外循環(huán):外循環(huán): 處于外層的循環(huán)稱為外循環(huán)。處于外層的循環(huán)稱為外循環(huán)。內(nèi)循環(huán)內(nèi)循環(huán): 處于內(nèi)層的循環(huán)稱為內(nèi)循環(huán)。處于內(nèi)層的循環(huán)稱為內(nèi)循環(huán)。#include void main(void) int i,j;for(i=1;i=3;i+)for(j=1;j=8;j+)putchar(*);printf(n);例例 輸出圖形輸出圖形 * * *例例: : 編寫一個編寫一個九九乘法表九九乘法表的程序的程序分析:九九乘分析:九九乘法表分法表分9 9行行, ,第第i i行共行共i i個小項。個小項。i i* *j j i=1,2,9i=1,2,9j=1,2,ij=1,2,i#include void

26、 main(void) int i,j; for(i=1;i=9;i+) for(j=1;j=i;j+)printf(“%1d*%1d=%-4d”,i,j,i*j); printf(“n”); 例例 輸出下面圖案輸出下面圖案 ABCDE BCDE CDE DE E #include void main() int i; char ch; for(i=0;i5;i+) for(ch=A+i;chA+5;ch+) printf(“%c”,ch); printf(“n”); 例例 求求1M1M之間的全部素數(shù)之間的全部素數(shù)( (素數(shù)是除素數(shù)是除1 1和本身以和本身以外不能被其他自然數(shù)整除的自然數(shù)外不能

27、被其他自然數(shù)整除的自然數(shù)) )#include #include void main() int n,m,i,j,l=0; scanf(“%d”,&m); for (n=2;n=m;n+) i=sqrt(n); for (j=2;j=i+1) if (l5) printf(“%dt”,n); l+; else printf(“%dn”,n); l=0; 應(yīng)用舉例應(yīng)用舉例應(yīng)用例應(yīng)用例1:輸入一行字符,分別統(tǒng)計其中字母、空格、輸入一行字符,分別統(tǒng)計其中字母、空格、數(shù)字及其他字符的個數(shù)。數(shù)字及其他字符的個數(shù)。分析:分析: 1 讀入一個字符到變量讀入一個字符到變量c 2 判斷判斷c是哪一類,再給相應(yīng)計數(shù)的變量加是哪一類,再給相應(yīng)計數(shù)的變量加1 3 重復(fù)重復(fù)1、2直到直到c等于等于n#include void main(void) int letter=0,space=0,digit=0,other=0; char c; while(c=getchar( )!=n)if(c=a&c=A&c=0&c=9) digit+; else other+; printf(“l(fā)etter=%d,space=%d,digit=%d,other=%dn”,letter, space,digi

溫馨提示

  • 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

提交評論