C謝麗聰-4程序控制結(jié)構(gòu).ppt_第1頁
C謝麗聰-4程序控制結(jié)構(gòu).ppt_第2頁
C謝麗聰-4程序控制結(jié)構(gòu).ppt_第3頁
C謝麗聰-4程序控制結(jié)構(gòu).ppt_第4頁
C謝麗聰-4程序控制結(jié)構(gòu).ppt_第5頁
已閱讀5頁,還剩170頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1,第四章 程序控制結(jié)構(gòu),4.1 C語言的執(zhí)行語句 4.2順序結(jié)構(gòu) 4.3選擇結(jié)構(gòu) 4.4循環(huán)結(jié)構(gòu),2,4.1 語言的執(zhí)行語句,程序的結(jié)構(gòu):,3,C語句可分為以下五類: 1)表達式語句 2)函數(shù)調(diào)用語句 (一般包含在表達式語句中) 3)控制語句 4)復(fù)合語句 5)空語句,程序的執(zhí)行部分是由語句組成的。 程序的功能也是由執(zhí)行語句實現(xiàn)的。,4,4.1.1 表達式語句,表達式語句由表達式加上分號“;”組成。執(zhí)行表達式語句就是計算表達式的值。 其一般形式為: 表達式; 例如: x=y+z; y+z; i+; x=0,y=1;,賦值語句,加法運算語句,但計算結(jié)果不能保留,無實際意義,自增1語句,i值增1

2、,逗號表達式語句,5,1、賦值語句:,由賦值表達式加上分號“;”構(gòu)成的表達式語。 語法格式:變量 = 表達式; (1)賦值運算符除“=”外,還包含復(fù)合賦值運 算符。 例如:a-=a*a; (2)賦值運算符右側(cè)的表達式可以又是一個賦值表達式。 例如:a=b=5*3;,等價,a=a-a*a;,等價,a=(b=5*3);,等價,b=5*3; a=b;,6,(3)賦值語句的功能與賦值表達式相同,但性質(zhì)不同。賦值表達式是一種表達式,它可以出現(xiàn)在任何允許表達式出現(xiàn)的地方,而賦值語句不能出現(xiàn)在表達式中。例如: if (x=y+5) z=x; 語句的功能是,若表達式x=y+5大于0則z=x。 if (x=y+

3、5;)0) z=x; 因為x=y+5;是語句,不能出現(xiàn)在表達式中。,合法,不合法,7,(4)賦值表達式的嵌套: 賦值符右邊的表達式又是一個賦值表達式: 變量=(變量=表達式); 展開之后的一般形式為: 變量=變量=表達式; 例如: a=b=c=d=e=5; 按照賦值運算符的右接合性,等效于: e=5; d=e; c=d; b=c; a=b;,8,(5)變量說明中給變量賦初值和賦值語句的區(qū)別: 給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其它同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結(jié)尾。 例如: int a=5,b,c; (6)在變量說明中,不允許連續(xù)給多個變量賦初值: 如

4、下述說明是錯誤的: int a=b=c=5; 而賦值語句允許連續(xù)賦值: int a,b,c; a=b=c=5;,9,2、函數(shù)調(diào)用語句:,函數(shù)調(diào)用語句由函數(shù)名、實際參數(shù)加上分號“;”組成。執(zhí)行函數(shù)語句就是調(diào)用函數(shù)體。 一般形式為: 函數(shù)名(實際參數(shù)表); 例如: printf(C Program); z=x+sin(y);,調(diào)用庫函數(shù),輸出字符串,賦值語句(表達式中包含函數(shù)調(diào)用),10,4.1.2 空語句,空語句只有分號“;”組成的語句稱為空語句??照Z句是什么也不執(zhí)行的語句。 例如 while(getchar()!=n) ;,空語句,本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。,11

5、,4.1.3 復(fù)合語句,復(fù)合語句把多個語句用括號括起來組成的一個語句稱復(fù)合語句。在程序中應(yīng)把復(fù)合語句看成是單條語句,而不是多條語句。 例如: x=y+z; a=b+c; printf(“%d%d”,x,a); ,是一條復(fù)合語句。,復(fù)合語句內(nèi)的各條語句都必須以分號“;”結(jié)尾,在括號“”外不能加分號。,12,4.1.4 控制語句,控制語句用于控制程序的流程,以實現(xiàn)程序的各種結(jié)構(gòu)方式??煞殖梢韵氯悾?1)條件判斷語句:if else語句; 2)開關(guān)分支語句: switch語句; 3)循環(huán)執(zhí)行語句:do while語句、while語句、for語句; 4)中止循環(huán)語句: continue語句、 bre

