第六章循環(huán)控制_第1頁
第六章循環(huán)控制_第2頁
第六章循環(huán)控制_第3頁
第六章循環(huán)控制_第4頁
第六章循環(huán)控制_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章循環(huán)控制第1頁,共31頁,2023年,2月20日,星期三6.1

概述程序經(jīng)常會重復(fù)執(zhí)行某些相同的操作,如:求:s=1+2+3+4+…+100算法描述:①s=0;i=1;②s+=i;i++;③判斷i是否小于等于100

如果i小于等于100,重復(fù)②;

否則,結(jié)束。此類根據(jù)某個條件重復(fù)執(zhí)行相同算法的結(jié)構(gòu),稱為循環(huán)。初始化部分。循環(huán)體。

循環(huán)的條件:循環(huán)應(yīng)在有限次完成。

C語言提供了三類實現(xiàn)循環(huán)的語句:

while,dowhile,for

第2頁,共31頁,2023年,2月20日,星期三6.2goto語句goto語句格式:

gotoLabel/*Label:同一函數(shù)內(nèi)語句前的標(biāo)號。*/作用:轉(zhuǎn)移到標(biāo)號對應(yīng)的語句上繼續(xù)執(zhí)行。無條件轉(zhuǎn)向語句.loop:if(i<=100){sum=sum+i;i++;

gotoloop;}語句標(biāo)號的命名規(guī)則:與變量名相同,即由字母、數(shù)字和下劃線組成,其第一個字符必須為字母或下劃線。不能用整數(shù)來作標(biāo)號。例如:

gotolabeL1;

gotol23;

這樣寫對嗎?第3頁,共31頁,2023年,2月20日,星期三6.2goto語句注意:結(jié)構(gòu)化程序設(shè)計方法主張限制使用goto語句,因為濫用goto語句將使程序流程無規(guī)律、可讀性差。但也不是絕對禁止使用goto語句。一般來說,可以有兩種用途:與if語句一起構(gòu)成循環(huán)結(jié)構(gòu);

if(……)gotokk;從循環(huán)體中跳轉(zhuǎn)到循環(huán)體外,但在C語言中可以用break語句和continue語句跳出本層循環(huán)和結(jié)束本次循環(huán)。goto語句的使用機(jī)會已大大減少,只是需要從多層循環(huán)的內(nèi)層循環(huán)跳到外層循環(huán)外時才用到goto語句。但是這種用法不符合結(jié)構(gòu)化原則,一般不宜采用,只有在不得已時才使用。第4頁,共31頁,2023年,2月20日,星期三6.2goto語句舉例:

用if和goto語句構(gòu)成循環(huán),求1+2+3+…+100main()/*test1.c*/{inti,sum=0;i=1;ll:if(i<=100) {sum=sum+i; i++; gotoll; } printf("sum=%d",sum);}

第5頁,共31頁,2023年,2月20日,星期三6.3while語句⒈while循環(huán)(當(dāng)型循環(huán))格式:

while(expression)

statement;表達(dá)式:值非0,表示滿足條件;值為0代表不滿足條件。語句(復(fù)合語句),重復(fù)執(zhí)行部分(循環(huán)體)。流程:e?yesstatement;no第6頁,共31頁,2023年,2月20日,星期三舉例:求1+2+3+…+100#include<stdio.h>/*test2.c*/voidmain(void){ints=0,i=1;

while(i<=100)

{

s=s+i;/*s+=i;*/i++;}

printf(“s=%d\n”,s);}初始化部分循環(huán)體條件測試6.3while語句i=1i<=100Sum=sum+ii=i+10非0注意:

1、循環(huán)體如果包含一個以上的語句,應(yīng)該用花括弧括起來,以復(fù)合語句形式出現(xiàn)。如果不加花括弧,則while語句的范圍只到while后面第一個分號處。2、在循環(huán)體中應(yīng)有使循環(huán)趨向結(jié)束的語句.第7頁,共31頁,2023年,2月20日,星期三6.4do-while語句格式:

do{

statement;}

while

(expression);

