大連理工大學(xué)軟件學(xué)院C語(yǔ)言課程PPT Ch8_第1頁(yè)
大連理工大學(xué)軟件學(xué)院C語(yǔ)言課程PPT Ch8_第2頁(yè)
大連理工大學(xué)軟件學(xué)院C語(yǔ)言課程PPT Ch8_第3頁(yè)
大連理工大學(xué)軟件學(xué)院C語(yǔ)言課程PPT Ch8_第4頁(yè)
大連理工大學(xué)軟件學(xué)院C語(yǔ)言課程PPT Ch8_第5頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章循環(huán)結(jié)構(gòu)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/312本章要點(diǎn)循環(huán)語(yǔ)句while語(yǔ)句/do…while語(yǔ)句/for語(yǔ)句循環(huán)條件計(jì)數(shù)器控制循環(huán)/標(biāo)記控制循環(huán)循環(huán)嵌套循環(huán)中的跳轉(zhuǎn)

break語(yǔ)句/continue語(yǔ)句/goto語(yǔ)句C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/313結(jié)構(gòu)化程序只由三種基本結(jié)構(gòu)組成控制結(jié)構(gòu)--用于控制程序的執(zhí)行流程順序(sequence)

選擇(selection)

重復(fù)(repetion)

if結(jié)構(gòu)(單項(xiàng)選擇)

if/else結(jié)構(gòu)(雙項(xiàng)選擇)

switch結(jié)構(gòu)(多項(xiàng)選擇)while結(jié)構(gòu)

do/while結(jié)構(gòu)

for結(jié)構(gòu)

控制結(jié)構(gòu)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3148.1理解循環(huán)結(jié)構(gòu)循環(huán)概念為解決某一問(wèn)題,或求取某一計(jì)算結(jié)果,特定的條件下,程序中反復(fù)按某一模式進(jìn)行操作。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3158.1理解循環(huán)結(jié)構(gòu)

求2n的問(wèn)題s1×224循環(huán)概念為解決某一問(wèn)題,或求取某一計(jì)算結(jié)果,特定的條件下,程序中反復(fù)按某一模式進(jìn)行操作。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/316循環(huán)概念8.1理解循環(huán)結(jié)構(gòu)

求2n的問(wèn)題k=1,s=1k≤n?s=s*2k=k+1計(jì)數(shù)器為解決某一問(wèn)題,或求取某一計(jì)算結(jié)果,特定的條件下,程序中反復(fù)按某一模式進(jìn)行操作。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/317循環(huán)概念為解決某一問(wèn)題,或求取某一計(jì)算結(jié)果,特定的條件下,程序中反復(fù)按某一模式進(jìn)行操作。

設(shè)計(jì)循環(huán)結(jié)構(gòu)要點(diǎn)需要重復(fù)哪些的步驟,即循環(huán)體中的操作;需要合理設(shè)計(jì)循環(huán)條件,使循環(huán)不無(wú)限次執(zhí)行;修改循環(huán)條件,使循環(huán)條件的值趨近0。8.1理解循環(huán)結(jié)構(gòu)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/318

循環(huán)體的算法?

循環(huán)的條件、循環(huán)結(jié)束條件?

如何修改循環(huán)條件?8.1理解循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)兩種基本類(lèi)型當(dāng)型循環(huán) 直到型循環(huán)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3198.2循環(huán)語(yǔ)句while(表達(dá)式)

{語(yǔ)句;}do{

語(yǔ)句;}while(表達(dá)式);for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

{ 語(yǔ)句;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3110

語(yǔ)句形式

while(表達(dá)式

){

循環(huán)體;

}邏輯表達(dá)式?jīng)Q定是否執(zhí)行循環(huán)體表達(dá)式值為邏輯true則執(zhí)行循環(huán)體重復(fù)執(zhí)行的操作直至表達(dá)式的值為false8.2.1while語(yǔ)句注意事項(xiàng)重要!!!在條件判斷時(shí),C語(yǔ)言用0表示邏輯假,用非0(不只是1,連負(fù)數(shù)也表示真)表示邏輯真.

關(guān)系表達(dá)式的值只有0和1

>,

<,==While(-2)if(-1.1)