6、ak語句; 5) 無條件轉(zhuǎn)移語句:goto語句; 6)函數(shù)返回語句: return語句。,13,4.2 順序結(jié)構(gòu),按照解決問題的順序編寫相應(yīng)的語句,程序運行時自上而下依次執(zhí)行語句 。,14,例1. 輸入任意兩個整數(shù),求它們的和及平均值。#include void main( ) int num1,num2,sum; float aver; printf(Please input two integers: n); scanf(%d,%d, 輸入: 30000,5005 輸出:sum=35005,aver=17502.50,變量定義,輸入提示,數(shù)據(jù)輸入,求累計和,求平均值,輸出結(jié)果,?,sum/

7、2.0,15,例2. 給定一個三位正整數(shù),輸出它的個位、十位和百位數(shù)。 數(shù)字分離方法: 百位數(shù) m2=m/100 十位數(shù) m1=(m-m2*100)/10 個位數(shù) m0=m-m2*100-m1*10 個位數(shù) m0=m%10 十位數(shù) m1=(m/10)%10 百位數(shù) m2=m/100,百位:123/100 =1 十位:(123-1*100)/10=2 個位:123-1*100-2*10=3,個位:123%10=3 十位:(123/10)%10=2 百位:123/100=1,16,例2. 給定一個三位正整數(shù),輸出它的個位、十位和百位數(shù)。 #include void main() int m,m0,