流程:statement;e?yesno含有使條件趨假的語句。while循環(huán)與do-while循環(huán)的區(qū)別:while循環(huán)先判條件,后執(zhí)行循環(huán)體;do–while循環(huán)先執(zhí)行循環(huán)體,后判條件。第8頁,共31頁,2023年,2月20日,星期三6.4do-while語句舉例:求:30!#include<stdio.h>voidmain(void){floats=1.0;inti=1;

do{s*=i;i++;}while(i<=30);

printf(“30!=%f”,s);}初始化。循環(huán)體。測試條件。?思考題:1.用do-while實現(xiàn)s=1+2+…+1002.用while實現(xiàn)30!。使條件趨假。第9頁,共31頁,2023年,2月20日,星期三6.4do-while語句舉例:while和do一while循環(huán)的比較1)main()/*test3.c*/2)main()/*test4.c*/

{intsum=0,i;{intsum=0,i;

scanf(”%d”,&i);scanf(”%d”,&i);

while(i<=10)

do{sum=sum十i;{sum=sum十i;i++;i++;}}while(i<=10);printf(“%d”,sum);}printf(“%d”,sum);}Sum=0別忘了第10頁,共31頁,2023年,2月20日,星期三6.5for語句⒊for循環(huán)格式:

for

(e1;e2;e3)

statement;流程:e1e2?yesstatement;e3no使e2趨假。初值表達(dá)式。測試表達(dá)式。增值表達(dá)式。(1)先求解表達(dá)式1;(2)求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步,若為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。(3)若表達(dá)式為真,在執(zhí)行指定的語句后,求解表達(dá)式3。(4)轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。(5)執(zhí)行FOR語句下面的一個語句。

for語句的形式如下:

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句

第11頁,共31頁,2023年,2月20日,星期三6.5for語句for

(e1;e2;e3)在for循環(huán)中,e1、e2、e3都可以省略!1.for語句中表達(dá)式1可以省略,其后的分號不能省略。執(zhí)行時,跳過“求解表達(dá)式1”這一步,其它不變。

2.如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2始終為真。

for(i=l;;i++)sum=sum+I它相當(dāng)于:

i=1;while(1){sum=sum+i;i++;}求解表達(dá)式1語句求解表達(dá)式33.表達(dá)式3也可以省略,但此時程序設(shè)計者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。如:

for(sum=0,i=1;i<=100;){sum=sum十1;i++;}4.可以省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,即只給循環(huán)條件。第12頁,共31頁,2023年,2月20日,星期三6.5for語句如:(省略表達(dá)式1和表達(dá)式3)for(;i<=100;){sum=sum+i;i++;}相當(dāng)于:while(i<=100){sum=sum+i;i++;}5.三個表達(dá)式都可省略,如:

for(;;)語句相當(dāng)于:

while(1)語句即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真),循環(huán)變量不增值.。無終止地執(zhí)行循環(huán)體。第13頁,共31頁,2023年,2月20日,星期三6.5for語句6.表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其它表達(dá)式。如:

for(sum=0;i<=100;i++)sum=sum+i;表達(dá)式3也類似,如:

for(sum=0;i<=100;k++)表達(dá)式1和表達(dá)式3可以是一個簡單的表這式,也可以是包含一個以上的簡單表達(dá)式,中間用逗號間隔。如:

for(sum=0,i=1;i<=100;i++)sum=sum+i;或

for(i=0,j=100;i<=j;i++,j--)k=i+j;

7.表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零就執(zhí)行循環(huán)體。

如:

for(;(c=getchar())!=‘\n’;)printf(“%c”,c);

第14頁,共31頁,2023年,2月20日,星期三6.5for語句舉例:求:s=1+2+3+…+100#include<stdio.h>voidmain(void){ints,i;

for(s=0,i=1;i<=100;i++)

{s=s+i;

}

printf(“s=%d”,s);}在for循環(huán)中,e1、e2、e3都可以省略!e1省略s=0,i=1;e3省略i++;第15頁,共31頁,2023年,2月20日,星期三概念:在一個循環(huán)的循環(huán)體內(nèi)又包含一個完整的循環(huán)稱為循環(huán)的嵌套。打印99乘法表。#include<stdio.h>/*test5.c*/voidmain(void){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++){printf(“%4d“,i*j);}printf(“\n“);}}外層循環(huán)內(nèi)層循環(huán)說明:⒈內(nèi)外層循環(huán)采用縮進(jìn)形式。⒉while和do-while和for可以相互嵌套。

