C語(yǔ)言程序控制結(jié)構(gòu).ppt
《C語(yǔ)言程序控制結(jié)構(gòu).ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《C語(yǔ)言程序控制結(jié)構(gòu).ppt(100頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
第4章 程序控制結(jié)構(gòu),,主要內(nèi)容,4.1 C語(yǔ)言的執(zhí)行語(yǔ)句 4.2 順序結(jié)構(gòu) 4.3 選擇結(jié)構(gòu) 4.4 循環(huán)結(jié)構(gòu),4.1C語(yǔ)言的執(zhí)行語(yǔ)句,C語(yǔ)言的語(yǔ)句分為聲明語(yǔ)句和執(zhí)行語(yǔ)句。第3章介紹的變量定義語(yǔ)句是最常見(jiàn)的聲明語(yǔ)句,聲明語(yǔ)句在編譯時(shí)處理,在程序運(yùn)行時(shí)不產(chǎn)生相應(yīng)的操作。執(zhí)行語(yǔ)句的作用是在程序運(yùn)行時(shí)向計(jì)算機(jī)系統(tǒng)發(fā)出操作命令,使計(jì)算機(jī)執(zhí)行特定的操作. C語(yǔ)句:以“;”作結(jié)束符,編譯后產(chǎn)生機(jī)器指令。 C語(yǔ)句分類: 表達(dá)式語(yǔ)句 空語(yǔ)句 控制語(yǔ)句 復(fù)合語(yǔ)句,4.1.1表達(dá)式語(yǔ)句,表達(dá)式語(yǔ)句是在表達(dá)式的末尾加上分號(hào)構(gòu)成的語(yǔ)句。 z=x+sin(y); a-=a*a; 賦值語(yǔ)句 i++; 自增1語(yǔ)句 x=0,y=1; 逗號(hào)表達(dá)式語(yǔ)句 x+y; 無(wú)意義 printf(“This is a C program.\n”); 函數(shù)調(diào)用語(yǔ)句 賦值語(yǔ)句和函數(shù)調(diào)用語(yǔ)句是使用最多的表達(dá)式語(yǔ)句,如: printf(“This is a C statement.“); func(a,5); y=max(a,b);,4.1.2空語(yǔ)句,僅由一個(gè)“;”構(gòu)成的語(yǔ)句 只是在邏輯上起到一個(gè)語(yǔ)句的作用,在編譯時(shí)不產(chǎn)生任何指令,在執(zhí)行時(shí)不產(chǎn)生任何操作。 作用: 構(gòu)成標(biāo)號(hào)語(yǔ)句,標(biāo)示流程的轉(zhuǎn)向點(diǎn); 構(gòu)成循環(huán)語(yǔ)句中空循環(huán)體。 例如:while(getchar()!=‘\n’) ; 只要從鍵盤(pán)上輸入的字符不是回車(chē)則重新輸入。,4.1.3復(fù)合語(yǔ)句,用 { }括起來(lái)的一組語(yǔ)句。 一般形式: { 執(zhí)行語(yǔ)句; },說(shuō)明: “}”后不加分號(hào) 其中最后一個(gè)語(yǔ)句后也要加分號(hào) 語(yǔ)法上和單一語(yǔ)句相同 復(fù)合語(yǔ)句可嵌套,如: { z=x+y; t=z/100; printf(“%f“,t); },如: { z=x+y; { t=z/100; printf(“%f“,t); } },4.1.4控制語(yǔ)句,控制語(yǔ)句:完成一定的控制功能。,如: if (xy) z=x; else z=y;,4.2順序結(jié)構(gòu),流程圖 流程圖是表示算法的一種工具,用一些圖框來(lái)表示各種操作。 一個(gè)流程圖包括以下幾部分 : 表示相應(yīng)操作的框; 帶箭頭的流程線; 框內(nèi)外必要的文字說(shuō)明。,順序結(jié)構(gòu),常用的流程圖符號(hào):,N-S流程圖:完全去掉了流程線,算法的每一步都用矩形框描述,把一個(gè)個(gè)矩形框按執(zhí)行的次序連接起來(lái)就是一個(gè)完整的算法描述。,順序結(jié)構(gòu),結(jié)構(gòu)化程序的三種基本結(jié)構(gòu) 順序結(jié)構(gòu):按書(shū)寫(xiě)順序執(zhí)行的語(yǔ)句構(gòu)成的程序段,選擇結(jié)構(gòu) 循環(huán)結(jié)構(gòu),,例4.1 輸入任意兩個(gè)整數(shù),求它們的和及平均值。要求平均值取兩位小數(shù)輸出。,//例4.1 #include #include void main() { int num1, num2; float sum, aver; printf(“Please input two integers: \n“); scanf(“%d,%d“, },運(yùn)行情況: 30000,5005 ? sum=35005, aver= 17502.50,例4.2 給定一個(gè)三位正整數(shù),分別輸出其個(gè)位數(shù)、十位數(shù)和百位數(shù)。,#include void main() { int m,m0,m1,m2; printf(“Input a number(100~999):”); scanf(“%d“, },運(yùn)行結(jié)果: Input a number(100~999):263 ? 輸出: 3,6,2,,例4.3 取一個(gè)16位的二進(jìn)制數(shù)a的7、6、5、4四個(gè)位,如圖4-2中加陰影的部分。,void main() { unsigned a,b,c,d; scanf(“%x“, /*以十六進(jìn)制輸出a和結(jié)果d*/ },例4.4 求ax2+bx+c=0方程的根。 a,b,c由鍵盤(pán)輸入,設(shè) >0。 一元二次方程式的根為 x1= x2= 可以將上面的分式分為兩項(xiàng): p= , q= ,則 x1=p+q,x2=p-q。,順序結(jié)構(gòu),,#include #include void main ( ) { float a,b,c,disc,x1,x2,p,q; scanf(“a=%f,b=%f,c=%f“, },運(yùn)行情況: 輸入: a=1, b=3, c=2 ? 輸出: x1=-1.00 x2=-2.00,4.3選擇結(jié)構(gòu),選擇結(jié)構(gòu)是指在程序執(zhí)行過(guò)程中,根據(jù)指定條件的當(dāng)前值在兩條或多條路徑中選擇一條執(zhí)行。 C語(yǔ)言的選擇控制語(yǔ)句有兩條: 條件選擇語(yǔ)句:if語(yǔ)句 開(kāi)關(guān)分支語(yǔ)句:switch語(yǔ)句,4.3.1 if語(yǔ)句,1、if 格式(單分支語(yǔ)句) if (判斷表達(dá)式) 語(yǔ)句1; 語(yǔ)句 1可以是一條語(yǔ)句或復(fù)合語(yǔ)句。 注意:滿足條件時(shí)想要執(zhí)行多條語(yǔ)句一定要用復(fù)合語(yǔ)句,當(dāng)判斷表達(dá)式值不為零(即”真”), 則執(zhí)行語(yǔ)句1, 再執(zhí)行其后繼語(yǔ)句; 否則, 不執(zhí)行語(yǔ)句 1, 執(zhí)行其后繼語(yǔ)句。,單分支語(yǔ)句,判斷表達(dá)式應(yīng)該是具有一定意義、有實(shí)用價(jià)值的表達(dá)式,因此,最常用關(guān)系表達(dá)式和邏輯表達(dá)式來(lái)表達(dá),例如: if(a==b) if(a==0) 等價(jià)于if(!a) if(a!=0) 等價(jià)于if(a) if(a=5&&a=10),例:輸入一個(gè)整數(shù),求絕對(duì)值. main( ) { int i ; scanf(“%d“, },例:執(zhí)行下列程序段后 a 的值是____。 int a=3; if (2) a=5;,單分支語(yǔ)句,#include main( ) { char c; printf(“input a letter:“); c=getchar(); if(c='A' },例4.5 從鍵盤(pán)輸入一個(gè)字母,以小寫(xiě)字母形式輸出該字母,單分支語(yǔ)句,例4.6從鍵盤(pán)輸入兩個(gè)整數(shù),按升序輸出這兩個(gè)數(shù)。,#include void main( ) { int a,b,t; scanf(“%d%d“, },例:輸入三個(gè)數(shù)a,b,c,要求按由小到大的順序輸出。,If ab 將a和b對(duì)換 If ac 將a和c對(duì)換 If bc 將b和c對(duì)換,單分支語(yǔ)句,單分支語(yǔ)句,#include void main ( ) { float a,b,c,t; scanf(“%f%f%f“, },{ }必不可少,否則,會(huì)出現(xiàn)邏輯錯(cuò)誤!,2、if(表達(dá)式) 語(yǔ)句1 else 語(yǔ)句2,雙分支if-else語(yǔ)句,例:if (xy) printf(“%d”,x); else printf(“%d”,y);,雙分支if-else語(yǔ)句,說(shuō)明:在if和else后面可以只含有一條語(yǔ)句,也可以含有用花括號(hào){ }括起來(lái)的復(fù)合語(yǔ)句。如: if ((a+b)c,例: 輸入兩個(gè)數(shù)并判斷兩數(shù)是否相等。,#include void main( ) { int a,b; printf(“Enter integer a:“); scanf(“%d“, },運(yùn)行結(jié)果: Enter integer a:12? Enter integer b:12? a==b,運(yùn)行結(jié)果: Enter integer a:12? Enter integer b:9? a!=b,雙分支if-else語(yǔ)句,分析以下程序的輸出結(jié)果:,(1) #include void main ( ) { int a,b; scanf(“%d“, },(2) #include void main ( ) {int a,b,t; scanf(“%d%d“, },(3)#include void main ( ) { int x,y; scanf(“%d“, },(4)程序輸出結(jié)果 #include void main( ) { int x,y; scanf(“%d“, },3.多分支語(yǔ)句,幾種形式:,3、if(表達(dá)式1)語(yǔ)句1 else if(表達(dá)式2)語(yǔ)句2 else if(表達(dá)式3)語(yǔ)句3 …… else if(表達(dá)式m)語(yǔ)句m else 語(yǔ)句n,多分支語(yǔ)句,例: if (number500)cost=0.15; else if(number300)cost=0.10; else if(number100)cost=0.075; else if(number50)cost=0.05; else cost=0;,多分支語(yǔ)句,多分支語(yǔ)句,匹配規(guī)則: Else總是與它上面的,最近的,統(tǒng)一復(fù)合語(yǔ)句中的,未配 對(duì)的if語(yǔ)句配對(duì)。,當(dāng)if和else數(shù)目不同時(shí),可以加花括號(hào)來(lái)確定配對(duì)關(guān)系。,例: if (a==b) if(b==c) printf(“a==b==c”); else printf(“a!=b”);,修改: if (a==b) { if(b==c) printf(“a==b==c”); } else printf(“a!=b”);,-1 (x0) 算法1: 算法1: 輸入x 輸入x 若x0,則y=1 若x=0,則y=0 輸出y 若x0,則y=1 輸出y,,多分支語(yǔ)句,,程序 #include void main( ) { int x,y; scanf(“%d”, },程序1: 程序2: if(x=0) y=-1; if(x0) y=1; else else y=0; if(x==0) y=0; else y=-1; else y=1; 程序3: 程序4: y=-1; y=0; if(x!=0) if(x=0) if(x0) y=1; if(x0) y=1; else y=0; else y=-1;,正 確,正 確,上例中的程序段有四個(gè),請(qǐng)判斷哪個(gè)是正確的?,X0時(shí),y=0,X=0時(shí),y=-1,多分支語(yǔ)句,例4.7:輸入百分制成績(jī),要求輸出相應(yīng)的五級(jí)制成績(jī)。百分制成績(jī)與五級(jí)制成績(jī)之間的轉(zhuǎn)換標(biāo)準(zhǔn)為: 90分以上為“A”, 80-89分為“B”, 70-79分為“C”, 60-69分為“D”, 60分以下為“E”。,If語(yǔ)句嵌套,void main ( ) { int score; printf(“\nPlease input the score(0-100):“); scanf(“%d“, },多分支語(yǔ)句,例4.8 分段函數(shù)定義如右: 根據(jù)所輸入的x的值,求函數(shù)值。 main ( ) { float x,y; scanf(“%f“, },4.3.2 switch語(yǔ)句,switch語(yǔ)句的格式: switch (表達(dá)式) {case 常量表達(dá)式1:語(yǔ)句1 [break;] case 常量表達(dá)式2:語(yǔ)句2 [break;] … case 常量表達(dá)式n:語(yǔ)句n [break;] default :語(yǔ)句n+1 },執(zhí)行過(guò)程: 當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就從此case后面的語(yǔ)句開(kāi)始執(zhí)行下去,若所有的case中的常量表達(dá)式的值都沒(méi)有與表達(dá)式的值匹配的,就執(zhí)行default后面的語(yǔ)句。,switch語(yǔ)句,switch語(yǔ)句,執(zhí)行流程: 首先計(jì)算switch圓括號(hào)中表達(dá)式的值,然后將結(jié)果值按前后順序依次與各個(gè)case后的常量表達(dá)式進(jìn)行比較。 當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行該case后邊的語(yǔ)句組k,接著如果遇到break語(yǔ)句, 則結(jié)束整個(gè)switch語(yǔ)句(即退出switch)。如果不遇到break語(yǔ)句,則按順序執(zhí)行下面其他case后邊的語(yǔ)句組, 直至遇到break語(yǔ)句或最后邊的“}”為止, 才結(jié)束switch語(yǔ)句 當(dāng)結(jié)果值與常量表達(dá)式k的值都不相等時(shí), 若有default, 則執(zhí)行其后語(yǔ)句;若無(wú)default, 則什么都沒(méi)執(zhí)行,switch語(yǔ)句,說(shuō)明: 1)switch關(guān)鍵字,case也是關(guān)鍵字,與其后面的常量表達(dá)式合稱case語(yǔ)句標(biāo)號(hào),常量表達(dá)式類型必須與switch后面表達(dá)式類型相匹配,且各case語(yǔ)句標(biāo)號(hào)的值各不相同,不能重復(fù);default也是關(guān)鍵字,起語(yǔ)句標(biāo)號(hào)的作用,代表除了以上所有case標(biāo)號(hào)之外的那些標(biāo)號(hào); 2)語(yǔ)句1、語(yǔ)句2可以是一條語(yǔ)句,也可以是若干條,在必要時(shí), case語(yǔ)句標(biāo)號(hào)后的語(yǔ)句可以省略不寫(xiě); 3) switch的表達(dá)式通常是一個(gè)整型或字符型變量,也允許枚舉型變量,其結(jié)果為相應(yīng)的整數(shù)、字符或枚舉常量; 4)break語(yǔ)句不是一定需要加上,執(zhí)行完一個(gè)case后面的語(yǔ)句,若沒(méi)有遇到break,就自動(dòng)進(jìn)入下一個(gè)case繼續(xù)執(zhí)行,而不再判斷是否與之匹配。,當(dāng)程序在執(zhí)行時(shí),如果輸入的是′A′,#include “stdio.h“ main() {char a; a=getchar(); switch(a) { case 65: printf(“%c“,′A′); case 66: printf(“%c“,′B′); default :printf(“%s\n“,“other“); } },運(yùn)行結(jié)果: ABother,當(dāng)程序在執(zhí)行時(shí),屏幕上輸出為:,#include “stdio.h“ main() { int k=2; switch(k) { case 1: printf(“%d\n“,k++);break; case 2: printf(“%d“,k++); case 3: printf(“%d\n“,k++);break; cade 4: printf(“%d\n“,k++); default :printf(“Full!\n“); } },運(yùn)行結(jié)果: 2 3,switch語(yǔ)句,例:要求按照考試成績(jī)的等級(jí)輸出百分制分?jǐn)?shù)段,用switch語(yǔ)句實(shí)現(xiàn),應(yīng)寫(xiě)為: switch(grade) { case 'A': printf(“85~100\n“); break; case 'B': printf (“70~84\n“); break; case 'C': printf (“60~69\n“); break; case 'D': printf (“60\n“); break; default: printf(“error\n“); },補(bǔ)充例:輸入成績(jī), 用A、B、C、D、F、R分別表示優(yōu)、良、中、及格、不及格、補(bǔ)考、缺考。,grade=getchar( ); switch (grade) { case 'A': case 'a': printf(“優(yōu)“);break; case 'B': case 'b': printf(“良“);break; case 'C': case 'c': printf(“中“);break; case 'D': case 'd': printf(“及格“);break; case 'F ': case 'f ': printf(“不及格“); /* 此處沒(méi)有break語(yǔ)句 */ case 'R': case 'r': printf(“請(qǐng)補(bǔ)考“);break; default: printf(“輸入錯(cuò)“); },switch語(yǔ)句,例:某幼兒園只收2至6歲的兒童。2~3歲入小班,4歲入中班,5~6歲入大班。根據(jù)輸入的年齡,求應(yīng)入的班級(jí)。 分析:設(shè)年齡為age,當(dāng)age為2和3時(shí),應(yīng)輸出同樣的內(nèi)容“入小班”,age為5和6時(shí)輸出同樣的內(nèi)容“入大班”。該題算法比較簡(jiǎn)單。,switch語(yǔ)句,#include void main() { int age; printf(“Please enter age: “); scanf(“%d“, } },void main() { int x,y,a=0,b=0; scanf(“x=%d,y=%d“, },運(yùn)行結(jié)果: 輸入:x=1,y=0 ? 輸出:a=2 b=2,switch語(yǔ)句的嵌套,選擇結(jié)構(gòu)程序舉例,例4.13 輸入一個(gè)字符,判別該字符是數(shù)字、英文大寫(xiě)字母、小寫(xiě)字母還是其它字符。 #include void main() { char c; printf(“input a char: “); c=getchar(); if (c='0' },選擇結(jié)構(gòu)程序舉例,例4.14 輸入三角形三邊長(zhǎng),求三角形面積。 #include void main() { float a,b,c,s,area; scanf(“%f,%f,%f“, },選擇結(jié)構(gòu)程序舉例,例4.15 輸入a、b、c三個(gè)整數(shù),輸出最大數(shù)和最小數(shù)。 void main() { int a,b,c,max,min; printf(“input three numbers: “); scanf(“%d,%d,%d“, },課堂練習(xí),1.以下程序的運(yùn)行結(jié)果是( )。 main( ) { int n=5; if(n++=6) printf(“%d\n“, n); else printf(“%d\n“, ++n); } 2.對(duì)于整型變量a,賦值語(yǔ)句 a=(a%3==0?1:0); 與( )語(yǔ)句不等價(jià)。 (A) if (a%3==0) a=1; else a=0; (B) if (a%3!=0) a=0; else a=1; (C) if (a%3) a=0; else a=1; (D) if (a%3) a=1; else a=0;,課堂練習(xí),3.以下程序的運(yùn)行結(jié)果是( )。 main() { int n='c'; switch(n++) { default: printf(“error “); break; case 'a': case 'b': printf(“good “); break; case 'c': printf(“pass “); case 'd': printf(“warn “); } },循環(huán)結(jié)構(gòu),在許多問(wèn)題中需要用到循環(huán)控制。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、選擇結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。 特點(diǎn):當(dāng)給定的條件成立時(shí), 反復(fù)執(zhí)行某個(gè)程序段,直到條件不成立為止。給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體, 它由C的語(yǔ)句構(gòu)成。 C語(yǔ)言提供了3種循環(huán)結(jié)構(gòu): while語(yǔ)句; do-while語(yǔ)句; for語(yǔ)句,4.4.1用while語(yǔ)句實(shí)現(xiàn)循環(huán),while語(yǔ)句用來(lái)實(shí)現(xiàn)“當(dāng)型”循環(huán)結(jié)構(gòu)。 一般形式: while (表達(dá)式) 語(yǔ)句 當(dāng)表達(dá)式為非0值時(shí),執(zhí)行while語(yǔ)句中的內(nèi)嵌語(yǔ)句。 其特點(diǎn)是:先判斷表達(dá)式,后執(zhí)行語(yǔ)句。,(1) 與 if 的區(qū)別, if 只一次, while反復(fù)判斷, 反復(fù)執(zhí)行; (2) while 語(yǔ)句中通常有改變表達(dá)式的值的語(yǔ)句。,用while語(yǔ)句實(shí)現(xiàn)循環(huán),例4.18 計(jì)算1+2+…+100。 main() { int i=1, s=0; while ( i=100) { s+=i; i++; } printf(“%d, %d“, i, s); getch(); },1.如果缺少i++這一行會(huì)出現(xiàn)什么情況? 2.若計(jì)算:n!該程序應(yīng)如何修改?,,例4.19 根據(jù)公式 計(jì)算π的值。,#include void main() { int i=1, n; double pi=0; printf(“Input an integer:\n“); scanf(“%d“, },用while語(yǔ)句實(shí)現(xiàn)循環(huán),例4.21 猴子吃桃問(wèn)題:猴子摘下了一堆桃子,第一天吃總數(shù)的一半多一個(gè),第二天吃剩下的一半多一個(gè),以后每天都吃前一天剩下的一半多一個(gè),到第十天想再吃時(shí)剩一個(gè),求猴子摘了多少個(gè)桃子?,算法分析: 設(shè)第 i 天未吃前有 x i 個(gè)桃子, 由題意得: x1/2-1=x2 x2/2-1=x3 … x9/2-1=x10 已知x10=1, 我們有: x10=1 xn-1=(xn+1)*2,void main( ) { int k,x1,x2; k=1; x2=1; while(k=9) { x1=(x2+1)*2; x2=x1; k++; } printf(“Total number=%d\n“,x1); },用while語(yǔ)句實(shí)現(xiàn)循環(huán),補(bǔ)充1. 統(tǒng)計(jì)從鍵盤(pán)輸入的字符個(gè)數(shù)。(以回車(chē)結(jié)束),補(bǔ)充2. 從鍵盤(pán)輸入一個(gè)整數(shù)(至少大于9), 求最高位的數(shù)字.,#include main( ) { int count=0; while (getchar() !='\n') count++; printf(“count=%d“,count); } 這種結(jié)構(gòu)的循環(huán)次數(shù)是不確定的。,while (d9) d=d/10; /* 反復(fù)執(zhí)行d=d/10 */ printf(“最高位是%d“,d); 也可寫(xiě)成: while ((d/=10)9); /* 空循環(huán)體,反復(fù)執(zhí)行d=d/10 */ printf(“最高位是%d“,d);,4.4.2用do-while實(shí)現(xiàn)循環(huán),do-while語(yǔ)句的特點(diǎn):先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。一般形式: do { 循環(huán)體語(yǔ)句 } while (表達(dá)式);,執(zhí)行過(guò)程:先執(zhí)行一次指定的循環(huán)體語(yǔ)句,然后判別表達(dá)式,當(dāng)表達(dá)式的值為非零(“真”) 時(shí),返回重新執(zhí)行循環(huán)體語(yǔ)句,如此反復(fù),直到表達(dá)式的值等于0為止,此時(shí)循環(huán)結(jié)束。,用do-while實(shí)現(xiàn)循環(huán),用do-while計(jì)算 : 1+2+…+100。 main() { int i=1, s=0; do { s=s+i; i++; } while ( i=100); printf(“%d, %d“, i, s); getch(); },計(jì)算:1-3+5-7…+101 main() { int i=1,s=0; int s=1,t=1; do { s=s+t*i; i=i+2 t=-t; }while(i=101); printf(“%d\t“,s); },用do-while實(shí)現(xiàn)循環(huán),例4.22 利用格里高公式: 求π,直到最后一項(xiàng)的值小于10-6。 void main() { int s=1; float n=1.0, t=1, pi=0; do { pi=pi+t; n=n+2; /*分母每循環(huán)一次增加2*/ s=-s; /*單項(xiàng)的正負(fù)號(hào)交替變化*/ t=s/n; /*下一項(xiàng)的值*/ } while (fabs (t)1e-6); pi=pi*4; printf(“pi=%10.6f\n“, pi); },while和do…while循環(huán)的比較,上述程序的功能是什么? 比較:輸入5和11時(shí)兩個(gè)程序的輸出結(jié)果如何?,#include void main( ) { int i,sum=0; scanf(“%d“, },#include void main( ) { int i,sum=0; scanf(“%d“, },當(dāng)型循環(huán)最少執(zhí)行次數(shù)是多少? 直到型循環(huán),最少執(zhí)行次數(shù)是多少?,4.4.3用for語(yǔ)句實(shí)現(xiàn)循環(huán),C語(yǔ)言中的for語(yǔ)句使用最為靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語(yǔ)句。 一般形式: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 循環(huán)體 也可寫(xiě)作: for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)循環(huán)體,for語(yǔ)句等價(jià)于如下的while循環(huán)形式: 表達(dá)式1; while (表達(dá)式2) { 語(yǔ)句 表達(dá)式3; },用for語(yǔ)句實(shí)現(xiàn)循環(huán),for語(yǔ)句的執(zhí)行過(guò)程: (1) 先求解表達(dá)式1。 (2) 求解表達(dá)式2,若其值為真(值為非0),則執(zhí)行for語(yǔ)句中指定的內(nèi)嵌語(yǔ)句,然后執(zhí)行下面第(3)步。若為假(值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。 (3) 求解表達(dá)式3。 (4) 轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。 (5) 循環(huán)結(jié)束,執(zhí)行for語(yǔ)句下面的一個(gè)語(yǔ)句,用for循環(huán)計(jì)算 : 1+2+…+100。 main( ) { int i, s=0; for (i=1; i=100; i++) /* 注意括號(hào)后沒(méi)有分號(hào) */ s=s+i; /* 求和: 1+2+3+…+100 */ printf(“%d“, s); },變量i用于控制循環(huán)次數(shù), 我們稱其為循環(huán)控制變量。,1. 最后i的值是多少? 2. 從1加到10000或更多呢?,用for語(yǔ)句實(shí)現(xiàn)循環(huán),說(shuō)明:,表達(dá)式1,表達(dá)式2和表達(dá)式3之間必須用分號(hào)隔開(kāi),但表達(dá)式3后面不能加分號(hào)。 循環(huán)體如果包含一個(gè)以上的語(yǔ)句,應(yīng)該用花括弧括起來(lái),以復(fù)合語(yǔ)句形式出現(xiàn)。 循環(huán)體有可能一次也不執(zhí)行。 循環(huán)體可以為空。 表達(dá)式1和表達(dá)式3都可以為逗號(hào)表達(dá)式。(例) 表達(dá)式1,表達(dá)式2和表達(dá)式3都可省略,但不鼓勵(lì)省略表達(dá)式2和表達(dá)式3。(例:省略表達(dá)式1) for語(yǔ)句循環(huán)與while循環(huán)可以互相轉(zhuǎn)換,但for循環(huán)的結(jié)構(gòu)更簡(jiǎn)潔。,for語(yǔ)句的省略形式,例(1): i=1; for ( ; i=1000; i++) sum=sum+i ;,例(2): for (i=1; i=1000; ) { sum=sum+i ; i++; },例(3): for (i=1; ;i++) { if (i1000) break ;sum=sum+i ;},1)表達(dá)式1可省略,但分號(hào)不能省,在for語(yǔ)句前為變量賦初值; 2)表達(dá)式3也可省略,但應(yīng)把其放入循環(huán)體內(nèi),否則for無(wú)法正常結(jié)束; 3)表達(dá)式2省略后,for語(yǔ)句將無(wú)限循環(huán)下去??稍谘h(huán)體內(nèi)加退出循環(huán)的語(yǔ)句,for語(yǔ)句的省略形式,4)表達(dá)式1和表達(dá)式3可以是一個(gè)簡(jiǎn)單的表達(dá)式,也可以是一個(gè)逗號(hào)表達(dá)式,表達(dá)式1和表達(dá)式3也可以是與循環(huán)無(wú)關(guān)的任意表達(dá)式; 5)三個(gè)表達(dá)式全省略,無(wú)終止執(zhí)行循環(huán)體,分號(hào)不能省; 6)把循環(huán)體內(nèi)容放到表達(dá)式3,循環(huán)體為空語(yǔ)句。盡量避免此寫(xiě)法,例(4): i=1,sum=0; for (p=0 ; i=100;p+=1) {sum=sum+i ;i++;},例(6): for (i=1, sum=0; i1000; sum=sum+i, i++) ;,例(5): i=1,sum=0; for (; ; ) { sum=sum+i ; i++; if (i100) break; },用for語(yǔ)句實(shí)現(xiàn)循環(huán),例4.25 求1!+2!+…+10!的值。 void main() { int i, n=10; long s, t; for(i=1, t=1, s=0; i=n; i++) { t*=i; /*t為上一個(gè)數(shù)i-1的階乘值,再乘以i,即i!=(i-1)!*i*/ s+=t; /*累加i!*/ } printf (“s=%ld\n“, s); },用for語(yǔ)句實(shí)現(xiàn)循環(huán),例4.27 編程輸出“斐波那契數(shù)列”的前20項(xiàng)。 “斐波那契數(shù)列”是意大利中世紀(jì)數(shù)學(xué)家列昂納多·斐波那契以兔子繁殖為例子而引入的,故又稱為“兔子數(shù)列”。 main() { int i, x1=1, x2=1; for(i=1; i=10; i++) /*每次生成并輸出兩項(xiàng),所以循環(huán)10次*/ { printf(“%10d %10d “, x1, x2); if(i%2==0) printf(“\n“); /*當(dāng)i為偶數(shù)時(shí)換行,即每四個(gè)換行*/ x1=x1+x2; x2=x2+x1; } },用for語(yǔ)句實(shí)現(xiàn)循環(huán),最簡(jiǎn)單的寫(xiě)法: main() { int i, j, k=10000; for (i=1, j=0; i=k; i=i+j, j=i-j) printf(“ %d“,i ); } 這里: i 表示fibonacci(n) i=i+j; 即 第n項(xiàng)=第n-1項(xiàng)+第n-2項(xiàng) j=i-j; 即 第n-1項(xiàng)=第n項(xiàng)-第n-2項(xiàng) 使i存放當(dāng)前項(xiàng), j存放前一項(xiàng),程序運(yùn)行結(jié)果為: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,4.4.4 continue語(yǔ)句和break語(yǔ)句,1. break語(yǔ)句 (1)在while、 for、 do~while語(yǔ)句的循環(huán)體或switch語(yǔ)句的語(yǔ)句組中, 使用break語(yǔ)句可使程序立即退出該結(jié)構(gòu)。故有中斷語(yǔ)句之稱。 其語(yǔ)法格式如下: break; (2)功能:用在循環(huán)語(yǔ)句或switch語(yǔ)句中,使得跳出循環(huán)體或分支,提前結(jié)束循環(huán)或分支。,continue語(yǔ)句和break語(yǔ)句,#include void main() { int i; for (i=1 ; ; i++) if (!((512-i*15)%13))break; printf(“%d+%d=512\n“, i*15, 512-i*15); },例4.28 將數(shù)字512表示成兩個(gè)數(shù)的和,這兩個(gè)數(shù)分別為15和13的倍數(shù)。,運(yùn)行結(jié)果: 135+377=512,continue語(yǔ)句和break語(yǔ)句,說(shuō)明 break只能終止并跳出最近一層的循環(huán)結(jié)構(gòu)。 break不能用于循環(huán)語(yǔ)句和switch語(yǔ)句之外的任何其它語(yǔ)句之中。 在循環(huán)語(yǔ)句中,break總是與選擇語(yǔ)句配合使用。,main() { int i, s; s=0; for (i=1;i5) break; printf(“%d\n“, s); } },運(yùn)行結(jié)果: 1 3,continue語(yǔ)句和break語(yǔ)句,2. continue語(yǔ)句 一般形式: continue; 功能:用在循環(huán)語(yǔ)句中,使得結(jié)束本次循環(huán),即跳過(guò)循環(huán)體中下面尚未執(zhí)行的語(yǔ)句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。 補(bǔ)充例題: for (i=1; i=10; i++) { if ( i%2==0 ) continue; printf(“%d”, i); } 該程序的功能是:只打印出單數(shù),continue語(yǔ)句和break語(yǔ)句,說(shuō)明: continue只能終止本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行。 continue不能用于循環(huán)語(yǔ)句之外的任何其它語(yǔ)句之中. continue總是與選擇語(yǔ)句配合使用。,//例4.29 #include void main( ) {int i,n=0; for(i=100;i=200;i++) {if((i%7!=0) } },例4.29 輸出100~200之間所有能被7或9整除的數(shù)。,continue語(yǔ)句和break語(yǔ)句,補(bǔ)充例:計(jì)算輸入的10個(gè)整數(shù)中正數(shù)的個(gè)數(shù)及正數(shù)平均值。 main() { int i,n,a; float s=0.0; printf(“請(qǐng)輸入10個(gè)整數(shù):\n“); for (n=0,i=0;i0) 下兩句要加{ } */ s+=a; n++; } printf(“共有%d個(gè)正數(shù).其平均值為%f。\n“,n,s/n); },,3. continue和break的區(qū)別: continue語(yǔ)句只是結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行,而break語(yǔ)句則是結(jié)束整個(gè)循環(huán)過(guò)程,不再判斷條件是否成立。,continue語(yǔ)句和break語(yǔ)句,main() { int 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%d\n“, a, b, c, d); } },main() { int i, s; s=0; for (i=1;i5) break; printf(“%d\n“, s); } },continue語(yǔ)句和break語(yǔ)句,main() { int k=4,n=0; clrscr(); for (;nk;) { n++; if(n%3!=0) break; k--; } printf(“%d,%d\n“, k,n); },運(yùn)行結(jié)果: 4, 1,將break改為continue 運(yùn)行結(jié)果: 3, 3,4.4.5循環(huán)的嵌套,循環(huán)的嵌套:一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu)。 多層循環(huán):內(nèi)嵌的循環(huán)中還可以嵌套循環(huán)。 三種循環(huán)(while循環(huán)、do-while循環(huán)和for循環(huán))可以互相嵌套,層數(shù)不限。循環(huán)嵌套形式舉例:,(1) while( ) (2) do (3) for(;;) { … { … { … while( ) do for(;;) {…} {… } {… } … while( ); … } } } while( );,循環(huán)的嵌套,(4) while( ) (5) for(;;) (6) do { … { … { … do while( ) for(;;) {…} { } { } while( ) … … … } } } while( ),外層循環(huán)可包含兩個(gè)以上內(nèi)循環(huán),但不能相互交叉。 嵌套循環(huán)的執(zhí)行流程 例:for(i=1; i=n; i++) for(j=1; j=5; j++) s=i*j;,例4.30 在屏幕上輸出如下圖形:,main() { int i, j, k; for(i=8; i=1; i--) /*總共要輸出8行星號(hào)*/ { for(j=1; j=8-i; j++) printf(“ “); /*控制每行星號(hào)前面顯示的空格*/ for(k=1; k=2*i-1; k++) printf(“*“); /*控制每行星號(hào)的個(gè)數(shù)*/ printf(“\n“); /*控制輸出每行星號(hào)后換行*/ } },循環(huán)的嵌套,例4.31 改寫(xiě)例4.25 求1!+2!+…+10!的程序,用嵌套的循環(huán)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。,main() { int i, n=10, j; long s=0, t; for(i=1; i=n; i++) { for(t=1, j=1; j=i; j++) t*=j; /*每次循環(huán)都重新計(jì)算i!*/ s+=t; /*累加i!*/ } printf (“s=%ld\n“,s); },程序舉例—窮舉法,,例4.32 三位自方冪數(shù)又稱水仙花數(shù),用窮舉法求出所有水仙花數(shù)。如:13+53+33=153,main() { int i,j,k,m1,m2; printf(“narcissus numbers are: “); for(i=1;i=9;i++) for(j=0;j=9;j++) for(k=0;k=9;k++) { m1=i*100+j*10+k; m2=i*i*i+j*j*j+k*k*k; if (m1==m2) printf(“%4d“,m1); } printf(“\n“); },程序舉例—數(shù)的分離,例4.33 編寫(xiě)一個(gè)程序,輸入1~32767之間的整數(shù),把這個(gè)整數(shù)顯示為一系列數(shù)字,每組數(shù)字都是用兩個(gè)空格分開(kāi)。例如,整數(shù)1234應(yīng)該顯示為:1 2 3 4。,main() { int i,num,counter,temp; counter=1; printf(“Enter an integer: “); scanf(“%d“, },,程序舉例—方程求根,例4.34 用二分法求非線性方程f(x)=x3+1.1x2+0.9x-1.4=0的根。,,,void main() { float x, x1, x2, y1, y2, y; do { printf(“Input x1,x2: \n“); scanf(“%f,%f“, },程序舉例—多項(xiàng)式計(jì)算,例4.35 編程計(jì)算多項(xiàng)式 的值。,void main() { float sum, term, x; int n, k, sign; printf(“Input n, x: \n“); scanf(“%d,%f“, },程序舉例—數(shù)的判別,例4.36 輸入一個(gè)數(shù),判斷這個(gè)數(shù)是否為素?cái)?shù)。,void main() { int m, i, k; printf(“Enter an integer:\n“); scanf(“%d“, },,程序舉例—輾轉(zhuǎn)相除法,例4.37 用輾轉(zhuǎn)相除法求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)。,void main() { int a,b,m,n,temp,c,d; printf(“Please enter 2 integers n,m:\n“); scanf(“%d,%d“, },,程序舉例—統(tǒng)計(jì)問(wèn)題,例4.38 輸入十個(gè)數(shù),求出最大數(shù)、最小數(shù)和奇數(shù)、偶數(shù)個(gè)數(shù)。,void main() { int i,max,min,oldn=0,even=0,x; for(i=1; imax) max=x; if (xmin) min=x; } printf(“max=%d,mix=%d\n“,max,min); printf(“There are %d even numbers.\n“,even); printf(“There are %d old numbers.\n“,oldn); },,程序舉例—面積問(wèn)題,例如:求曲線 y2=x 在3=x=15間圍成如右圖的陰影部分面積.,曲線方程可轉(zhuǎn)化為:,而求陰影部分的面積其實(shí)就是求下式積分的問(wèn)題:,也就是接近將區(qū)域微分為足夠多的小矩形的面積和。當(dāng)然,一種方法就是從數(shù)學(xué)上求出它的積分;另一種可與C語(yǔ)言來(lái)描述:,程序舉例—面積問(wèn)題,#include main() { double x,area=0.0; for (x=3; x15; x=x+0.01) area=area+sqrt(x)*0.01; printf(“area is:%f\n“,area); getch(); },課 堂 練 習(xí),1.以下程序的運(yùn)行結(jié)果是( )。 void main() { int sum = 0, item = 0; while (item =6) break; } printf(“%d\n“,sum); },2.以下程序的運(yùn)行結(jié)果是( )。 void main() { int sum = 0, item = 0; while (item 5) { item++; if (item == 2) continue; sum += item; } printf(“%d\n“,sum); },牛頓迭代法,方程f(x)=0,若滿足下列三個(gè)條件可使用牛頓迭代法: f(x)在區(qū)間[a,b]上的f '(x)及f ''(x) 都存在… f(a)f(b)0. 則可以使用牛頓迭代公式 f(xn-1) xn = xn-1 – f '(xn-1),,牛頓迭代法,#include main() { float x,x0,f,f1; x=2; do { x0=x; f=x0*x0*x0+4*x0*x0-10; f1=3*x0*x0+8*x0; x=x0-f/f1; } while (fabs(x-x0)=1e-6); printf(“the root is: %5.2f\n“,x); },作 業(yè),編寫(xiě)程序計(jì)算:,2. P121 4.22 3. P122 4.25,課后習(xí)題,4.22 “雞兔同籠”是一個(gè)中國(guó)古算題,最早出現(xiàn)在《孫子算經(jīng)》中?;\中有若干只雞和兔子,它們共有88個(gè)頭,244只腳,問(wèn)雞和兔各有多少只? 4.25求1-999之間的所有同構(gòu)數(shù)。一個(gè)數(shù)出現(xiàn)在它的平方數(shù)的右端,這個(gè)數(shù)稱為同構(gòu)數(shù)。如: 5出現(xiàn)在25右側(cè) 5是同構(gòu)數(shù) 25出現(xiàn)在625右側(cè) 25也是同構(gòu)數(shù),課后習(xí)題,補(bǔ)充下面程序,該程序的功能是求滿足以下條件的最大的n。 1+2+3+。。。+n≤1000 void main() { int n,s; /**/ /**/ while (s=1000) { n++; s=s+/**/ /**/; } printf(“n=%d\n“,n); getch(); },- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 語(yǔ)言 程序控制 結(jié)構(gòu)
鏈接地址:http://www.3dchina-expo.com/p-1855151.html