{ z=3.9447586;//大于5才進(jìn)進(jìn)位

printf("float←double,z=%f\n",z);}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3111C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31128.2.1while語(yǔ)句算法步驟在循環(huán)結(jié)構(gòu)外設(shè)置條件變量測(cè)試循環(huán)條件,若其值為假則執(zhí)行步驟(6);執(zhí)行循環(huán)體中的語(yǔ)句;更新條件變量的值;重復(fù)(2)~(4)步驟結(jié)束循環(huán)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程13例8.1用while語(yǔ)句實(shí)現(xiàn)求1~100的和

循環(huán)條件?循環(huán)結(jié)束條件?修改循環(huán)條件?inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf("sum=%d\n",sum);C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程14例8.1用while語(yǔ)句實(shí)現(xiàn)求1~100的和

循環(huán)條件?循環(huán)結(jié)束條件?修改循環(huán)條件?inti=1,sum=0;while(i<=100){sum=sum+i;i++;}printf("sum=%d\n",sum);

可以寫(xiě)成:

sum+=i;i++;

或:

sum+=i++;

如果寫(xiě)成

?

sum+=++i;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3115

語(yǔ)句形式與執(zhí)行流程8.2.2do語(yǔ)句do{

循環(huán)體

}while(表達(dá)式);

do…while為直到型循環(huán)至少執(zhí)行一次循環(huán)體內(nèi)的語(yǔ)句!

C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程16例8.2用do…while語(yǔ)句實(shí)現(xiàn)求1~100的和

intsum=0,i=1;do{/*循環(huán)體*/ sum+=i; i++;}while(i<=100);printf("sum=%d\n",sum);C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3117

語(yǔ)句形式8.2.3for語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3){循環(huán)體;}關(guān)鍵字初始表達(dá)式循環(huán)后置表達(dá)式循環(huán)控制邏輯表達(dá)式for(循環(huán)變量賦值;循環(huán)條件;修改循環(huán)變量)循環(huán)體語(yǔ)句C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3118

執(zhí)行流程8.2.3for語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3){循環(huán)體;}

求解表達(dá)式1;求解表達(dá)式2;若其值為邏輯真,則執(zhí)行循環(huán)體中的語(yǔ)句;若其值為假則結(jié)束循環(huán),轉(zhuǎn)到第(6)步;求解表達(dá)式3;重復(fù)執(zhí)行步驟(2)和(3)中的操作;循環(huán)結(jié)束,執(zhí)行for語(yǔ)句后的語(yǔ)句。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程19例8.2用do…while語(yǔ)句實(shí)現(xiàn)求1~100的和

intsum=0,i;for(i=0;i<100;i++) sum+=i;intsum=1,i;for(i=2;i<100;i++) sum+=i;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3120

不同形式的for語(yǔ)句結(jié)構(gòu)(1)

int

i=1;

//缺省表達(dá)式1

for(;i<=n;i++){sum=sum+i;}(2)

for(i=1;;i++){sum=sum+i;

if(i>n)break;}//缺省表達(dá)式2等價(jià)于for(i=1;1;i++)(3)

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

i++;

}//缺省表達(dá)式3(4)

for(i=1;i<=n;

sum+=i++);

//缺省循環(huán)體for語(yǔ)句分號(hào)不能省8.2.3for語(yǔ)句C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3121i=1;

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

;}

//缺省表達(dá)式1、3(7)

i=1;for(sum=0;i<=n;i++){sum=sum+i;}

//表達(dá)式1、2、3可以為任何表達(dá)式for語(yǔ)句分號(hào)不能省for(i=1;

sum+=i++,i<=n;);

//缺省表達(dá)式3和循環(huán)體注意逗號(hào)表達(dá)式(6)i=1;for(;;

){sum+=i++;if(i>n)break;}

//缺省全部for的表達(dá)式

不同形式的for語(yǔ)句結(jié)構(gòu)8.2.3for語(yǔ)句(9)for(i=1;i<=100;sum+=i++);C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3122for語(yǔ)句8.2.4幾種循環(huán)語(yǔ)句的比較四種循環(huán)一般可以互相代替,區(qū)別如下:(1)用while和do-while循環(huán)時(shí),循環(huán)變量初始化在while和do-while語(yǔ)句之前,for語(yǔ)句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。(2)while和do-while循環(huán),循環(huán)體中應(yīng)包括使循環(huán)趨于結(jié)束的語(yǔ)句。for語(yǔ)句可以在表達(dá)式3中實(shí)現(xiàn)。(3)for語(yǔ)句和while語(yǔ)句一般用來(lái)實(shí)現(xiàn)當(dāng)型循環(huán),循環(huán)體可能一次也不執(zhí)行;do-while語(yǔ)句構(gòu)成的直到型循環(huán),循環(huán)體至少執(zhí)行一次.C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程23例8.3求2的n次冪,分別用三種語(yǔ)句實(shí)現(xiàn)。