8、m1,m2; scanf(%d, 輸入:123 輸出:1,2,3,個位:m0=123%10=3 十位:m1=(123/10)%10=2 百位:m2=123/100=1,17,例3.取一個16位的二進制數(shù)a的7、6、5、4四個位。 如16進制數(shù): a=(a25d)16(1010001001011101)2,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,a4,(04),0000000000000000,1111111111111111,1111111111110000,0000000000001111,18,#include void main() unsigned a,b,c,

9、d; scanf(%x, 輸入:a25d 輸出: a25d 5,以十六進制形式輸入整數(shù)a,以十六進制形式輸出a和結(jié)果d,右移4位,求低4位,19,表達式可以是任意合法表達式,后面不能加;,4.3 選擇結(jié)構(gòu)(if 語句),4.3.1 if語句 1、單分支if: if(表達式) 語句 語義:如果表達式的值為真,則執(zhí)行其后的語句,否則不執(zhí)行該語句。,20,例1:void main() int a,b,max; printf(n input two numbers: ); scanf(%d %d, 輸入:23 46 輸出:max=46,此語句用于提示輸入,max=23,max=46,21,例2:voi

10、d main() int a,b,c,t; printf(n input two numbers: ); scanf(%d %d %d , 輸入:1,6,2 輸出:6 2 1,實現(xiàn)數(shù)的互換,功能:輸入三個數(shù),按照從大到小順序輸出,22,例3:從鍵盤輸入一個字符,判斷它是否小寫字母。若是,將其轉(zhuǎn)換成大寫字母,否則不進行轉(zhuǎn)換,作后輸出該字母。 #include main() char c,a; c=getchar(); if(cz ) a=c; if(c=a) a=c-32; printf(%cn,a); ,main() char c; c=getchar(); if(c=a)c-=32; pri

11、ntf(%cn,c);,判斷非小寫字母情況,判斷小寫字母情況,只用一個單分支語句實現(xiàn),23,2、雙分支: if-else if(表達式) 語句1; else 語句2; 語義:如果表達式的值為真,則執(zhí)行語句1,否則執(zhí)行語句2 。,后面不能加;,24,void main() int a, b; printf(input two numbers: ); scanf(%d %d, 輸入:23 46 輸出:max=46,輸入兩個整數(shù),輸出其中大數(shù),例4. 例1的改寫,25,3、多分支if-else if : if(表達式1) 語句1; else if(表達式2) 語句2; else if(表達式3) 語

12、句3; else if(表達式m) 語句m; else 語句n;,語義: 依次判斷表達式的值,當(dāng)出現(xiàn)某個值為真時,則執(zhí)行其對應(yīng)的語句。然后跳到整個if語句之外繼續(xù)執(zhí)行程序。 如果所有的表達式均為假,則執(zhí)行語句n。然后繼續(xù)執(zhí)行后續(xù)程序。,后面不能加;,26,此為真,做語句1,其它語句都不做,27,上面的語句為以下三種格式: 1、空語句 2、一個語句(不引起轉(zhuǎn)移) 3、前后加大括號的語句(復(fù)合語句),也叫程序段,如: int a; float b; a=3; b=7.0;,;,允許在復(fù)合語句前部定義變量,只能在復(fù)合語句中使用,int a; a=3; float b; b=7.0;,變量要在最前面定

13、義,28,ab,t=a; a=b; b=t;,ab,t=a;,a=b; b=t;,使用復(fù)合語句,不使用復(fù)合語句,N,N,Y,Y,29,#includestdio.h void main() 輸入:A char c; 輸出:This is a capital letter c=getchar(); if(c=0 ,例5,30,4、在使用if語句中應(yīng)注意以下問題: 1)在三種形式的if語句中,在if之后均為表達式。 該表達式通常是邏輯表達式或關(guān)系表達式, 但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。 例如: if(a=5) 語句; if(b) 語句; 都是允許的。只要表達式的值為非

14、0,即為“真”。 如在: if(a=5); 中表達式的值永遠為非0,所以其后的語句總是要執(zhí)行的,當(dāng)然這種情況在程序中不一定會出現(xiàn),但在語法上是合法的。,31,又如,有程序段: if(a=b) printf(%d,a); else printf(a=0); 本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經(jīng)常出現(xiàn)的。,=為賦值運算符,比較運算符為=,32,2)在if語句中,條件判斷表達式必須用括號括起來,在語句之后必須加分號。 3)在if語句的三種形式中,所有的語句應(yīng)為單個語句,如果要想在滿足條件時執(zhí)行一組(多個)語句,則必須把這一組語句用括起來組成

15、一個復(fù)合語句。但要注意的是在之后不能再加分號。 例如: if(ab) a+;b+; else a=0;b=10;,if(ab) a+;b+;; else a=0;b=10;;,不能寫成,33,例如條件語句: if(ab) max=a; else max=b; 可用條件表達式寫為: max=(ab)?a:b;,(ab)?max=a:max=b;,(ab)?(max=a): (max=b);,用條件語句實現(xiàn)分支語句功能:,34,例6:計算,方法一: void main( ) float x,y; scanf (”%f ”, ,表達式,成立值為1,y=x3 ? x*x+2 : 3*x+7*x*x;,

16、35,例7:從鍵盤輸入任意的兩個實數(shù),按從小到大順序輸出這兩個數(shù),請編程實現(xiàn)。 void main( ) float a,b; scanf (”%f%f ”,代替,復(fù)合語句可以定義變量,實現(xiàn)a與b的互換,36,a=a+b;b=a-b;a=a-b t=a;a=b;b=t,37,例8:計算,方法一: main( ) float x,y; scanf (”%f ”,1=x scanf (”%f ”, , 、 可省略,y= x1? x :( x10 ? 2*x-1 : 3*x-11);,(、)可省略,39,方法三:,if (x10) if (x1) y=x; else y=2*x-1; else y=

17、3*x-11;, 后不能加;, 、 可省略,y= x10? ( x1 ? x :2*x-1 ): 3*x-11;,(、) 可省略,40,4.3.4 if語句的嵌套,當(dāng)if語句中的執(zhí)行語句又是if語句時,則構(gòu)成了if 語句嵌套的情形。 其一般形式可表示如下: if(表達式) 或 if(表達式) if 語句; if 語句; else if 語句; 在嵌套內(nèi)的if語句可能又是if-else型的,這將會出現(xiàn)多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。,加;,41,其中的else究竟是與哪一個if配對呢? 是if(表達式1) 還是 if(表達式1) if(表達式2) if(

18、表達式2) 語句1; 語句1; else else 語句2; 語句2; 注意:if 與else的配對關(guān)系 else 總是與它前面最近的if配對,因此對上述例子應(yīng)按前一種情況理解。,42,例9:寫出下面兩程序的輸出結(jié)果,1 void main( ) int x=2,y=-1,z=2; if ( xy ) if ( y0 ) z=0; else z=1; printf (”%dn”,z); 結(jié)果:,一個語句,2,43,void main( ) int a=1,b=3,c=5,d=4; if ( ab ) if ( cd ) x=1; else if ( ac ) if ( bd ) x=2; el

19、se x=3; else x=6; else x=7; printf (”%dn”,x); 結(jié)果:,2,44,為了使邏輯關(guān)系清晰:(1)按下面所示書寫程序:,void main( ) int a=1,b=3,c=5,d=4; if ( ab ) if ( cd ) x=1; else if ( ac ) if ( bd ) x=2; else x=3; else x=6; else x=7; printf (”%dn”,x); ,45,(2)適當(dāng)?shù)丶哟罄ㄌ枺?x=-3; if (x0) y=1; printf (”x0,y=%dn”,y); 把上面與下面比較 x=-3; if (x=0) if

20、 (x0) y=1;printf (”x0,y=%dn”,y); else y=-1;printf (”x0,y=%dn”,y); ,結(jié)果:x0,y=-1,無結(jié)果,46,例10: void main() int a,b; printf(please input A,B: ); scanf(%d%d, 輸入: 輸出:,if(a!=b) if(ab) printf(ABn); else printf(ABn); else printf(A=Bn);,23 46,AB,47,例11:輸入一年份,判別是否閏年。,year被4整除,真,真,真,真,假,假,假,假,year被100整除,leap=0,le

21、ap=1,leap=1,leap=0,leap,year被400整除,輸出閏年,輸出非閏年,48,void main() int year,leap; scanf(“%d”, ,根據(jù)leap輸出結(jié)果,49,4.3.2 switch語句(另一種分支語句),格式:switch(任意類型表達式) case 常量表達式1: 語句1; case 常量表達式2: 語句2; case 常量表達式n: 語句n; default: 語句n+1; 注:常量表達式中運算對象只能為常量或符號常量(整型或字符型),各個值必須互不相同 default 允許出現(xiàn)在前面或中間 switch(任意類型表達式) 后不帶分號,任意

22、類型表達式的計算結(jié)果取整。,不要忘 記空格,不帶;,50,功能:若switch后面表達式值的整數(shù)(字符常量)部分與某個case后面表達式值相等,則就執(zhí)行該case后面的語句,否則就執(zhí)行default后面的語句,51,例12:,void main() int a; printf(input integer number: ); scanf(%d, ,輸入:3,輸出: Wednesda Thursday Friday Saturday Sunday error,“case 常量表達式”相當(dāng)于一個語句標號, 表達式的值和某標號相等則轉(zhuǎn)向該標號執(zhí)行,但不能在執(zhí)行完該標號的語句后自動跳出整個switch

23、 語句,所以出現(xiàn)了繼續(xù)執(zhí)行所有后面case語句的情況。,52,break語句:專用于跳出switch語句,在每一case語句之后增加break 語句, 使每一次執(zhí)行之后均可跳出switch語句,從而避免輸出不應(yīng)有的結(jié)果。 void main() switch (a) case 1:printf(Mondayn);break; case 2:printf(Tuesdayn); break; case 3:printf(Wednesdayn);break; case 4:printf(Thursdayn);break; case 5:printf(Fridayn);break; case 6:pr

24、intf(Saturdayn);break; case 7:printf(Sundayn);break; default:printf(errorn); ,53,Switch語句常用形式:,switch (任意類型表達式) case 整型或字符型常量表達式1 :語句1; break; case 整型或字符型常量表達式2 :語句2; break; case 整型或字符型常量表達式n:語句n; break; default : 語句n+1; ,default后面不加 break,54,注意:,1)case后的各常量表達式的值不能相同,否則會出現(xiàn)錯誤。 2)case后,允許有多個語句,可以不用括起來

25、。 3)case和default子句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。 4)default子句可以省略不用。,55,例13:若有宏定義:#define k 2 和定義:float w; int a=2,b; 則合法的switch語句是 Aswitch (w) Bswitch (a+b) case 1.0:printf(”*n”); case 1 printf(”*n”); case 2.0:printf(”*n”); case a printf(”*n”): Cswitch (w+1) Dswitch (a) ; case k-1 :printf(”*n”); case 1: pri

26、ntf(”*n”);default : printf(”n”); case 2:printf(”*n”); case 1+2:printf(”*n”); default : printf(”n”);,C,不能為實型,不能為變量,少;和:,不能加分號,56,例14:,先接收從鍵盤輸入的一個等級制成績,然后輸出對應(yīng)的百分制成績。轉(zhuǎn)換規(guī)則如下: A : 85100 B : 7084 C : 6069 D 60,57,void main( ) char grade; scanf(“%c”, ,58,例15:先接收從鍵盤輸入的一個百分制成績,然后輸出對應(yīng)的五分制成績。轉(zhuǎn)換規(guī)則如下: 90100 A 80

27、89 B 7079 C 6069 D 60 E,59,#include void main ( ) int score; printf(nPlease input the score(0-100):); scanf(%d, ,方法一,60,void main( ) int cj; printf(”Input a integer number(0-100)n”); scanf(“%d”, ,90100 A 8089 B 7079 C 6069 D 60 E,方法二,61,例16:計算器程序。用戶輸入運算數(shù)和四則運算符,輸出計算結(jié)果。,void main() float a,b; char c;

28、printf(input expression: a+(-,*,/)b n); scanf(%f%c%f, ,字符常量,輸入:12 + 13 輸出:25.000000,62,例17:求方程ax2+bx+c=0的兩個實根 #include void main( ) double a,b,c,x1,x2,disc; scanf (”%lf%lf%lf ”, ,b*b-4*a*c0, 有解,63,題目改為:求二次方程ax2+bx+c=0的兩個根,a!=0, 一定有解 要認真分析題目,達到題目要求,64,void main( ) double a,b,c,x1,x2,disc,p,q; scanf (

29、”%lf,%lf,%lf”, ,65,例18:輸入某年某月某日,判斷這一天是這一年的第幾天,需考慮閏年的情形。 注:符合以下條件之一是閏年: 能被4整除,但不能被100整除; 能被400整除。 算法分析: 以5月4日為例,先把14月份的天數(shù)加起來,然后再加上本月的4天即本年的第幾天。 閏年情形只需當(dāng)輸入月份大于3時需要考慮。若是閏年,2月份應(yīng)是29天。,66,void main ( ) int day,month,year,sum=0; scanf(%d,%d,%d, /*加上3月份31天*/,計算某月以前月份的總天數(shù),67,case 3: /*判斷是否閏年*/ if(year%4=0 ,68

30、,例19:運輸公司對用戶計算運費。路程(skm)越遠,每噸千米運費越低。標準如下: S250 沒有折扣 250s500 2%折扣 500s1000 5%折扣 1000s2000 8%折扣 2000s3000 10%折扣 3000s0 15%折扣 設(shè)每噸千米運費為p,貨物重量為w,距離為s,折扣為d,則總運費為:f=pws(1-d) 輸入:p、w、s,計算運費,69,用公式f=p*w*s*(1-d) 計算運輸費。,噸公里運價,運輸距離,折扣,貨重,s250(公里) d=0 250s500 d=0.02 500s1000 d=0.05 1000s2000 d=0.08 2000s3000 d=0.

31、10 3000s d=0.15,要根據(jù)距離計算折扣d, 關(guān)鍵是構(gòu)造switch后的 表達式,選擇 c=s/250 來求c的值。 if (s=3000) c=12; else c=s/250;,70,void main ( ) int c,s; float p,w,d,f; scanf(%f,%f,%s,折扣變化都是250的倍數(shù),s250則: S250 1 250s500 1, 2) 500s1000 2,4) 1000s2000 4,8) 2000s3000 8,12) 3000s0 12,71,case 4: case 5: case 6: case 7: d=8; break; case

32、8: case 9: case 10: case 11: d=10; break; case 12: d=15; break; f=p*w*s*(1-d/100.0) printf(“f=%f=”,f);,s250則: S250 1 250s500 1, 2) 500s1000 2,4) 1000s2000 4,8) 2000s3000 8,12) 3000s0 12,運費,72,例20:判斷以下程序?qū)崿F(xiàn)的功能: #include void main() char c; printf(input a character: ); c=getchar(); if (c=0,輸入一個字符,判別該字符

33、是數(shù)字、英文大寫字母、小寫字母還是其它字符。,數(shù)字,大寫字母,小寫字母,其它字符,73,例21: 輸入三角形三邊長,求三角形面積。 #include #include void main() float a,b,c,s,area; scanf(%f,%f,%f, ,判斷條件是否滿足,74,例22:輸入a、b、c三個整數(shù),輸出最大數(shù)和最小數(shù)。 #include void main() int a,b,c,max,min; scanf(%d,%d,%d, ,比較a、b兩數(shù)的大小,大數(shù)賦給max,小數(shù)賦給min,若c大于max,則把c賦給max,若c比min更小則把c賦給min。,if( ab)ma

34、x=a;min=b else max=b;min=a;,75,循環(huán)條件,4.4 循環(huán)控制概述,循環(huán)結(jié)構(gòu)的特點:在給定條件成立時,反復(fù)執(zhí)行某程序段,直到條件不成立為止。 語言提供的循環(huán)結(jié)構(gòu)類型如下: 1)用goto語句和if語句構(gòu)成循環(huán); 2)用while語句; 3)用do-while語句; 4)用for語句;,循環(huán)體,76,語法格式: while (表達式) 語句 表達式值為零時,立即停止循環(huán),4.4.1 用while語句實現(xiàn)循環(huán),沒有分號,77,寫出下面程序的運行結(jié)果,(1) void main( ) int i=1; while(i=3) printf(”%dn”,i);i+ ; (2)

