C語(yǔ)言循環(huán)結(jié)構(gòu)課件_第1頁(yè)
C語(yǔ)言循環(huán)結(jié)構(gòu)課件_第2頁(yè)
C語(yǔ)言循環(huán)結(jié)構(gòu)課件_第3頁(yè)
C語(yǔ)言循環(huán)結(jié)構(gòu)課件_第4頁(yè)
C語(yǔ)言循環(huán)結(jié)構(gòu)課件_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第五章循環(huán)結(jié)構(gòu)§5.1for語(yǔ)句§5.2while語(yǔ)句

§5.3do~while語(yǔ)句

§5.4用于循環(huán)中的break和continue語(yǔ)句

§5.5循環(huán)結(jié)構(gòu)的嵌套§5.6goto語(yǔ)句§5.712/17/20221循環(huán)語(yǔ)句概述問(wèn)題:求1~100的累計(jì)和。根據(jù)已有的知識(shí),可以用“1+2+……+100”來(lái)求解,但顯然很繁瑣?,F(xiàn)在換個(gè)思路來(lái)考慮:首先設(shè)置一個(gè)累計(jì)器sum,其初值為0,利用sum=sum+i來(lái)計(jì)算(i依次取1、2、……、100),只要解決以下3個(gè)問(wèn)題即可:

(1)將i的初值置為1;

(2)每執(zhí)行1次“sum=sum+i”后,i增1;

(3)當(dāng)n增到101時(shí),停止計(jì)算。此時(shí),sum的值就是1~100的累計(jì)和。

12/17/20222根據(jù)已有的知識(shí),單獨(dú)實(shí)現(xiàn)每一步都不難。但是,由于需要經(jīng)常使用這種重復(fù)計(jì)算結(jié)構(gòu)(稱為循環(huán)結(jié)構(gòu)),C語(yǔ)言提供了循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn),以簡(jiǎn)化、并規(guī)范循環(huán)結(jié)構(gòu)程序設(shè)計(jì)。在C語(yǔ)言中,可用以下語(yǔ)句實(shí)現(xiàn)循環(huán):(1)用for語(yǔ)句。(2)用do-while語(yǔ)句。(3)用while語(yǔ)句。12/17/20223功能:先計(jì)算<初始表達(dá)式>的值,然后判斷<條件表達(dá)式>的值,若該值為“假”,則退出循環(huán),執(zhí)行循環(huán)體下面的語(yǔ)句;若該值為“真”,則執(zhí)行<循環(huán)體語(yǔ)句>,然后計(jì)算<循環(huán)表達(dá)式>的值,再判斷<條件表達(dá)式>的值,重復(fù)以上的操作。for語(yǔ)句的流程圖如圖:一般情況下,<循環(huán)體語(yǔ)句>是由一對(duì)花括括起來(lái)的復(fù)合語(yǔ)句。12/17/20225【例5-1】求1+2+3+…+100的和。幾何級(jí)數(shù)求和問(wèn)題,其數(shù)學(xué)表達(dá)式為:12/17/20226/*exam5_1.c簡(jiǎn)單幾何級(jí)數(shù)的和*/#include<stdio.h>main(){ inti,sum; sum=0;

sum=sum+i; printf("sum=%d\n",sum);}程序運(yùn)行結(jié)果:sum=5050for(i=1;i<=100;i++)12/17/20227for循環(huán)語(yǔ)句注意:

①<初始表達(dá)式>可以省略,但須保留分號(hào)(;),同時(shí)在for之前必須給循環(huán)變量賦值,如:i=1;for(;i<=100;i++)sum=sum+i;②<條件表達(dá)式>一般不可省略,否則為無(wú)限循環(huán)。如:for(i=1;;i++)sum=sum+i;相當(dāng)于條件總為真,程序會(huì)一直不停的執(zhí)行直到“數(shù)據(jù)溢出”。12/17/20228⑥初始表達(dá)式、循環(huán)表達(dá)式可以是逗號(hào)表達(dá)式如:for(sum=0,i=1;i<=100;i++,i++)相當(dāng)于:sum=0;for(i=1;i<=100;i=i+2)⑦for循環(huán)也可以嵌套,執(zhí)行時(shí)是由外向里,逐層進(jìn)行,先執(zhí)行外層循環(huán),再進(jìn)入內(nèi)層循環(huán);退出時(shí)相反,由里向外逐層退出,先退出內(nèi)層循環(huán),然后退到上一層循環(huán)?!纠?-2】任意從鍵盤輸入兩個(gè)整數(shù)a、b(a<b),求它們之間的幾何級(jí)數(shù)的和,數(shù)學(xué)表達(dá)式為。12/17/202210/*exam5_2.c求幾何級(jí)數(shù)的和*/#include<stdio.h>main(){ inti,j,a,b,sum=0; printf("Pleaseinputtwonumber:\n"); scanf("a=%d,b=%d",&a,&b); i=a;j=b; if(a>b) {i=b;j=a;} for(;i<=j;i++) sum=sum+i; printf("sum=%d\n",sum);}12/17/202212/*exam5_3.c打印圖案*/#include<stdio.h>main(){ inti,j; for(i=1;i<=8;i++) { for(j=1;j<=7;j++) printf("*"); printf("\n"); }}12/17/202214§5.2while語(yǔ)句