intpower=1,n=3,i=1;while(i<=n){power*=2; i++;};power=1,i=1;do{power*=2;i++;}while(i<=n);for(i=0,power=1;i<n;i++)power*=2;C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31248.3循環(huán)條件為合理使用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)算法,必須正確設(shè)計(jì)循環(huán)條件。一般循環(huán)條件表達(dá)式的值由某個(gè)變量控制,根據(jù)控制變量的性質(zhì),循環(huán)分為兩類(lèi):計(jì)數(shù)器控制循環(huán);標(biāo)記控制循環(huán)。應(yīng)避免死循環(huán)發(fā)生!C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31258.3.1計(jì)數(shù)器控制循環(huán)若能知道循環(huán)將執(zhí)行的確切次數(shù),就使用計(jì)數(shù)器控制循環(huán)。計(jì)數(shù)器變量(counter)用于統(tǒng)計(jì)循環(huán)執(zhí)行的次數(shù),在循環(huán)執(zhí)行前將其賦予特定的值,并在循環(huán)體執(zhí)行的過(guò)程中不斷對(duì)其進(jìn)行修改,使其能改變循環(huán)條件的值,直到某次重復(fù)循環(huán)體操作后循環(huán)條件為邏輯假,結(jié)束循環(huán)。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程26例8.4求m的n次冪intpower=1,base,exp,/*底數(shù)與指數(shù)*/counter;/*計(jì)數(shù)器*/

printf("輸入底數(shù)與指數(shù)(>0):");scanf("%d%d",&base,&exp);for(counter=0;counter<exp;counter++){ power*=base;}printf("%d的%d次冪為%d\n",base,exp,power);注意控制循環(huán)次數(shù),循環(huán)計(jì)數(shù)器變量的初值決定循環(huán)表達(dá)式的構(gòu)造方法。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程27例8.4求m的n次冪intpower=1,base,exp,counter=0;for(;counter<exp;counter++) power*=base;counter=1,power=base;while(counter<exp){ power*=base; ++counter;}注意控制循環(huán)次數(shù),循環(huán)計(jì)數(shù)器變量的初值決定循環(huán)表達(dá)式的構(gòu)造方法。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31288.3.2標(biāo)記控制循環(huán)對(duì)于這種執(zhí)行次數(shù)不確定的循環(huán),采用標(biāo)志控制循環(huán)的方法。常根據(jù)用戶(hù)的輸入決定循環(huán)知否繼續(xù)。設(shè)置并檢測(cè)標(biāo)志變量,若其值滿(mǎn)足某個(gè)條件,則重復(fù)循環(huán)體操作,否則循環(huán)結(jié)束。在標(biāo)記循環(huán)中使用事先指定的特殊值作為標(biāo)記。

該特殊值不能與一般數(shù)據(jù)相混淆!for(i=0;(c=getchar())!=’\n’;i++);C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程29例8.5求若干人的平均收入while(salary!=0){scanf("%lf",&salary);sum+=salary;++counter;} do{scanf("%lf",&salary);sum+=salary;++counter;}while(salary<0);邏輯問(wèn)題?C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程30例8.5求若干人的平均收入doublesalary=0,sum=0;intcounter=0;/*循環(huán)次數(shù)*/printf("Pleaseentersalary(-1toend):");scanf("%lf",&salary);while(salary!=-1){sum+=salary;++counter;printf("Pleaseentersalary(-1toend):");scanf("%lf",&salary);} printf("Average=%5.2f\n",sum/counter);工資要是負(fù)數(shù)怎么辦?C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31318.4循環(huán)嵌套

循環(huán)嵌套:

一個(gè)循環(huán)體中又包含另一個(gè)完整的循環(huán)結(jié)構(gòu)。

多層循環(huán):內(nèi)嵌的循環(huán)中還可以嵌套循環(huán)。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31328.4循環(huán)嵌套各種循環(huán)語(yǔ)句都可以互相嵌套