35、void main( ) int i=1; while(i=3) ; printf(”%dn”,i);i+ ; ,結(jié)果 1 2 3,結(jié)果 死循環(huán),循環(huán)體,空語句,若把上面 、 去掉也死循環(huán),復(fù)合語句 作為循環(huán) 體語句,78,語法格式: do 語句 while (表達式) ; 表達式值為零時,立即停止循環(huán),至少執(zhí)行一次循環(huán)語句。,4.4.2 用do-while語句實現(xiàn)循環(huán),分號,79,void main ( ) int k=1 , n=1 , sum=0 ; do sum+=n ; n+ + ; if ( sum=10 ) k=0; while ( k=1); printf ( ”sum=%dn

36、”,sum) ; ,改為while(k=1) 死循環(huán),0,1,1,2,3,3,6,4,10,結(jié)果: sum=10,寫出下面程序的運行結(jié)果,80,例:用while語句和do-while語句求,傳統(tǒng)流程圖表示算法,81,N-S圖表示算法,100,82,void main() int i,sum=0; i=1; while(i=100) sum+=i; i+; printf(%dn,sum); void main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(%dn,sum); ,i、sum的初值為1、0 i的終值為101,運行結(jié)果:

37、5050,sum=0+1 sum=1+2 sum=99+100,83,例:計算 p=123 n void main( ) int i,n;long p; scanf(”%d”, ,不用long會溢出,i、p的初值為1 i的終值為n+1,p=1*1 p=1*2 p=*n,遞推 算法,dop*=i;i+; while (i=n);,i=n等價于in+1,84,例:計算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t; scanf(”%d”,保證達到計算n次,t=11 2 3 S=1+1 2+1 2 3+ ,while (i=n) t*= i ;

38、 s+=t ; i+ + ; ,85,例:統(tǒng)計從鍵盤輸入一行字符的個數(shù)。,#include void main() int n=0; printf(input a string:n); while(getchar()!=n) n+; printf(%d,n); ,只要從鍵盤輸入的字符不是回車就繼續(xù)循環(huán),完成對輸入字符個數(shù)計數(shù)。,輸入:ascdf 輸出:5,86,例:計算: #include #include void main() int i=1,n; double pi; scanf(%d, ,i=1,pi=1.0; i=2,pi=1.0+1.0/(2*2); i=3,pi=1.0+1.0/

39、(2*2)+1.0/(3*3); i=4,i=3不滿足,停止循環(huán),改為1/(i*i) 出錯,為什么?,輸入3,87,例:求,#include void main() int s; float n,t,pi=0; t=1;pi=0;n=1.0;s=1; do pi=pi+t; n=n+2; s=-s; t=s/n; while(fabs(t)1e-6); pi=pi*4; printf(pi=%10.6fn,pi);,分母每次增加2 單項的符號變化 單項的值t=s/n,循環(huán)結(jié)束條件是運行某一個精度:最后一項的值小于10-6,fabs(t)1e-6來控制循環(huán)是否結(jié)束。,88,1、while語句中的

40、表達式一般是關(guān)系表達或邏輯表達式,也可以是其它表達式,只要表達式的值為真(非0)即可繼續(xù)循環(huán)。 例: void main() int a=0,n; printf(“n input n: ”); scanf(%d,執(zhí)行n次,每執(zhí)行1次,n減1。,(a*2;a+),輸入: 8,輸出: 0 2 4 6 8 10 12 14,89,2、while和do-while循環(huán)比較: void main() int sum=0,i; scanf(“%d”, ,do sum=sum+i; i+; while(i=10);,輸入:8,輸入:11,sum=0,sum=11,90,3、不管是while循環(huán),還是do-w

41、hile循環(huán),在循環(huán)體內(nèi)必須要有能夠改變循環(huán)條件的語句,否則將構(gòu)成死循環(huán)。 4、循環(huán)條件設(shè)置要合理,否則也將構(gòu)成死循環(huán)。 5、不管是while循環(huán)還是do-while循環(huán),循環(huán)體如果包含一個以上的語句,都應(yīng)以復(fù)合語句的形式出現(xiàn)。,91,i=1;sum=0;while(i=10)sum+=I; i=1; sum=0;while(i=10)sum+=I;i+; i=100;sum=0;while(i=10)sum+=I;i+;,i為循環(huán)變量,沒有改變循環(huán)i的語句 ,條件一直滿足,死循環(huán),循環(huán)體,復(fù)合語句,執(zhí)行到 i=11 停止,條件不滿足,循環(huán)體語句不執(zhí)行,sum為: 0+1 1+2 3+3 +1

42、0,92,4.4.3 用for 語句實現(xiàn)循環(huán),語法格式: for (表達式1;表達式2;表達式3) 語句 要正確表達循環(huán)結(jié)構(gòu)應(yīng)注意三方面要求: 1、循環(huán)控制變量的初始化。 2、循環(huán)的條件。 3、循環(huán)控制變量的值的更新,for語句在書寫形式上集中體現(xiàn)了這三方面要求,93,功能:,for語句完全可以取代 while 語句。 for(表達式1;表達式2 ;表達式3) 語句 執(zhí)行過程: 1)先求解表達式1。 2)求解表達式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行第3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第5)步。 3)求解表達式3。 4)轉(zhuǎn)回第2)步繼續(xù)執(zhí)行。 5)循環(huán)結(jié)束

