版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)用壓力緊身衣產(chǎn)品供應(yīng)鏈分析
- 藝術(shù)家用蠟筆商業(yè)機(jī)會(huì)挖掘與戰(zhàn)略布局策略研究報(bào)告
- 醫(yī)用水袋產(chǎn)品供應(yīng)鏈分析
- 古拉爾氏水稀次醋酸鉛溶液產(chǎn)業(yè)鏈招商引資的調(diào)研報(bào)告
- 電動(dòng)下水管道疏通器市場(chǎng)發(fā)展前景分析及供需格局研究預(yù)測(cè)報(bào)告
- 啞鈴產(chǎn)品供應(yīng)鏈分析
- 家務(wù)服務(wù)行業(yè)相關(guān)項(xiàng)目經(jīng)營(yíng)管理報(bào)告
- 電視電腦體機(jī)產(chǎn)品供應(yīng)鏈分析
- 關(guān)于數(shù)字化轉(zhuǎn)型的商業(yè)咨詢(xún)服務(wù)行業(yè)營(yíng)銷(xiāo)策略方案
- 恢復(fù)計(jì)算機(jī)數(shù)據(jù)行業(yè)營(yíng)銷(xiāo)策略方案
- 變形美術(shù)字設(shè)計(jì)
- 汽車(chē)燈光系統(tǒng)--ppt課件
- 配合比調(diào)整權(quán)限
- 五年級(jí)女生生理衛(wèi)生
- 小學(xué)語(yǔ)言文字工作計(jì)劃例文
- 標(biāo)準(zhǔn)氣體的配制課件
- 外傷性顱底腦脊液漏的處理策略
- 平菇栽培技術(shù)ppt
- 人字形骨架首件施工方案
- 三八婦女節(jié)主題班會(huì)PPT課件
- 學(xué)校專(zhuān)用教室管理與使用檢查記錄表
評(píng)論
0/150
提交評(píng)論