⒊執(zhí)行次數(shù)為內(nèi)層次數(shù)和外存次數(shù)的乘積。如何打印乘法表的一半?6.6循環(huán)的嵌套第16頁,共31頁,2023年,2月20日,星期三①循環(huán)的中斷:break語句概念:循環(huán)體中可以加分支,判斷是否繼續(xù)執(zhí)行循環(huán),break語句可以提前結(jié)束循環(huán)。舉例:求:s=1+2+3+…+100voidmain(void)/*test13.c*/{ints,i;

for(s=0,i=1;;i++)

{s=s+i;if(i>??)break;}

printf(“s=%d”,s);}滿足條件,則退出循環(huán)。6.7循環(huán)的中斷(break)和繼續(xù)(continue)voidmain(void)/*test14.c*/{ints=0,i=1;

for(;;

)

{s=s+i;i++;if(i>??)break;}

printf(“s=%d”,s);}用goto語句如何實現(xiàn)?第17頁,共31頁,2023年,2月20日,星期三舉例:求:r=1—10的圓的面積,如圓面積大于100則中斷。for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;printf(“\n%f“,area);}

滿足條件,則退出循環(huán)。②繼續(xù)循環(huán):continue語句

continue語句的作用是跳過本次循環(huán)剩余的循環(huán)體內(nèi)容,執(zhí)行下次循環(huán)。舉例:求1—100內(nèi)的偶數(shù)和。

s=0;for(n=1;n<=100;n++){if(n%2!=0)continue;s+=n;}滿足條件,跳過循環(huán)體,繼續(xù)循環(huán)。6.7循環(huán)的中斷(break)和繼續(xù)(continue)如果不使用continue語句,如何來實現(xiàn)?第18頁,共31頁,2023年,2月20日,星期三①條件為恒真的循環(huán)——無限循環(huán)while(1){…}do{…}while(1);for(;;){…}靠條件控制的break語句退出循環(huán)。例:程序等待直到輸入字母A。for(;;){ch=getchar();if(ch==’A’)break;}②循環(huán)體為空語句的循環(huán)——空循環(huán)for(i=1;i<=MAX;t++);作用:程序延時。空語句6.7循環(huán)的中斷(break)和繼續(xù)(continue)⑶無限循環(huán)和空循環(huán)第19頁,共31頁,2023年,2月20日,星期三輸入10個自然數(shù)統(tǒng)計其中偶數(shù)的個數(shù)及偶數(shù)值和。算法框圖:start定義變量初始化循環(huán)?yes輸入偶數(shù)?yes統(tǒng)計累加nono輸出結(jié)果end#include<stdio.h>voidmain(void){inti,ix,iCount=0,iSum=0;

for(i=1;i<=10;i++){

scanf(“%d\n”,&ix);

if(ix%2==0){iSum+=ix;iCount++;}

}printf(“Num=%d\nSum=%d”,iCount,iSum);}循環(huán)結(jié)構(gòu)分支結(jié)構(gòu)輸入負(fù)數(shù)?do{if(ix<=0)printf(“dateerror”);}while(ix<=0);算法的健壯性6.8循環(huán)和分支相互嵌套第20頁,共31頁,2023年,2月20日,星期三⒈求100到200之間的所有素數(shù)(只能被1和自身整除的數(shù))。對于自然數(shù)n,判斷其是否為素數(shù)有以下三種方法:①判斷n是否能被從2到n-1范圍內(nèi)的數(shù)整除;②判斷n是否能被從2到(int)(n/2)范圍的數(shù)整除;③判斷n是否能被從2到(int)sqrt(n)范圍的數(shù)整除;在程序設(shè)計中,經(jīng)常要記錄一些狀態(tài),作為判斷的條件。因此需要在程序中設(shè)置一些標(biāo)志,通常標(biāo)志是整型變量。程序設(shè)計中標(biāo)志技術(shù)的使用:如:設(shè)置變量iFlag用于記錄是否世素數(shù),