43、,執(zhí)行for語句下面的一個語句。,94,95,例:求 void main() int i,sum=0; i=1; do sum+=i; i+; while(i=100); printf(%dn,sum); void main() int i,sum=0; for(i=1;i=100;i+)sum+=i; printf(%dn,sum); ,96,例:計算 p=123 n void main( ) int i,n;long p; scanf(”%d”, ,for(i=1 , p=1 ; i=n ; i+) P*=i;,中間用逗號,for(i=1 , p=1 ; i=n ; P*=i, i+);,

44、97,例:計算 s=1!+2!+3!+ +n! (n0) void main( ) int i,n;long s,t; scanf(”%d”,for (i=1, t=1, s=0 ; i=n ; i+) t*= i ; s+=t;,i=1;t=1; s=0; for (; i=n ; i+) t*= i ; s+=t;,i=1;t=1; s=0; for (; i=n ; t*= i , s+=t,i+);,98,for語句形式: for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量) 語句,總是一個賦值語句, 它用來給循環(huán)控制變量賦初值,總是一個表達式, 它用來判別循環(huán)是否終止,定義循環(huán)控制變量每

45、循環(huán)一次后按什么方式變化,這三個部分之間用“;”分開,99,對于for循環(huán)中語句的一般形式, for(表達式1;表達式2 ;表達式3) 語句 就是如下的while循環(huán)形式: 表達式1; while(表達式2) 語句 表達式3;,100,例:寫出下面程序的輸出結(jié)果 #include void main ( ) char c; for ( ; (c=getchar() -#; ) putchar( c ); ,c為#,值為0,結(jié)束,可以是任意表達式,輸入: a56*3h#hj$,輸出: a56*3h,101,例:統(tǒng)計從鍵盤輸入一行字符的個數(shù),以回車結(jié)束。 #include void main()

46、int n; char c; printf(Input a string: n); for(n=0; (c=getchar()!=n ;n+) ; printf(%d,n); ,意義是:從鍵盤輸入一個字符并賦值給變量c,將c與字符n比較,不一樣就繼續(xù)循環(huán)。,完成對輸入字符個數(shù)計數(shù),循環(huán)體是空語句,輸入:Abg23bs 輸出:7,102,例:下面程序的輸出結(jié)果是 void main ( ) int x=10,y=10,i; for ( i=0;x 8;y= +i ) printf (”%3d%3d” ,x-,y) ; A 10 1 9 2 B 9 8 7 6 C 10 10 9 1 D 10 9

47、 9 0,表達式1只做一次,9,1,8,C,2,103,注意:,1)for循環(huán)中的“表達式1”、“表達式2(循環(huán)條件)”和“表達式3” 可以缺省,但“;”不能缺省。 2)省略了“表達式1”, 表示不對循環(huán)控制變量賦初值,可在for循環(huán)里面或外面對其賦初值。 例如: i=1; for(;i=20;i+) scanf (”%f ”,104,4)省略了“表達式3(循環(huán)變量增量)”, 則不對循環(huán)控制變量進行操作,這時可在語句體中加入修改循環(huán)控制變量的語句。 例如: for(i=1;i=100; ) sum=sum+i; i+ ;,105,5)省略了“表達式1”和“表達式3”。 例如: for(;i=1

48、00;) sum=sum+i; i+; 相當(dāng)于: while(i=100) sum=sum+i; i+;,106,6)3個表達式都可以省略。 例如: for(;)語句 相當(dāng)于: while(1)語句 7)表達式1可以是設(shè)置循環(huán)變量的初值的賦值表達式,也可以是其他表達式。 例如: for(sum=0;i=100;i+)sum=sum+i;,107,8)表達式1和表達式3可以是一個簡單表達式也可以是逗號表達式。 for(sum=0,i=1;i=100;i+)sum=sum+i; 或: for(i=0,j=100;i=100;i+,j-)k=i+j; 9)表達式2一般是關(guān)系表達式或邏輯表達式,但也可