while、do-while和for三種循環(huán)語(yǔ)句可分別構(gòu)成嵌套結(jié)構(gòu)(1)

while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}while();{…}}}while();}

C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31338.4循環(huán)嵌套各種循環(huán)語(yǔ)句都可以互相嵌套三種循環(huán)語(yǔ)句也可以相互嵌套,即在while循環(huán)、do-while循環(huán)和for循環(huán)體內(nèi),包含上述任一循環(huán)結(jié)構(gòu)。(4)

while()(5)for(;;) (6)do{…{…{…do{…}while()for(;;)while(){} {…} } } }while();

C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3134內(nèi)外循環(huán)執(zhí)行順序//測(cè)試循環(huán)執(zhí)行次數(shù)

printf("i\tj\n------\n");for(i=1;i<=3;i++)//外循環(huán)

{for(j=1;j<=3;j++)//內(nèi)循環(huán)

printf(“%d\t%d\n”,i,j);printf(“--------\n”);}i j------1 11 23------2 12 23------3 13 23------8.4循環(huán)嵌套2C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3135設(shè)計(jì)嵌套的循環(huán)體要點(diǎn)合理設(shè)計(jì)和安排各個(gè)循環(huán)的嵌套關(guān)系,在保證邏輯正確性;嵌套的循環(huán)最好采用右縮進(jìn)格式書(shū)寫(xiě);內(nèi)層和外層循環(huán)控制變量不應(yīng)同名;循環(huán)嵌套不能交叉,即在一個(gè)循環(huán)體內(nèi)必須完整的包含著另一個(gè)循環(huán)8.4循環(huán)嵌套C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程36例8.6計(jì)算宿舍樓居住的總?cè)藬?shù)。假設(shè)該宿舍樓共3層,每層6個(gè)房間,輸入每個(gè)房間中居住的人數(shù),輸出整個(gè)樓居住的總?cè)藬?shù)。算法用雙層循環(huán)嵌套實(shí)現(xiàn):內(nèi)層循環(huán)計(jì)算?外層循環(huán)計(jì)算?

C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程37例8.6計(jì)算宿舍樓居住的總?cè)藬?shù)。total=0;for(i=1;i<=N;i++)/*外層循環(huán)*/{printf("第%d層:\n",i); sum=0;for(j=1;j<=M;j++)/*內(nèi)循環(huán)*/{ printf("輸入%d號(hào)房間人數(shù):",j); scanf("%d",&number); sum+=number; }printf("本層共%d人\n",sum);total+=sum;}printf("本樓共%d人\n",total);思考:每層樓房間的數(shù)目不確定?每個(gè)宿舍樓的層數(shù)不確定?舍區(qū)中包含n棟宿舍樓?C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程38*******************************************************例輸出簡(jiǎn)單字符圖形的雙重循環(huán)分析:該圖形一共10行,每一行增加一個(gè)字符,應(yīng)循環(huán)10次,每次輸出一行,循環(huán)為:行iM個(gè)數(shù)

111222……101010for(i=1~10){

第i行:

i個(gè)星號(hào),for(j=1~i)輸出*輸出換行}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程39例顯示輸出如下所示的三角形

分析:行號(hào)空格數(shù)*數(shù)

* 051*** 143***** 235******* 327********* 419*********** 5011i5-i2*i+1C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3140結(jié)構(gòu)化程序由順序、選擇和循環(huán)結(jié)構(gòu)組成;三種基本可以按堆棧和嵌套的形式構(gòu)成任何算法;堆棧形式是基本結(jié)構(gòu)的簡(jiǎn)單羅列;嵌套結(jié)構(gòu)是在某個(gè)結(jié)構(gòu)中包含一個(gè)完整的結(jié)構(gòu).8.4循環(huán)嵌套C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3141跳轉(zhuǎn)語(yǔ)句可用于控制程序的轉(zhuǎn)移,在選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)中協(xié)助改變程序執(zhí)行的流程。break語(yǔ)句contiune語(yǔ)句goto語(yǔ)句8.5循環(huán)中的跳轉(zhuǎn)while(…)/*外層循環(huán)*/{for(…)/*內(nèi)層循環(huán)*/{if(…)break;…}}語(yǔ)句while(…)/*外層循環(huán)*/{for(…)/*內(nèi)層循環(huán)*/{if(…)continue;…}}語(yǔ)句C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31428.5.1break語(yǔ)句break語(yǔ)句