iFlag==1是素數(shù);

iFlag==0不是素數(shù)。比較一下各種方法的優(yōu)越性?6.9程序舉例第21頁,共31頁,2023年,2月20日,星期三s=sqrt(n);iFlag=1;i從2循環(huán)到sn%i==0iFlag=0;break;繼續(xù)循環(huán)直到退出iFlag==0?判斷某自然數(shù)n是否是素數(shù)的算法第22頁,共31頁,2023年,2月20日,星期三#include<stdio.h>/*test7.c*/#include<math.h>voidmain(void){intn,j,s,iFlag;

for(n=101;n<200;n+=2)

{

s=sqrt(n);iFlag=1;for(j=2;j<=s;j++){if(n%j==0){iFlag=0;break;}}if(iFlag)printf(“\n%d”,n);

}}0不是素數(shù);1是素數(shù)。枚舉所有數(shù)構(gòu)造,測試條件假定n是素數(shù)。如果n能被2到s的任意數(shù)整除,設(shè)標(biāo)志退出循環(huán)。如果n是素數(shù),輸出n。程序如下:第23頁,共31頁,2023年,2月20日,星期三n為枚舉變量,枚舉初值100,枚舉終值999。測試是否滿足條件,滿足條件輸出n。#include<stdio.h>voidmain(void){intn,a,b,c;

for(n=100;n<=999;n++){

a=n/100;b=n%100/10;c=n%10;

if(a*a*a+b*b*b+c*c*c==n) printf(“\n%d”,n);

}}枚舉所有三位數(shù)構(gòu)造條件測試條件取n的百位a、十位b、個位c。

⒉求水仙花數(shù)(條件:三位數(shù)的個、十、百位的立方和等于該數(shù)。153==13+53+33)。第24頁,共31頁,2023年,2月20日,星期三36人一次搬36塊磚,男搬4,女搬2,兩個小孩抬一塊。要一次搬完。問:男、女、小孩要多少?(要求輸出所有的方案)思考題:第25頁,共31頁,2023年,2月20日,星期三3.求ex=1+x+x2/2!+…+xn/n!前n+1項之和。迭代次數(shù)i:012…n迭代公式t=t*x/i迭代初值exp=1,t=1,(i=1~n)#include<stdio.h>voidmain(void){floatexp,x,t;inti,n;

scanf(“%f,%d”,&x,&n);t=1.0;

exp=1.0;

for(i=1;i<=n;i++){

t*=x/i;

exp+=t;

}

printf(“\n%f”,exp);}迭代初值。迭代公式。迭代過程附加條件:當(dāng)|t|<10-5,結(jié)束運(yùn)算。if(fabs(t)<1e-5)break;第26頁,共31頁,2023年,2月20日,星期三(0,0)yxf(x)ab面積hx迭代求積分的方法①將[a,b]分為n等份,h=(b-a)/n;②求n個梯形面積之和,第i小面積x=x+hf1=f(x)下底s=s+(f0+f1)*h/2f0=f1迭代x初值為as初值為0f0初值為f(a)

次數(shù)為n4.用梯形法求定積分第27頁,共31頁,2023年,2月20日,星期三#include<stdio.h>/*test10.c*/voidmain(void){floata,b,f0,f1,h,x,s=0.0;intn,i;scanf(“%f,%f,%d”,&a,&b,&n);h=(b-a)/n;

x=a;f0=x*x+12.0*x+4.0;

for(i=0;i<n;i++){

x=x+h;f1=x*x+12.0*x+4.0;s=s+(f0+f1)*h/2.0;f0=f1;

}

printf(“%f”,s);}迭代初值。迭代循環(huán)程序如下:第28頁,共31頁,2023年,2月20日,星期三迭代次數(shù):i=1~n迭代初值:s=0.0,t=a迭代公式:t=t*10+a#include<stdio.h>voidmain(void){floats,t;inti,a,n;

do{scanf(“%d,%d”,&a,&n);

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論