While語(yǔ)句也是一種用于產(chǎn)生循環(huán)動(dòng)作的語(yǔ)句,一般形式為:while(<表達(dá)式>)<循環(huán)體語(yǔ)句>功能:先計(jì)算<表達(dá)式>的值,若該值為“假”,則跳出循環(huán),執(zhí)行循環(huán)體后面的語(yǔ)句;若該值為“真”,則執(zhí)行<循環(huán)體語(yǔ)句>,然后回過(guò)頭來(lái)再檢查<表達(dá)式>的值,重復(fù)以上的操作。while語(yǔ)句的流程圖12/17/202215<循環(huán)語(yǔ)句體>:是用一對(duì)花括號(hào)括起來(lái)的復(fù)合語(yǔ)句。注意:在<循環(huán)語(yǔ)句體>中要有使<表達(dá)式>的值為假(或<表達(dá)式>的值為零)的語(yǔ)句,否則會(huì)使程序出現(xiàn)無(wú)限循環(huán)而發(fā)生錯(cuò)誤。注意:由于while循環(huán)是先判斷<表達(dá)式>的值,后決定是否執(zhí)行<循環(huán)語(yǔ)句>,因此,有可能一次也不執(zhí)行<循環(huán)語(yǔ)句>。12/17/202216【例5-4】將例5-1用while語(yǔ)句重寫,求簡(jiǎn)單幾何級(jí)數(shù)的和。/*exam5_4.c用while求簡(jiǎn)單幾何級(jí)數(shù)的和*/#include<stdio.h>main(){ inti=1,sum=0; while(i<=100) { sum=sum+i;

i++; } printf("sum=%d\n",sum);}程序運(yùn)行結(jié)果:sum=505012/17/202217【例5-5】輸入一個(gè)正整數(shù)n,求n!。計(jì)算表達(dá)式:n!=n*(n-1)*(n-2)*…*2*1。用i代表循環(huán)變量,s代表n!的結(jié)果值。編程時(shí)既可以采用for循環(huán),也可以采用while循環(huán)求任意正整數(shù)n的階乘的算法流程圖如圖:12/17/202218while和for的比較for(i=1;i<=10;i++)

sum=sum+i;i=1;

循環(huán)變量賦初值while(i<=10){循環(huán)條件

sum=sum+i;

i++;循環(huán)變量的改變}循環(huán)體12/17/202220例5-6從鍵盤輸入一批學(xué)生的成績(jī),計(jì)算平均分。分析:求累加和確定循環(huán)條件不知道輸入數(shù)據(jù)的個(gè)數(shù),無(wú)法事先確定循環(huán)次數(shù)用一個(gè)特殊的數(shù)據(jù)作為正常輸入數(shù)據(jù)的結(jié)束標(biāo)志,比如選用一個(gè)負(fù)數(shù)作為結(jié)束標(biāo)志。12/17/202221§5.3do~while語(yǔ)句