49、是數(shù)值表達式或字符表達式,只要其值非零,就執(zhí)行循環(huán)體。 例如: for(i=0;(c=getchar()!=n;i+=c); 又如: for(;(c=getchar()!=n;) printf(“%c”,c);,108,例:“斐波那契數(shù)列”是意大利中世紀數(shù)學(xué)家列昂納多斐波那契以兔子繁殖為例子而引入的:兔子在出生兩個月后,一對兔子每個月能生出一對小兔子來。如果所有兔子都不死,那么一年以后可以繁殖多少對兔子?經(jīng)過分析: 經(jīng)過月份:-0-1-2-3-4-5-6-7- 兔子對數(shù):-1-1-2-3-5-8-13-21- 數(shù)字1,1,2,3,5,8,13, 構(gòu)成了一個數(shù)列。,109,數(shù)字1,1,2,3,5

50、,8,13,有明顯的特點: 前面相鄰兩項之和,構(gòu)成了后一項。 我們可以得到遞推公式如下: 程序運行結(jié)果為: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,110,遞推過程如下: 1 1 2 3 5 第一次 x1 + x2 x1 第二次 x2 + x1 x2 第三次 x1 + x2 x1,111,void main() int i,x1=1,x2=1; for(i=1;i=10;i+) printf(”%10d %10d ”,x1,x2); if(i%2=0)printf(”n”); x1=x1+x2; x2

51、=x2+x1; ,每次生成并輸出兩項,所以循環(huán)10次,當(dāng)i為偶數(shù)時換行,即每四個數(shù)換行,112,4.4.4 break語句和continue語句,switch 結(jié)構(gòu)中的 break:提前結(jié)束該結(jié)構(gòu) 循環(huán)結(jié)構(gòu)中的break:提前結(jié)束該結(jié)構(gòu) (while循環(huán)、do-while循環(huán)、for循環(huán)) 循環(huán)結(jié)構(gòu)中的continue:提前結(jié)束本次循環(huán),若在多層嵌套中使用break或continue,它只影響包含它的最內(nèi)層結(jié)構(gòu),113,114,break語句可以用終止循環(huán)結(jié)構(gòu),也可以終止switch結(jié)構(gòu)。而continue語句只能用于循環(huán)語句中,與switch語句沒有關(guān)系。 void main( ) int

52、i,a=0,b=0,c=0,d=0; for(i=1;i=4;i+) switch(i) case 1:a=1;continue; case 2:b=2; case 3:c=3; break; case 4:d=4; printf(%d%d%d%dn,a,b,c,d) ,1,1,2,2,0,0,0,3,輸出:1230,0,3,3,輸出:1230,0,4,4,輸出:1234,1,1,2,1,2,3,115,例: 寫出以下程序的運行結(jié)果: void main( ) int n; for (n=1;n=10;n+ +) if(n%3=0)break;printf(“%4d”,n); printf(“

53、!n”); void main( ) int n; for (n=1;n=10;n+ +) if(n%3=0) cotinue;printf(“%4d”,n); printf(“!n”);,結(jié)果:1 2!,結(jié)果:1 2 4 5 7 8 10!,116,例:輸出100200之間所有能夠被7或9整除的數(shù)。 。 #include void main( ) int n; for(n=100;n=200;n+) if(n%7!=0) ,不能被7或9整除,則進行下一次循環(huán),for(i=100;i=200;i+) if(i%7=0)|(i%9=0) printf(%d n,i);,這樣寫邏輯更清晰,117,

54、例:將數(shù)字512表示成兩個數(shù)的和,這兩個數(shù)分別為15和13的倍數(shù)。 #include void main() int i; for(i=1;i+) if(!(512-i*15)%13)break; printf(%d+%d=512n,i*15,512-i*15); ,結(jié)果:135+377=512,設(shè)第一個數(shù)為i*15 則第二個數(shù)為512-i*15。設(shè)定一個循環(huán),使i從1開始遞增,直到使得512-i*15能夠被13整除。,118,4.4.5 循環(huán)的嵌套,1、各種循環(huán)結(jié)構(gòu)的循環(huán)體中可以包含任一種完整的循環(huán)結(jié)構(gòu)、選擇結(jié)構(gòu), 2、選擇結(jié)構(gòu)的任一分支中也可以包含任一種完整的循環(huán)結(jié)構(gòu)、選擇結(jié)構(gòu), 3、且它

55、們可多層嵌套。,119,例1.while (xy+z) for(k=1;k2;k+ +) if ( a5) w=1; else if ( a=5 ) switch 結(jié)構(gòu) else for (s=0,n=0;n3;n+) s+=n; ,120,例: 輸出所有由1、2、3組成的三位數(shù),111 211 311 112 212 312 113 213 313 121 221 321 122 222 322 123 223 323 131 231 331 132 231 332 133 233 333,121,void main() int i,j,k; for(i=1;i=3;i+) for(j=1;j=3;j+) for(k=1;k=3;k+) printf(“%d%d%d ”,i,j,k); %d%d%d沒有空格和逗號,起分隔符作用,122,改為不出現(xiàn)重復(fù)數(shù)字的三位數(shù) void main() int i,j,k; for(i=1;i=3;i+) for(j=1;j=3;j+) for(k=1;k=3;k+) if(i!=j ,123,改為不出現(xiàn)重復(fù)字母 的由X、Y、Z組成的三個子符的字符串 void 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論