常用于提前從循環(huán)推出或跳出switch結(jié)構(gòu)。無(wú)條件地結(jié)束switch、while、dowhile或for循環(huán)結(jié)構(gòu),轉(zhuǎn)向執(zhí)行該結(jié)構(gòu)的后續(xù)語(yǔ)句。

while(表達(dá)式1){

語(yǔ)句1if(表達(dá)式2)break;

語(yǔ)句2}語(yǔ)句3C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31438.5.1break語(yǔ)句break語(yǔ)句

常用于提前從循環(huán)推出或跳出switch結(jié)構(gòu)。無(wú)條件地結(jié)束switch、while、dowhile或for循環(huán)結(jié)構(gòu),轉(zhuǎn)向執(zhí)行該結(jié)構(gòu)的后續(xù)語(yǔ)句。

for(表達(dá)式1;1;表達(dá)式3){

循環(huán)體語(yǔ)句

if(表達(dá)式2)break;}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程44例8.7判斷素?cái)?shù)分析:

素?cái)?shù)是只能被1和它本身整除的數(shù)。若判斷整數(shù)m是否為素?cái)?shù),需要尋找可能整除m的因子i(2~m-1的整數(shù))。如果都除不盡則m為素?cái)?shù);只要有一個(gè)因子能整除m,該數(shù)就不是素?cái)?shù)。

for(i=2~m)if(m能被i整除)跳出循環(huán)if(循環(huán)執(zhí)行m-1次)m是素?cái)?shù)else(循序提前結(jié)束)m不是素?cái)?shù)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程45例8.7判斷素?cái)?shù)for(i=2;i<m;i++){

if(m%i==0)break;}

/*判斷素?cái)?shù)*/if(i==m)/*循環(huán)m-1次*/printf("%disaprime.\n",m);else/*提前跳出循環(huán)*/printf("%disnotaprime..\n",m);如何終止循環(huán)?能否優(yōu)化?C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程46算法優(yōu)化:

若m不是素?cái)?shù),

m=i*j,

令i<=j,

則i<=j>=

例8.7判斷素?cái)?shù)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程47例8.7判斷素?cái)?shù)標(biāo)志控制循環(huán)intflag=1;doublek=sqrt(m);/*添加頭文件math.h*/for(i=2;i<=k&&flag;i++){/*尋找m的因子i*/if(m%i==0)flag=0;}

/*判斷素?cái)?shù)*/if(flag)/*遍歷循環(huán)*/printf("%disaprime.\n",m);else/*提前跳出循環(huán)*/

printf("%disnotaprime..\n",m);C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31488.5.2continue語(yǔ)句continue語(yǔ)句用來(lái)跳過(guò)循環(huán)的一部分,繼續(xù)執(zhí)行下一輪循環(huán)操作。它并不跳出整個(gè)循環(huán)結(jié)構(gòu),而是跳過(guò)循環(huán)本中剩余的語(yǔ)句,結(jié)束本輪循環(huán)。continue語(yǔ)句只用在循環(huán)體中,常與if條件語(yǔ)句一起使用,用來(lái)加速循環(huán)。while(表達(dá)式1){

語(yǔ)句1if(表達(dá)式2)continue;語(yǔ)句2}語(yǔ)句3C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31498.5.2continue語(yǔ)句for(n=1;n<100;n++){

if(n%3!=0)continue;printf(“n=%d\n”,n);}for(n=1;n<100;n++){if(n%3==0)

printf(“n=%d\n”,n);}包含continue的循環(huán)結(jié)構(gòu),代碼的可讀性不好,可以用其他形式代替該跳轉(zhuǎn)語(yǔ)句。continue一般是用條件判斷執(zhí)行的,并不是必須的;

通過(guò)將判斷條件取反,可以免去continue的使用,以構(gòu)筑良好的程序風(fēng)格。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31508.5.3goto語(yǔ)句goto語(yǔ)句一般為無(wú)條件跳轉(zhuǎn)語(yǔ)句,程序直接跳轉(zhuǎn)到標(biāo)號(hào)所指示的語(yǔ)句。一般形式goto標(biāo)號(hào);…標(biāo)號(hào):語(yǔ)句;...使用跳轉(zhuǎn)能力強(qiáng)的goto語(yǔ)句可以直接從內(nèi)層循環(huán)中直接跳到外層循環(huán)后C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31518.5.3goto語(yǔ)句for