do_while語(yǔ)句是另一種用于產(chǎn)生循環(huán)動(dòng)作的語(yǔ)句。一般形式為:do{<循環(huán)體語(yǔ)句>}while(<表達(dá)式>);功能:先執(zhí)行一次<循環(huán)體語(yǔ)句>,然后計(jì)算<表達(dá)式>的值,若該值為“真”,則重復(fù)以上的操作,直到該值為“假”,則退出循環(huán)語(yǔ)句,執(zhí)行下一條語(yǔ)句。do_while語(yǔ)句的流程圖:12/17/202223<循環(huán)語(yǔ)句體>應(yīng)該是用一對(duì)花括號(hào)括起來(lái)的復(fù)合語(yǔ)句。注意:要有可以使<表達(dá)式>的值為“假”(即<表達(dá)式>的值等于零)的語(yǔ)句,否則會(huì)使程序出現(xiàn)無(wú)限循環(huán)而發(fā)生錯(cuò)誤。do_while循環(huán)與while循環(huán)的區(qū)別,不論情況怎樣,do_while循環(huán)中的<循環(huán)語(yǔ)句體>至少會(huì)執(zhí)行一次。12/17/202224#include<stdio.h>Intmain(void){intnum; doublegrade,total; num=0;total=0;do { printf(“Entergrades:");scanf(“%lf”,&grade);total=total+grade; num++; }while(grade>=0);/*輸入負(fù)數(shù),循環(huán)結(jié)束*/printf(“Gradeaverageis%.2f\n",(total+1)/(num-1)); return0;}Entergrades:6788735482-1Gradeaverageis72.80Entergrades:-16788735482Gradeaverageis012/17/202226【例5-8】求sin(x)=x-x3/3!+x5/5!-x7/7!+…直到最后一項(xiàng)絕對(duì)值小于le-7(即10-7)為止。分析:多項(xiàng)式從第二項(xiàng)起,每一項(xiàng)都是前一項(xiàng)乘以一個(gè)因子,

(-x2)/(n*(n-1))(n=3,5,7,9……)用s代表sin(x)的值,t代表每一項(xiàng)的值,則:t=t*(-x2)/(n*(n-1));s=s+t;x的值是用弧度值表示的(10=/180弧度),如:3000.523598775算法流程圖如后圖:12/17/20222712/17/202228

while是先判別條件,再?zèng)Q定是否循環(huán);

do-while是先至少循環(huán)一次,然后再根據(jù)循環(huán)的結(jié)果決定是否繼續(xù)循環(huán)。while和do-while的比較真假表達(dá)式循環(huán)體語(yǔ)句do-while的下一條語(yǔ)句真假while的下一條語(yǔ)句表達(dá)式循環(huán)體語(yǔ)句12/17/202230循環(huán)語(yǔ)句的選擇if(循環(huán)次數(shù)已知) 使用for語(yǔ)句else /*循環(huán)次數(shù)未知*/ if(循環(huán)條件在進(jìn)入循環(huán)時(shí)明確) 使用while語(yǔ)句 else /*循環(huán)條件需要在循環(huán)體中明確*/ 使用do-while語(yǔ)句12/17/202231§5.4

用于循環(huán)中的break和continue語(yǔ)句

一、break語(yǔ)句break語(yǔ)句的作用是從一種控制結(jié)構(gòu)中跳出來(lái)。break語(yǔ)句可用于循環(huán)結(jié)構(gòu),其作用是從本層循環(huán)結(jié)構(gòu)中跳出,可以提前結(jié)束執(zhí)行<循環(huán)語(yǔ)句體>,執(zhí)行循環(huán)結(jié)構(gòu)外的下一條語(yǔ)句。break語(yǔ)句的一般形式為:break;

break語(yǔ)句在循環(huán)語(yǔ)句體中的位置應(yīng)根據(jù)程序的需要而定,一般是用在循環(huán)體內(nèi)某一個(gè)if條件分支的語(yǔ)句中,用來(lái)表示在循環(huán)過(guò)程中當(dāng)某一個(gè)條件成立時(shí)提前結(jié)束循環(huán)。12/17/202232程序解析-判斷素?cái)?shù)算法:除了1和m,不能被其它數(shù)整除。設(shè)i取值[2,m-1]如果m不能被該區(qū)間上的任何一個(gè)數(shù)整除,即對(duì)每個(gè)i,m%i都不為0,則m是素?cái)?shù)只要找到一個(gè)i,使m%i為0,則m肯定不是素?cái)?shù)m%2%3%4%5%(m-1)不是素?cái)?shù)||==0==0是素?cái)?shù)&&!=0!=0m不可能被大于m/2的數(shù)整除i取值[2,m-1]、[2,m/2]、[2,]for(i=2;i<=m/2;i++)if(m%i==0)break;if(i>m/2)printf("yes\n")elseprintf("no\n”);12/17/202233intmain(void){inti,m; printf(“Enteranumber:"); scanf("%d",&m); for(i=2;i<=m/2;i++) if(m%i==0)break; if(i>m/2)printf("%disaprimenumber!\n",m); elseprintf("No!\n"); }源程序-判斷素?cái)?shù)Enteranumber:9NoEnteranumber:1111isaprimenumber!循環(huán)條件?循環(huán)的結(jié)束條件?12/17/202234break語(yǔ)句while(exp){語(yǔ)句1if(expb)break;語(yǔ)句2}真假