(inti=0;i<5;i++)

for(intj=0;j<5;j++)

{

if(

i==3&&j==3

)

gotolabel;

printf(“continue.”);

}label:printf(“over”);goto語(yǔ)句常用于一次跳出多重循環(huán)C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3152

inta;gotoInit;Forward:a=a+1;Print:printf(“%d”,a);gotoDown;Init:a=1;gotoPrint;Down:if(a<100)gotoForward;用goto語(yǔ)句實(shí)現(xiàn)的循環(huán)完全可用while或者for循環(huán)來(lái)表示;goto是低級(jí)語(yǔ)言的表征,不利于結(jié)構(gòu)化編程,應(yīng)盡量少使用!goto的程序段系統(tǒng)跟蹤和架構(gòu)困難,閱讀也相對(duì)復(fù)雜:8.5.3goto語(yǔ)句C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3153關(guān)于goto的論戰(zhàn)SP與Dijkstra“Gotoconsideredharmful”

,“Ibecameconvincedthatthegotostatementshouldbeabolishedfromall"higherlevel"programminglanguages.”“Thegotostatement…istoomuchaninvitationtomakeamessofone'sprogram.”StucturedProgrammingwithGotoStatement8.5.3goto語(yǔ)句C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/31548.6案例分析用循環(huán)的思想設(shè)計(jì)的算法:窮舉法列舉出問(wèn)題中所有可能出現(xiàn)的情況,對(duì)各個(gè)狀態(tài)一一測(cè)試,直到找到符合條件的情況,或?qū)⑷靠赡軤顟B(tài)都測(cè)試完為止。 如:百錢(qián)百雞、雞兔同籠、水仙花數(shù)、素?cái)?shù)迭代法不斷用新值取代變量的舊值,或由舊值遞推出變量的新值的過(guò)程。如:累加、累乘、

Fibonacci

數(shù)列、級(jí)數(shù)

C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3155

例“百雞問(wèn)題”一只公雞5錢(qián),一只母雞3錢(qián),三只雛雞1錢(qián),一百個(gè)錢(qián)買(mǎi)一百只雞,如果每種雞都必須有。問(wèn):買(mǎi)到公雞、母雞、雛雞各多少只?8.6案例分析不定方程求解問(wèn)題:

cocks+hens+chicken=1005*cocks+3*hens+chicken/3=100cocks>0,hens>0,chicken>0,chicken%3=0C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3156

例“百雞問(wèn)題”

8.6案例分析

窮舉法:

考慮全部可能性,然后從這些可能性中按條件逐一排查,直到得出某個(gè)結(jié)論。方法一:用多層循環(huán)結(jié)構(gòu)分別列舉各種雞個(gè)數(shù), 選擇結(jié)構(gòu)將滿(mǎn)足條件的數(shù)目輸出for(公雞數(shù)目所有可能情況)for(母雞數(shù)目所有可能情況)for(小雞數(shù)目所有可能情況){if(滿(mǎn)足方程1且滿(mǎn)足方程2且滿(mǎn)足方程3)

輸出可能結(jié)果}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3157

例“百雞問(wèn)題”

8.6案例分析

窮舉法:

考慮全部可能性,然后從這些可能性中按條件逐一排查,直到得出某個(gè)結(jié)論。方法二:用多層循環(huán)分別列舉出各種雞的個(gè)數(shù), 排除所有不可能組合for(分別列舉出公、母、雛的所有可能個(gè)數(shù)){/*為多重循環(huán)*/if(不滿(mǎn)足方程1)continue;if(不滿(mǎn)足方程2)continue;if(不滿(mǎn)足方程3)continue;

輸出滿(mǎn)足所有條件的各種雞的數(shù)目}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程58思路一:

intcocks,hens,chicken;

for(cocks=1;cocks<100;++cocks)

for(hens=1;hens<100;++hens)

for(chicken=3;chicken<100;chicken+=3)