exp

語(yǔ)句1假

expb

語(yǔ)句2循環(huán)體真for(i=2;i<=m/2;i++) if(m%i==0)break;if(i>m/2)printf("Yes");elseprintf("No!\n");當(dāng)循環(huán)有多個(gè)出口時(shí):表示循環(huán)條件區(qū)分結(jié)束條件for(i=2;i<=m/2;i++)if(m%i==0){printf("No!\n");break;}printf("Yes");12/17/202235二、Continue語(yǔ)句Continue語(yǔ)句只適用于循環(huán)結(jié)構(gòu),其一般形式為:作用:提前結(jié)束本次循環(huán),提前進(jìn)行下一次循環(huán)?!纠?-10】編寫程序,打印100-200中不能被3整除的數(shù)。/*exam5_10.c求不能被3整除的數(shù)*/#include<stdio.h>main(){ intn; for(n=100;n<=200;n++) { if(n%3==0) continue; printf("%d\t",n); }}12/17/202236算法流程圖如圖:要準(zhǔn)確地使用break語(yǔ)句和continue語(yǔ)句,除非有必要,否則若可以不用則盡量不采用break語(yǔ)句和continue語(yǔ)句。12/17/202237對(duì)于例5-10的問(wèn)題,打印100-200中不能被3整除的數(shù)。不采用continue語(yǔ)句的算法流程圖如圖所示:12/17/202238/*exam5q10.c例5-10問(wèn)題不用continue*/#include<stdio.h>

main(){ intn; for(n=100;n<=200;n++) if(n%3

!=0)/*n不能被3整除*/

printf("%d",n); }12/17/202239【例5-11】break語(yǔ)句和continue語(yǔ)句在程序中的區(qū)別/*exam5_11.cbreak的作用*/#include<stdio.h>main(){ intx; for(x=1;x<=10;++x) { if(x==5) break; printf("%d",x); }}運(yùn)行結(jié)果:1,2,3,4,/*exam5q11.ccontinue的作用*/#include<stdio.h>main(){intx; for(x=1;x<=10;++x) { if(x==5) continue; printf("%d,",x); }}運(yùn)行結(jié)果:1,2,3,4,6,7,8,9,10,12/17/202240§5.5循環(huán)結(jié)構(gòu)的嵌套

循環(huán)結(jié)構(gòu)的嵌套,指的是某一種循環(huán)結(jié)構(gòu)的語(yǔ)句中,包含有另一個(gè)循環(huán)結(jié)構(gòu)。使用嵌套的結(jié)構(gòu)時(shí),要注意嵌套的層次,不能交叉。例5.12求1!+2!+….+100!12/17/202241嵌套循環(huán)for(i=1;i<=100;i++){item=i!sum=sum+item;}for(i=1;i<=100;i++){

item=1; for(j=1;j<=i;j++) item=item*j;sum=sum+item;}12/17/202242例4-6源程序#include<stdio.h>intmain(void){ inti,j; doubleitem,sum;/*item存放階乘*/ sum=0;for(i=1;i<=100;i++){

item=1;/*每次求階乘都從1開始*/ for(j=1;j<=i;j++) /*內(nèi)層循環(huán)算出item=i!*/ item=item*j; sum=sum+item; } printf("1!+2!+3!+…+100!=%e\n",sum);}12/17/202243內(nèi)層循環(huán)的初始化for(i=1;i<=100;i++){

item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}求1!+2!+….+100!item=1;for(i=1;i<=100;i++){for(j=1;j<=i;j++)item=item*j;sum=sum+item;}求1!+1!*2!+……+1!*2!*……*100!?12/17/202244分析嵌套循環(huán)的執(zhí)行過(guò)程for(i=1;i<=100;i++){item=1;

for(j=1;j<=i;j++) item=item*j;sum=sum+item;}外層循環(huán)變量i的每個(gè)值內(nèi)層循環(huán)變量j變化一個(gè)輪次;內(nèi)外層循環(huán)變量不能相同分別用i

和j12/17/202245for(i=1;i<=100;i++)for(j=1;j<=i;j++) printf("%d%d\n",i,j);12/17/202246§5.6goto語(yǔ)句

goto語(yǔ)句是一種無(wú)條件轉(zhuǎn)向語(yǔ)句,它可以用在程序的任何地方,其一般形式為:goto語(yǔ)句標(biāo)號(hào);“語(yǔ)句標(biāo)號(hào)”為任何合法的標(biāo)識(shí)符,放在某個(gè)語(yǔ)句前面并加上冒號(hào)“:”作為語(yǔ)句的標(biāo)號(hào),標(biāo)號(hào)只對(duì)goto語(yǔ)句有意義,帶有標(biāo)號(hào)的語(yǔ)句被稱作標(biāo)號(hào)語(yǔ)句。如:error:、end:、exp:等均為合法的語(yǔ)句的標(biāo)號(hào)。goto語(yǔ)句的作用:轉(zhuǎn)到標(biāo)號(hào)語(yǔ)句所在的地方繼續(xù)執(zhí)行。12/17/202247【例5-13】用if語(yǔ)句和goto語(yǔ)句組合構(gòu)成的循環(huán)重寫計(jì)算器的程序。/*exam5_13.cif+goto構(gòu)成循環(huán)*/#include<stdio.h>main(){ inti,sum=0; i=1;

loop:if(i<=100) { sum=sum+i; i++;

gotoloop; } printf("sum=%d",sum);}程序運(yùn)行結(jié)果:sum=5050goto語(yǔ)句是一種非結(jié)構(gòu)化的語(yǔ)句,在程序設(shè)計(jì)中應(yīng)盡量少用或不用goto語(yǔ)句。

12/17/202248§5.7程序范例

【例5-16】打印出ASCⅡ碼序列中從33~127(十進(jìn)制)的字符對(duì)照表。/*exam5_16.c打印部分ASCII碼字符*/#include<stdio.h>main(){ inti; for(i=33;i<128;i++) { printf("%d---%c\t",i,i); }}12/17/202249【例5-17】設(shè)公雞每只5元,母雞每只3元,小雞每元3只,現(xiàn)用100元錢買100只雞,編寫一個(gè)程序,算出可以各買多少只雞?#include<stdio.h>main(){inti,j,k;for(i=0;i*5<=100;i++)for(j=0;j*3<=100;j++)for(k=0;k/3<=100;k+=3) if((i*5+j*3+k/3)==100&&(i+j+k)==100)printf("Cock-%d\tHen-%d\tChicken-%d\n",i,j,k);}12/17/202250程序運(yùn)行結(jié)果:Cock--0Hen--25Chicken--75Cock--4Hen--18Chicken--78Cock--8Hen--11Chicken--81Cock--12Hen--4Chicken--8412/17/202251小結(jié):三種循環(huán)結(jié)構(gòu):for、while和do_while循環(huán)。當(dāng)循環(huán)次數(shù)是肯定的情況下,用for循環(huán)比較方便。while循環(huán)和for循環(huán)都要先判斷條件再執(zhí)行循環(huán)語(yǔ)句體,因此,有可能一次也不執(zhí)行循環(huán)語(yǔ)句體。do_while循環(huán)不論怎樣都會(huì)先執(zhí)行一次循環(huán)語(yǔ)句體。注意避免以下幾個(gè)方面的問(wèn)題:1.循環(huán)語(yǔ)句體為復(fù)合語(yǔ)句,但沒(méi)有使用花括號(hào)。2.使程序發(fā)生無(wú)限循環(huán)。3.混淆break語(yǔ)句與continue語(yǔ)句的功能。12/17/202252循環(huán)程序設(shè)計(jì)循環(huán)程序的實(shí)現(xiàn)要點(diǎn):歸納出哪些操作需要反復(fù)執(zhí)行?

循環(huán)體這些操作在什么情況下重復(fù)執(zhí)行?

循環(huán)條件選用合適的循環(huán)語(yǔ)句forwhiledo-while循環(huán)具體實(shí)現(xiàn)時(shí)考慮(循環(huán)條件):事先給定循環(huán)次數(shù),首選for通過(guò)其他條件控制循環(huán),考慮while或do-while12/17/202253#include<stdio.h>intmain(void){inti,mark,max,n;printf("Entern:");scanf("%d",&n);printf("Enter%dmarks:",n);scanf("%d",&mark); /*讀入第一個(gè)成績(jī)*/max=mark;/*假設(shè)第一個(gè)成績(jī)是最高分*/

for(i

溫馨提示

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

評(píng)論

0/150

提交評(píng)論