{

if(5*cocks+3*hens+chicken/3==100/*百雞*/

&&cocks+hens+chicken==100)/*百錢(qián)*/

printf("cocks=%d,hens=%d,chicken=%d\n", cocks,hens,chicken);

}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程59思路一:優(yōu)化算法

for(cocks=1;cocks<20;++cocks)

for(hens=1;hens<33;++hens)

{

chicken=100-cocks-hens;/*百雞*/

if(5*cocks+3*hens+chicken/3==100&&chicken%3==0)/*百錢(qián)*/

printf("cocks=%d,hens=%d,chicken=%d\n",cocks,hens,chicken);

}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程60思路二:

for(cocks=1;cocks<20;++cocks)

for(hens=1;hens<33;++hens)

{

if(5*iCocks+3*iHens+iChicken/3-100) continue;

if(iCocks+iHens+iChicken-100)

continue;

printf("cocks=%d,hens=%d,chicken=%d\n",

cocks,hens,chicken);

}C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3161例使用級(jí)數(shù)求的近似值思路:迭代法--累加求和

用循環(huán)對(duì)各項(xiàng)值迭加,直至被加項(xiàng)<

循環(huán)條件:|x|>10-8

循環(huán)終止條件:|x|10-8

循環(huán)體算法:

{累加當(dāng)前項(xiàng);

求下一項(xiàng)值;

}級(jí)數(shù)求通項(xiàng)遞推法8.6案例分析C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程62doubles=0,x=1,pi;intk=1;intsign=1;do{ s+=x;

k++;sign=-sign x=1.0*sign/(2*k-1);

}while(fabs(x)>1e-8);

pi=s*4; 思路一:

直接用通項(xiàng)描述迭加//累加當(dāng)前項(xiàng)//后項(xiàng)分母//變號(hào)//求后項(xiàng)//精度判斷例使用級(jí)數(shù)求的近似值C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程63doubles=0,x=1,pi;intk=1;intsign=1;do{s+=x;

k+=2;

sign=-sign;

x=sign/double(k);

}while(fabs(x)>1e-8);

pi=s*4;//累加當(dāng)前項(xiàng)//后項(xiàng)分母//變號(hào)//求后項(xiàng)//求例使用級(jí)數(shù)求的近似值思路二:設(shè)第k項(xiàng)Xk=1/k

第k+1項(xiàng)Xk+1=(-1)/(k+2)

C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程2023/1/3164例求兩個(gè)正整數(shù)m和n的最大公約數(shù)窮舉法:從1~min(m,n)中尋找最大的i,使得m%i==0&&

n%i==08.6案例分析優(yōu)化算法--輾轉(zhuǎn)相除法:輾轉(zhuǎn)相除法,又名歐幾里德算法(Euclideanalgorithm)乃求兩個(gè)正整數(shù)之最大公因子的算法。它是已知最古老的算法,其可追溯至3000年前。輾轉(zhuǎn)相除法一個(gè)較大的數(shù)與較小的數(shù)的最大公約數(shù)原理假設(shè)8251(大數(shù))=6105(小數(shù))+2146,用a=b+c表示于是有c=a-b那么如果有a|d=0,且b|d=0,就必然有a-b|d=0,也就是c|d=0,可見(jiàn)a和b的公約數(shù)必然也是c的約數(shù)?,F(xiàn)在假設(shè)d是a,b的最大公約數(shù),那么d也必然是c的約數(shù),于是d是b,c的公約數(shù)證明它是最大公約數(shù)——因?yàn)閍=b+c,于是b,c的公約數(shù)也必然是a的約數(shù),假設(shè)(b,c)=e,(根據(jù)"d是b,c的公約數(shù)"知道e|d=0)那么有(b+c)|e=0,即a|e=0,可見(jiàn)e也是a,b的公約數(shù),d|e=0,綜上有e=d

可見(jiàn)(a,b)=(b,c)=d這個(gè)思想一推廣。C程序設(shè)計(jì)快速進(jìn)階大學(xué)教程66a=m,b=n,r=m%n;while(r!=0){a bb rr a%b}b是最大公約數(shù)2496abra%b當(dāng)m>n,m與n的最大公約數(shù)等于n和m%n的最大公約數(shù);963abr630abrmn例求兩個(gè)正整數(shù)m和n的最大公約數(shù)又一個(gè)例子例如,252和105的最大公約數(shù)是21(252=21×12;105=21×5);252%

105=42105%42=2142

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論