版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)
北京科技大學(xué)信息基礎(chǔ)科學(xué)系C
語言程序設(shè)計(jì)1第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)北京科技大學(xué)信息基礎(chǔ)科學(xué)系C問題1:如何根據(jù)收入,確定一個人的納稅比例及納稅額?當(dāng)一個公司有多名員工時,如何計(jì)算每個人的納稅比例及納稅額?提出問題:C語言:循環(huán)語句??
問題2如何根據(jù)學(xué)生的分?jǐn)?shù)判斷是否及格?如何根據(jù)全班學(xué)生的分?jǐn)?shù),分別判斷他們是否及格?12:522問題1:當(dāng)一個公司有多名員工時,如何計(jì)算每個人的納稅比例及納本章主要內(nèi)容while循環(huán)控制do-while循環(huán)控制for循環(huán)控制用goto語句實(shí)現(xiàn)循環(huán)控制循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語句循環(huán)的嵌套循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例12:523本章主要內(nèi)容while循環(huán)控制12:5235.1while循環(huán)控制語句一般格式while(表達(dá)式)
語句
一般為關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是C語言其他類型的合法表達(dá)式
用來控制循環(huán)體是否執(zhí)行稱為內(nèi)嵌語句,可以是基本語句、控制語句,也可以是復(fù)合語句是循環(huán)重復(fù)執(zhí)行的部分12:5245.1while循環(huán)控制語句一般格式一般為關(guān)系表達(dá)式或功能:計(jì)算表達(dá)式的值,為非0(邏輯真)時,重復(fù)執(zhí)行內(nèi)嵌語句,每執(zhí)行一次,就判斷一次表達(dá)式的值,直到表達(dá)式的值為0時結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while后面的語句。
當(dāng)表達(dá)式為真語句N-S結(jié)構(gòu)圖NY流程圖表達(dá)式非0?語句循環(huán)控制條件循環(huán)體12:525功能:計(jì)算表達(dá)式的值,為非0(邏輯真)時,重復(fù)執(zhí)行內(nèi)嵌語句例如:【例5.1】編寫程序,求100個自然數(shù)的和即:
s=1+2+3+…+100
思路:尋找加數(shù)與求和的規(guī)律
加數(shù)i——從1變到100,每循環(huán)一次,使i增1,直到i的值超過100。i的初值設(shè)為1。求和——設(shè)變量
sum存放和,循環(huán)求sum=sum+i,直至i超過100。
12:526例如:【例5.1】編寫程序,求100個自然數(shù)的和思路:尋找加算法和程序:main(){inti,sum;i=1;sum=0;while(i<=100)
{sum=sum+i;i++;
}printf("sum=%d\n",sum);}運(yùn)行jc5_1程序輸出結(jié)果:sum=5050i:循環(huán)控制變量sum:累加器
i=1,sum=0當(dāng)i<=100sum=sum+ii++輸出sum12:527算法和程序:main()運(yùn)行jc5_1程序輸出結(jié)果:i:注意:如果
(表達(dá)式)值為0,則循環(huán)體一次也不執(zhí)行
(例如當(dāng)i的初值為101)。在循環(huán)體中必須有使循環(huán)趨向結(jié)束的操作,否則循環(huán)將無限進(jìn)行(死循環(huán))。在循環(huán)體中,語句的先后位置必須符合邏輯,否則會影響運(yùn)算結(jié)果。
思考如下的輸出?……while(i<=100){i++;sum=sum+i;}printf("sum=%d\n",sum);}運(yùn)行后,輸出:sum=5150原因是什么?如何修改程序使結(jié)果正確?
12:528注意:如果(表達(dá)式)值為0,則循環(huán)體一次也不執(zhí)行(例⑵inti=0;while(++i<=100)==>
++i;判斷i<=100sum+=i;⑶inti=0;while(i++<100) ==>
判斷i<100;i++;sum+=i;⑷inti=0;while(i<100)
sum+=++i;
==>{++i;sum+=i;}不同的while
語句形式設(shè):sum=0;⑴inti=1;while(i<=100)
sum+=i++;
==>{sum+=i;++i;}運(yùn)行結(jié)束后:i、sum=?運(yùn)行結(jié)束后:i=101,sum=5050i=101,sum=5050i=101,sum=5050i=100,sum=5050運(yùn)行jC5_a12:529⑵inti=0;不同的while語句形式設(shè):sum=0其他的while
語句形式while(0){....}
由于表達(dá)式恒等于0,所以循環(huán)體永遠(yuǎn)也不會執(zhí)行,是一個邏輯錯誤的語句while(1){....}
由于表達(dá)式恒等于1,所以不可能通過循環(huán)控制條件來結(jié)束循環(huán)體的執(zhí)行,即死循環(huán)。為了保證循環(huán)正常運(yùn)行,應(yīng)該特別注意:循環(huán)控制條件的描述
控制條件的初始狀態(tài)(初始值)
循環(huán)體內(nèi)部對控制條件的影響12:5210其他的while語句形式while(0){....5.2do-while語句語句一般格式do語句
while(表達(dá)式);
功能:先執(zhí)行內(nèi)嵌語句(循環(huán)體),之后計(jì)算表達(dá)式的值,不為0(邏輯真)時,再執(zhí)行循環(huán)體并判斷條件,直到表達(dá)式的值為0結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while下面的語句。12:52115.2do-while語句語句一般格式12:521
do-while循環(huán)的算法循環(huán)體當(dāng)表達(dá)式為真N-S結(jié)構(gòu)圖NY循環(huán)體表達(dá)式非0?流程圖main(){inti=1,sum=0;
do
{sum=sum+i;i++;
}
while(i<=100);printf("%d\n",sum);}用do-while語句求1+2+…+100
12:5212do-while循環(huán)的算法循環(huán)體N-說明:while和do-while都能實(shí)現(xiàn)循環(huán)控制,while結(jié)構(gòu)程序通常都可以轉(zhuǎn)換成do-while結(jié)構(gòu)區(qū)別:do-while語句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次;while語句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行do—while循環(huán)體中一定要有能使表達(dá)式值趨于0的操作(如i++),否則會出現(xiàn)死循環(huán)。
12:5213說明:while和do-while都能實(shí)現(xiàn)循環(huán)控制,whido-while語句的簡單應(yīng)用【例5.3】用輾轉(zhuǎn)相除法求m和n的最大公約數(shù)12:5214do-while語句的簡單應(yīng)用【例5.3】用輾轉(zhuǎn)相除法求m算法和程序:main(){intm,n,r;scanf("%d,%d",&m,&n);if(m<n){r=m;m=n;n=r;}
do{r=m%n;
m=n;n=r;
}while(r!=0);printf("%d\n",m);}運(yùn)行jc5_3程序運(yùn)行情況如下:24,6012定義m、n、rm<nTFm和n交換r=m%nm=nn=r當(dāng)r!=0時輸出最大公約數(shù)m12:5215算法和程序:main()運(yùn)行jc5_3程序運(yùn)行情況如下:定5.3for語句語句一般格式for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句功能:計(jì)算表達(dá)式1的值,再判斷表達(dá)式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語句(循環(huán)體),并計(jì)算表達(dá)式3;之后再去判斷表達(dá)式2,一直到其值為0時結(jié)束循環(huán),執(zhí)行后續(xù)語句。循環(huán)初始條件循環(huán)控制條件循環(huán)體12:52165.3for語句語句一般格式功能:循環(huán)初始條件循環(huán)控制條for語句的算法N-S結(jié)構(gòu)圖for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句NY流程圖計(jì)算表達(dá)式1語句計(jì)算表達(dá)式3表達(dá)式2為真?例如:main(){inti,sum;
for(sum=0,i=1;i<=100;i++)
sum=sum+i;
printf("sum=%d\n",sum);}可部分或全部省略,但“;”不可省略12:5217for語句的算法N-S結(jié)構(gòu)圖for(表達(dá)式1;表達(dá)式2;表省略for語句的表達(dá)式⑴表達(dá)式1、2、3全省略,即:for(;;)
等同于:while(1),會無限循環(huán)(死循環(huán))注意:在省略某個表達(dá)式時,應(yīng)在適當(dāng)位置進(jìn)行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行⑵省略表達(dá)式1和表達(dá)式3,即:for(;表達(dá)式2;)
等同于:while(
表達(dá)式2)⑶省略表達(dá)式2,即:
for(表達(dá)式1;;表達(dá)式3)
等同于:表達(dá)式1;while(1){…表達(dá)式3;}12:5218省略for語句的表達(dá)式⑴表達(dá)式1、2、3全省略,即:注意:例如:⑴i=1;for(;i<=100;i++)sum+=i;⑵for(i=1;;i++){…if(i>100)……}⑶for(i=1;i<=100;){…i++;…}⑷i=1;for(;;){…if(i>100)…
i++;…}12:5219例如:⑴i=1;⑵for(i=1;;i++)說明:所有用while
語句實(shí)現(xiàn)的循環(huán)都可以用for
語句實(shí)現(xiàn)。
等價于:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
語句;表達(dá)式1;while(表達(dá)式2){
語句;
表達(dá)式3;
}12:5220說明:所有用while語句實(shí)現(xiàn)的循環(huán)都可以用for語句for語句的簡單應(yīng)用【例5.4】求n!,即計(jì)算p=1×2×3×…×n的值。
思路:求階乘與求累加的運(yùn)算處理過程類似,只要將“+”變?yōu)椤?”。設(shè)置:乘數(shù)i
,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入)累乘器p
,每次循環(huán)令p=p*i12:5221for語句的簡單應(yīng)用【例5.4】求n!,即計(jì)算p=1×2×程序:main(){inti,n;longp;
p=1;
printf("Entern:");scanf("%d",&n);for(i=1;i<=n;i++)
p=p
*
i;printf("p=%ld\n",p);}思考:如何求s=1!+2!+…+n!?運(yùn)行jc5_412:5222程序:main()思考:運(yùn)行jc5_412:5222熟悉幾個循環(huán)語句while(!x)x++;
當(dāng)x=0
時,執(zhí)行循環(huán)體x++;while((c=getchar())!='\n')n=n+1;n稱為計(jì)數(shù)器,作用是統(tǒng)計(jì)輸入字符的個數(shù)while(num++<=2);printf("%d\n",num);循環(huán)體是空語句,退出循環(huán)后輸出num的值dox*=-3;while(x>5);先執(zhí)行循環(huán)體x*=-3,再判斷條件(x>5)for(n=0;n<26;n++)printf("%c",n+'A');作用是輸出26個大寫字母for(sum=0,i=1;i<=100;sum=sum+i,i+=2);作用是計(jì)算100以內(nèi)的奇數(shù)和
12:5223熟悉幾個循環(huán)語句while(!x)x++;while幾種循環(huán)語句的比較while和do-while語句的表達(dá)式只有一個,for語句有三個。while和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件。while語句多用于循環(huán)次數(shù)不定的情況do-while語句多用于至少要運(yùn)行一次的情況for語句多用于要賦初值或循環(huán)次數(shù)固定的情況12:5224幾種循環(huán)語句的比較while和do-while語句的表達(dá)式只應(yīng)用舉例先由計(jì)算機(jī)“想”一個1到100之間的數(shù)請人猜,如果人猜對了,則結(jié)束游戲,否則計(jì)算機(jī)給出提示,告訴人所猜的數(shù)是太大還是太小,直到人猜對為止。計(jì)算機(jī)記錄人猜的次數(shù),以此來反映猜數(shù)者“猜”的水平。12:5225應(yīng)用舉例先由計(jì)算機(jī)“想”一個1到100之間的數(shù)請人猜,如果人應(yīng)用舉例國王的許諾。相傳國際象棋是古印度舍罕王的宰相達(dá)依爾發(fā)明的。舍罕王十分喜歡象棋,決定讓宰相自己選擇何種賞賜。這位聰明的宰相指著8×8共64格的象棋盤說:陛下,請您賞給我一些麥子吧,就在棋盤的第一個格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盤上的64個格子,我就感恩不盡了。舍罕王讓人扛來一袋麥子,他要兌現(xiàn)他的許諾。
國王能兌現(xiàn)他的許諾嗎?試編程計(jì)算舍罕王共要多少麥子賞賜他的宰相,這些麥子合多少立方米?(已知1立方米麥子約1.42e8粒)
總粒數(shù)為:sum=1+2+22+23+…+263
12:5226應(yīng)用舉例國王的許諾。相傳國際象棋是古印度舍罕王的宰相達(dá)依爾發(fā)5.4用goto語句實(shí)現(xiàn)循環(huán)有興趣的同學(xué)自學(xué)不提倡使用goto語句注意:goto語句能實(shí)現(xiàn)程序無條件轉(zhuǎn)移,為編程提供了便利。但是無限制地使用,會破壞程序的結(jié)構(gòu)化程度。因此要限制使用。12:52275.4用goto語句實(shí)現(xiàn)循環(huán)有興趣的同學(xué)自學(xué)注意:5.5循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語句有如下三種語句實(shí)現(xiàn)跳轉(zhuǎn):continue語句break語句goto語句在循環(huán)語句的循環(huán)體中使用,可以進(jìn)行循環(huán)的流程控制12:52285.5循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語句有如下三種語句實(shí)現(xiàn)跳轉(zhuǎn):15.5.1continue語句及應(yīng)用功能:中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行的語句),立即開始執(zhí)行下一次循環(huán)。12:52295.5.1continue語句及應(yīng)用功能:12:5后續(xù)語句…語句…YN表達(dá)式?后續(xù)語句…語句…表達(dá)式?YN5.5.1continue語句及應(yīng)用(續(xù))continue;while語句continue;do-while語句后續(xù)語句計(jì)算表達(dá)式3計(jì)算表達(dá)式1…語句…表達(dá)式2?YNcontinue;for語句12:5230后續(xù)語句…YN表達(dá)式?后續(xù)語句…表達(dá)式?YN5.5.1co例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);
if(x<0)continue;
s+=x;n++;};
⑵intx,n=0,s=0;do{scanf("%d",&x);
if(x<0)continue;
s+=x;n++;}while(n<10);
⑶for(n=0,s=0;n<10;){scanf("%d",&x);
if(x<0)continue;
s+=x;n++}12:5231例如:⑴intx,n=0,s=0;⑵intx,n=0應(yīng)用舉例【例5.7】把100~200之間能被7整除的數(shù),以十個數(shù)為一行的形式輸出,最后輸出一共有多少個這樣的數(shù)。
思路:設(shè)變量n,從100變化到200;對每個n進(jìn)行判斷,當(dāng)n不能被7整除時,終止本次循環(huán),否則就輸出這個數(shù);設(shè)變量j作為輸出個數(shù)的計(jì)數(shù)器,每輸出一個數(shù)就令j++;當(dāng)輸出了10個數(shù)時(即j%10等于0),輸出’\n’退出循環(huán)后輸出j的值。
12:5232應(yīng)用舉例【例5.7】把100~200之間能被7整除的數(shù),以算法和程序main(){intn,j=0;for(n=100;n<=200;n++){if(n%7!=0)continue; printf("%6d",n);
j++;
if(j%10==0)printf("\n");
}printf("\n");printf("j=%d\n",j);}for(n=100;n<=200;n++)n不能被7整除
TF終止本次循環(huán)輸出n
輸出10個數(shù)
TF
換行運(yùn)行jc5_712:5233算法和程序main()for(n=100;n<=2005.5.2循環(huán)中break的應(yīng)用功能:利用break語句能夠強(qiáng)迫終止本層循環(huán),轉(zhuǎn)到后續(xù)語句執(zhí)行。12:52345.5.2循環(huán)中break的應(yīng)用功能:12:5234后續(xù)語句…語句…YN表達(dá)式?后續(xù)語句…語句…表達(dá)式?YN5.5.2循環(huán)中break的應(yīng)用(續(xù))break;while語句break;do-while語句后續(xù)語句計(jì)算表達(dá)式3計(jì)算表達(dá)式1…語句…表達(dá)式2?YNbreak;for語句12:5235后續(xù)語句…YN表達(dá)式?后續(xù)語句…表達(dá)式?YN5.5.2循環(huán)例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);
if(x<0)break;s+=x;n++;};⑵intx,n=0,s=0;do{scanf("%d",&x);
if(x<0)break;s+=x;n++;}while(n<10);⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);
if(x<0)break;s+=x;}12:5236例如:⑴intx,n=0,s=0;⑵intx,n=0編程輸出如下形式的乘法九九表
12:5237編程輸出如下形式的乘法九九表12:5237將上例輸出格式改成如下的下三角格式打印
12:5238將上例輸出格式改成如下的下三角格式打印12:52385.6循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語句,則稱為循環(huán)的嵌套使用嵌套的循環(huán)體時,應(yīng)注意以下問題在嵌套的各層循環(huán)體中,使用復(fù)合語句(即用一對大花括號將循環(huán)體語句括起來)保證邏輯上的正確性內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂嵌套的循環(huán)最好采用右縮進(jìn)格式書寫,以保證層次的清晰性循環(huán)嵌套不能交叉,即在一個循環(huán)體內(nèi)必須完整的包含著另一個循環(huán)12:52395.6循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語合法的嵌套循環(huán)12:5240合法的嵌套循環(huán)12:52405.6循環(huán)的嵌套例如:
#include<stdio.h>main(){inti,j;
for(
i=1;i<10;i++
)
for(
j=1;j<=i;j++
)
printf((j==i)?"%4d\n":"%4d",i*j);
}運(yùn)行jc5_a外循環(huán)語句內(nèi)循環(huán)語句外循環(huán)體內(nèi)循環(huán)體12:52415.6循環(huán)的嵌套例如:#include<stdio.注意:while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。多重循環(huán)程序執(zhí)行時,外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。例如:for(a=1;a<=10;a++){for(b=0;b<=5;b++)
……}外循環(huán)執(zhí)行了10次,內(nèi)循環(huán)執(zhí)行6次循環(huán)正常結(jié)束時,內(nèi)循環(huán)執(zhí)行了10×6=60次12:5242注意:while、do-while、for循環(huán)語句可以并列,馬克思手稿中有一道趣味數(shù)學(xué)題:有30個人,其中有男人、女人和小孩,在一家飯館里吃飯共花了50先令,每個男人各花3先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?
解方程組窮舉法12:5243馬克思手稿中有一道趣味數(shù)學(xué)題:有30個人,其中有男人、女人和方法1:采用三重循環(huán)窮舉x,y,z的全部可能的組合
#include<stdio.h>main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=30;x++)
for(y=0;y<=30;y++)for(z=0;z<=30;z++)
if(x+y+z==30&&3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}
12:5244方法1:采用三重循環(huán)窮舉x,y,z的全部可能的組合#inc方法2:改進(jìn)算法
#include<stdio.h>
main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=16;x++)
for(y=0;y<=25;y++){z=30–x-y;
if(3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}}
12:5245方法2:改進(jìn)算法#include<stdio.h>5.7循環(huán)結(jié)構(gòu)程序設(shè)計(jì)【例5.5】按每行輸出5個數(shù)的形式輸出Fibonacci數(shù)列的前20項(xiàng)
。思路:Fibonacci數(shù)列的前幾項(xiàng)是:1、1、2、3、5、8、13、21、34、…。此數(shù)列的變化規(guī)律是:1(n=1)1(n=2)fn-1+fn-2(n>2)fn=設(shè)變量f1、f2和f3,并為f1和f2賦初值1,令f3=f1+f2得到第3項(xiàng);將f1←f2,f2←f3,再求f3=f1+f2得到第4項(xiàng);依此類推求第5項(xiàng)、第6項(xiàng)…這是一種遞推算法應(yīng)采用循環(huán)實(shí)現(xiàn)12:52465.7循環(huán)結(jié)構(gòu)程序設(shè)計(jì)【例5.5】按每行輸出5個數(shù)的形式輸算法和程序#defineN20main(){inti,f1,f2,f3;f1=f2=1;printf("\n%8d%8d",f1,f2);for(i=3;i<=N;i++)
{f3=f1+f2;f1=f2;f2=f3;printf("%8d",f3);
if(i%5==0)printf("\n");
}
}f1=1,f2=1并輸出for(i=3;i<=20;i++)f3=f2+f1f1=f2,f2=f3
輸出f3
輸出5個數(shù)
TF
換行運(yùn)行jc5_512:5247算法和程序#defineN20f1=1,f2=1并輸舉例2【例5.11】判斷輸入的某個數(shù)m是否為素數(shù)。若是素數(shù),輸出“YES”,若不是,輸出“NO”。
思路:素數(shù)是指只能被1和它本身整除的數(shù),如5、7、11、17、…等。
分別用2、3、…,m-1嘗試能否整除整數(shù)m。如果m能被某個數(shù)整除,則m就不是素數(shù)。這是一種窮舉算法設(shè)除數(shù)為j,從2循環(huán)到m-112:5248舉例2【例5.11】判斷輸入的某個數(shù)m是否為素數(shù)。若是素數(shù),輸入一個整數(shù),判斷它是否是素數(shù)
12:5249輸入一個整數(shù),判斷它是否是素數(shù)12:5249方法1#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++) {
if(m%i==0) {
printf("No!\n");
gotoend; } }
printf("Yes!\n");end:
printf("Programisover!\n");}Pleaseenteranumber:
6
Programisover!No!12:5250方法1#include<math.h>Pleaseen方法1#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++) {
if(m%i==0) {
printf("No!\n");
gotoend; } }
printf("Yes!\n");end:
printf("Programisover!\n");}Pleaseenteranumber:
5
Programisover!Yes!12:5251方法1#include<math.h>Pleaseen方法2#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++){
if(m%i==0)
break; }
if(i>k)
printf("Yes!\n");
else
printf("No!\n");
printf("Programisover!\n");}Pleaseenteranumber:
6
Programisover!No!12:5252方法2#include<math.h>Pleaseen方法3#include<math.h>main(){
intm,i,k,flag=1;/*標(biāo)志變量flag初值置為1*/
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k&&flag;i++) {
if(m%i==0)flag=0; }
if(flag)
printf("Yes!\n");
else
printf("No!\n");
printf("Programisover!\n");}12:5253方法3#include<math.h>12:525這個程序是做什么的?#include<math.h>main(){
intm,i,k,flag=1;/*標(biāo)志變量flag初值置為1*/
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=m-1;i++) {
if(m%i==0)flag=0;
printf("%d\n",i);
}
if(flag)
printf("Nodivisor!Itisaprimenumber.\n");
printf("Programisover!\n");}12:5254這個程序是做什么的?#include<math.h>應(yīng)用舉例【例5.12】用牛頓迭代法求方程
2x3+4x2-7x-6=0在x=1.5附近的根。
思路:設(shè)xn為一個接近xa的近似根,過(xn,f(xn))點(diǎn)做切線,切線方程為:即:xnxn+1xy0f(x)(xn,f(xn))(xn+1,f(xn+1))xa
方程的根—牛頓迭代公式12:5255應(yīng)用舉例【例5.12】用牛頓迭代法求方程思路:設(shè)xn為一個接算法基本步驟:①
先設(shè)一個方程近似根x0,求出方程f的值和方程導(dǎo)數(shù)f1的值;f=2x03+4x02-7x0-6f1=6x02+8x0-7②
用迭代公式x=x0-f/f1進(jìn)行迭代,求出x比x0要接近方程真實(shí)的根;③
當(dāng)|x-x0|大于某個很小的數(shù)時(如10-6),認(rèn)為未找到,此時將x→x0,再次求f、f1,并迭代,又求出一個新的更接近方程根的x;④
一直到|x-x0|≤10-6時得到方程近似根:x或x0。這是一種迭代算法用循環(huán)實(shí)現(xiàn)12:5256算法基本步驟:①先設(shè)一個方程近似根x0,求出方程f的值和算法和程序:#include"math.h"main(){floatx,x0,f,f1;
x=1.5;do{x0=x;f=2*x0*x0*x0+4*x0*x0-7*x0-6;f1=6*x0*x0+8*x0-7;
x=x0-f/f1;}while(fabs(x-x0)>1e-6);printf("%f\n",x);}x賦初值x0=x計(jì)算f計(jì)算f1計(jì)算x=x0-f/f1當(dāng)|x-x0|>10-6時輸出x運(yùn)行jc5_132x3+4x2-7x-6=012:5257算法和程序:#include"math.h"x賦初值運(yùn)行應(yīng)用舉例【例5.10】編程序求2~10000以內(nèi)的完全數(shù)。
完全數(shù)(完備數(shù)):一個數(shù)的因子(除了這個數(shù)本身)之和等于該數(shù)本身。思路:設(shè)定i從2變到10000,對每個i找到其因子和s;判定i=s?若相等,則i為完全數(shù),否則不是。
例如:6的因子是1、2、3,因子和1+2+3=6因此6是完全數(shù)使用窮舉算法用雙層循環(huán)實(shí)現(xiàn)12:5258應(yīng)用舉例【例5.10】編程序求2~10000以內(nèi)的完全數(shù)。算法和程序:main(){inti,j,s;
for(i=2;i<=10000;i++)
{s=0;
for(j=1;j<i;j++)if(i%j==0)s+=j;if(i==s)printf("%6d\n",s);
}}for(i=2;i<=10000;i++)s=0for(j=1;j<i;j++)i%j==0TFs=s+ji==sTFi是完全數(shù)運(yùn)行jc5_1112:5259算法和程序:main()for(i=2;i<=1000應(yīng)用舉例【例5.9】編程序,輸出以下圖形。
****************一共有4行,每行由空格和星號組成:空格數(shù)按行增加,星號按行減少變量
i
控制輸出行數(shù),從1變化到4變量j控制輸出每行的空格和星號:j從1變化到
i,每次輸出一個空格j從1變化到9-2*i,每次輸出一個星號使用雙重循環(huán)實(shí)現(xiàn)思路:12:5260應(yīng)用舉例【例5.9】編程序,輸出以下圖形。*******一算法和程序:main(){inti,j;
for(i=1;i<=4;i++){for(j=1;j<=i;j++)printf("");
for(j=1;j<=9-2*i;j++)printf("*");
printf("\n");}}for(i=1;i<=4;i++)for(j=1;j<=i;j++)
輸出一個空格
for(j=1;j<=9-2*i;j++)
輸出一個星號換行思考:如何輸出10行圖形?輸出圖形向右平移20個字符位置,應(yīng)如何修改程序?運(yùn)行jc5_10for(j=1;j<=21-2*i;j++)for(j=1;j<=20+i;j++)12:5261算法和程序:main()for(i=1;i<=4;i內(nèi)容關(guān)鍵詞常用算法,如遞推法、迭代法、窮舉法等難點(diǎn)提示設(shè)計(jì)累加與累乘算法,并尋找累加項(xiàng)或累乘項(xiàng)的構(gòu)成規(guī)律3種循環(huán)語句在控制流程時的區(qū)別和相互聯(lián)系循環(huán)語句的嵌套break語句在switch語句和循環(huán)語句中的作用使用continue語句和break語句的區(qū)別12:5262內(nèi)容關(guān)鍵詞12:5262本周實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)五循環(huán)結(jié)構(gòu)程序設(shè)計(jì)實(shí)驗(yàn)內(nèi)容的1、2、3、4要求:事先編好程序,上機(jī)只進(jìn)行程序的錄入和調(diào)試。下周實(shí)驗(yàn)內(nèi)容:實(shí)驗(yàn)五5、6實(shí)驗(yàn)六1、212:5263本周實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)五循環(huán)結(jié)構(gòu)程序設(shè)計(jì)12:5263第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)
北京科技大學(xué)信息基礎(chǔ)科學(xué)系C
語言程序設(shè)計(jì)64第5章循環(huán)結(jié)構(gòu)程序設(shè)計(jì)北京科技大學(xué)信息基礎(chǔ)科學(xué)系C問題1:如何根據(jù)收入,確定一個人的納稅比例及納稅額?當(dāng)一個公司有多名員工時,如何計(jì)算每個人的納稅比例及納稅額?提出問題:C語言:循環(huán)語句??
問題2如何根據(jù)學(xué)生的分?jǐn)?shù)判斷是否及格?如何根據(jù)全班學(xué)生的分?jǐn)?shù),分別判斷他們是否及格?12:5265問題1:當(dāng)一個公司有多名員工時,如何計(jì)算每個人的納稅比例及納本章主要內(nèi)容while循環(huán)控制do-while循環(huán)控制for循環(huán)控制用goto語句實(shí)現(xiàn)循環(huán)控制循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語句循環(huán)的嵌套循環(huán)結(jié)構(gòu)程序設(shè)計(jì)舉例12:5266本章主要內(nèi)容while循環(huán)控制12:5235.1while循環(huán)控制語句一般格式while(表達(dá)式)
語句
一般為關(guān)系表達(dá)式或邏輯表達(dá)式,也可以是C語言其他類型的合法表達(dá)式
用來控制循環(huán)體是否執(zhí)行稱為內(nèi)嵌語句,可以是基本語句、控制語句,也可以是復(fù)合語句是循環(huán)重復(fù)執(zhí)行的部分12:52675.1while循環(huán)控制語句一般格式一般為關(guān)系表達(dá)式或功能:計(jì)算表達(dá)式的值,為非0(邏輯真)時,重復(fù)執(zhí)行內(nèi)嵌語句,每執(zhí)行一次,就判斷一次表達(dá)式的值,直到表達(dá)式的值為0時結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while后面的語句。
當(dāng)表達(dá)式為真語句N-S結(jié)構(gòu)圖NY流程圖表達(dá)式非0?語句循環(huán)控制條件循環(huán)體12:5268功能:計(jì)算表達(dá)式的值,為非0(邏輯真)時,重復(fù)執(zhí)行內(nèi)嵌語句例如:【例5.1】編寫程序,求100個自然數(shù)的和即:
s=1+2+3+…+100
思路:尋找加數(shù)與求和的規(guī)律
加數(shù)i——從1變到100,每循環(huán)一次,使i增1,直到i的值超過100。i的初值設(shè)為1。求和——設(shè)變量
sum存放和,循環(huán)求sum=sum+i,直至i超過100。
12:5269例如:【例5.1】編寫程序,求100個自然數(shù)的和思路:尋找加算法和程序:main(){inti,sum;i=1;sum=0;while(i<=100)
{sum=sum+i;i++;
}printf("sum=%d\n",sum);}運(yùn)行jc5_1程序輸出結(jié)果:sum=5050i:循環(huán)控制變量sum:累加器
i=1,sum=0當(dāng)i<=100sum=sum+ii++輸出sum12:5270算法和程序:main()運(yùn)行jc5_1程序輸出結(jié)果:i:注意:如果
(表達(dá)式)值為0,則循環(huán)體一次也不執(zhí)行
(例如當(dāng)i的初值為101)。在循環(huán)體中必須有使循環(huán)趨向結(jié)束的操作,否則循環(huán)將無限進(jìn)行(死循環(huán))。在循環(huán)體中,語句的先后位置必須符合邏輯,否則會影響運(yùn)算結(jié)果。
思考如下的輸出?……while(i<=100){i++;sum=sum+i;}printf("sum=%d\n",sum);}運(yùn)行后,輸出:sum=5150原因是什么?如何修改程序使結(jié)果正確?
12:5271注意:如果(表達(dá)式)值為0,則循環(huán)體一次也不執(zhí)行(例⑵inti=0;while(++i<=100)==>
++i;判斷i<=100sum+=i;⑶inti=0;while(i++<100) ==>
判斷i<100;i++;sum+=i;⑷inti=0;while(i<100)
sum+=++i;
==>{++i;sum+=i;}不同的while
語句形式設(shè):sum=0;⑴inti=1;while(i<=100)
sum+=i++;
==>{sum+=i;++i;}運(yùn)行結(jié)束后:i、sum=?運(yùn)行結(jié)束后:i=101,sum=5050i=101,sum=5050i=101,sum=5050i=100,sum=5050運(yùn)行jC5_a12:5272⑵inti=0;不同的while語句形式設(shè):sum=0其他的while
語句形式while(0){....}
由于表達(dá)式恒等于0,所以循環(huán)體永遠(yuǎn)也不會執(zhí)行,是一個邏輯錯誤的語句while(1){....}
由于表達(dá)式恒等于1,所以不可能通過循環(huán)控制條件來結(jié)束循環(huán)體的執(zhí)行,即死循環(huán)。為了保證循環(huán)正常運(yùn)行,應(yīng)該特別注意:循環(huán)控制條件的描述
控制條件的初始狀態(tài)(初始值)
循環(huán)體內(nèi)部對控制條件的影響12:5273其他的while語句形式while(0){....5.2do-while語句語句一般格式do語句
while(表達(dá)式);
功能:先執(zhí)行內(nèi)嵌語句(循環(huán)體),之后計(jì)算表達(dá)式的值,不為0(邏輯真)時,再執(zhí)行循環(huán)體并判斷條件,直到表達(dá)式的值為0結(jié)束循環(huán),轉(zhuǎn)去執(zhí)行while下面的語句。12:52745.2do-while語句語句一般格式12:521
do-while循環(huán)的算法循環(huán)體當(dāng)表達(dá)式為真N-S結(jié)構(gòu)圖NY循環(huán)體表達(dá)式非0?流程圖main(){inti=1,sum=0;
do
{sum=sum+i;i++;
}
while(i<=100);printf("%d\n",sum);}用do-while語句求1+2+…+100
12:5275do-while循環(huán)的算法循環(huán)體N-說明:while和do-while都能實(shí)現(xiàn)循環(huán)控制,while結(jié)構(gòu)程序通常都可以轉(zhuǎn)換成do-while結(jié)構(gòu)區(qū)別:do-while語句先執(zhí)行循環(huán)體再判斷條件,循環(huán)體至少執(zhí)行一次;while語句先判斷條件再執(zhí)行循環(huán)體,循環(huán)體有可能一次也不執(zhí)行do—while循環(huán)體中一定要有能使表達(dá)式值趨于0的操作(如i++),否則會出現(xiàn)死循環(huán)。
12:5276說明:while和do-while都能實(shí)現(xiàn)循環(huán)控制,whido-while語句的簡單應(yīng)用【例5.3】用輾轉(zhuǎn)相除法求m和n的最大公約數(shù)12:5277do-while語句的簡單應(yīng)用【例5.3】用輾轉(zhuǎn)相除法求m算法和程序:main(){intm,n,r;scanf("%d,%d",&m,&n);if(m<n){r=m;m=n;n=r;}
do{r=m%n;
m=n;n=r;
}while(r!=0);printf("%d\n",m);}運(yùn)行jc5_3程序運(yùn)行情況如下:24,6012定義m、n、rm<nTFm和n交換r=m%nm=nn=r當(dāng)r!=0時輸出最大公約數(shù)m12:5278算法和程序:main()運(yùn)行jc5_3程序運(yùn)行情況如下:定5.3for語句語句一般格式for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句功能:計(jì)算表達(dá)式1的值,再判斷表達(dá)式2,如果其值為非0(邏輯真),則執(zhí)行內(nèi)嵌語句(循環(huán)體),并計(jì)算表達(dá)式3;之后再去判斷表達(dá)式2,一直到其值為0時結(jié)束循環(huán),執(zhí)行后續(xù)語句。循環(huán)初始條件循環(huán)控制條件循環(huán)體12:52795.3for語句語句一般格式功能:循環(huán)初始條件循環(huán)控制條for語句的算法N-S結(jié)構(gòu)圖for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句NY流程圖計(jì)算表達(dá)式1語句計(jì)算表達(dá)式3表達(dá)式2為真?例如:main(){inti,sum;
for(sum=0,i=1;i<=100;i++)
sum=sum+i;
printf("sum=%d\n",sum);}可部分或全部省略,但“;”不可省略12:5280for語句的算法N-S結(jié)構(gòu)圖for(表達(dá)式1;表達(dá)式2;表省略for語句的表達(dá)式⑴表達(dá)式1、2、3全省略,即:for(;;)
等同于:while(1),會無限循環(huán)(死循環(huán))注意:在省略某個表達(dá)式時,應(yīng)在適當(dāng)位置進(jìn)行循環(huán)控制的必要操作,以保證循環(huán)的正確執(zhí)行⑵省略表達(dá)式1和表達(dá)式3,即:for(;表達(dá)式2;)
等同于:while(
表達(dá)式2)⑶省略表達(dá)式2,即:
for(表達(dá)式1;;表達(dá)式3)
等同于:表達(dá)式1;while(1){…表達(dá)式3;}12:5281省略for語句的表達(dá)式⑴表達(dá)式1、2、3全省略,即:注意:例如:⑴i=1;for(;i<=100;i++)sum+=i;⑵for(i=1;;i++){…if(i>100)……}⑶for(i=1;i<=100;){…i++;…}⑷i=1;for(;;){…if(i>100)…
i++;…}12:5282例如:⑴i=1;⑵for(i=1;;i++)說明:所有用while
語句實(shí)現(xiàn)的循環(huán)都可以用for
語句實(shí)現(xiàn)。
等價于:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
語句;表達(dá)式1;while(表達(dá)式2){
語句;
表達(dá)式3;
}12:5283說明:所有用while語句實(shí)現(xiàn)的循環(huán)都可以用for語句for語句的簡單應(yīng)用【例5.4】求n!,即計(jì)算p=1×2×3×…×n的值。
思路:求階乘與求累加的運(yùn)算處理過程類似,只要將“+”變?yōu)椤?”。設(shè)置:乘數(shù)i
,初值為1,終值為n(n是循環(huán)控制終值,需要從鍵盤輸入)累乘器p
,每次循環(huán)令p=p*i12:5284for語句的簡單應(yīng)用【例5.4】求n!,即計(jì)算p=1×2×程序:main(){inti,n;longp;
p=1;
printf("Entern:");scanf("%d",&n);for(i=1;i<=n;i++)
p=p
*
i;printf("p=%ld\n",p);}思考:如何求s=1!+2!+…+n!?運(yùn)行jc5_412:5285程序:main()思考:運(yùn)行jc5_412:5222熟悉幾個循環(huán)語句while(!x)x++;
當(dāng)x=0
時,執(zhí)行循環(huán)體x++;while((c=getchar())!='\n')n=n+1;n稱為計(jì)數(shù)器,作用是統(tǒng)計(jì)輸入字符的個數(shù)while(num++<=2);printf("%d\n",num);循環(huán)體是空語句,退出循環(huán)后輸出num的值dox*=-3;while(x>5);先執(zhí)行循環(huán)體x*=-3,再判斷條件(x>5)for(n=0;n<26;n++)printf("%c",n+'A');作用是輸出26個大寫字母for(sum=0,i=1;i<=100;sum=sum+i,i+=2);作用是計(jì)算100以內(nèi)的奇數(shù)和
12:5286熟悉幾個循環(huán)語句while(!x)x++;while幾種循環(huán)語句的比較while和do-while語句的表達(dá)式只有一個,for語句有三個。while和for先判斷循環(huán)條件后執(zhí)行循環(huán)體,do-while語句先執(zhí)行循環(huán)體后判斷循環(huán)條件。while語句多用于循環(huán)次數(shù)不定的情況do-while語句多用于至少要運(yùn)行一次的情況for語句多用于要賦初值或循環(huán)次數(shù)固定的情況12:5287幾種循環(huán)語句的比較while和do-while語句的表達(dá)式只應(yīng)用舉例先由計(jì)算機(jī)“想”一個1到100之間的數(shù)請人猜,如果人猜對了,則結(jié)束游戲,否則計(jì)算機(jī)給出提示,告訴人所猜的數(shù)是太大還是太小,直到人猜對為止。計(jì)算機(jī)記錄人猜的次數(shù),以此來反映猜數(shù)者“猜”的水平。12:5288應(yīng)用舉例先由計(jì)算機(jī)“想”一個1到100之間的數(shù)請人猜,如果人應(yīng)用舉例國王的許諾。相傳國際象棋是古印度舍罕王的宰相達(dá)依爾發(fā)明的。舍罕王十分喜歡象棋,決定讓宰相自己選擇何種賞賜。這位聰明的宰相指著8×8共64格的象棋盤說:陛下,請您賞給我一些麥子吧,就在棋盤的第一個格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盤上的64個格子,我就感恩不盡了。舍罕王讓人扛來一袋麥子,他要兌現(xiàn)他的許諾。
國王能兌現(xiàn)他的許諾嗎?試編程計(jì)算舍罕王共要多少麥子賞賜他的宰相,這些麥子合多少立方米?(已知1立方米麥子約1.42e8粒)
總粒數(shù)為:sum=1+2+22+23+…+263
12:5289應(yīng)用舉例國王的許諾。相傳國際象棋是古印度舍罕王的宰相達(dá)依爾發(fā)5.4用goto語句實(shí)現(xiàn)循環(huán)有興趣的同學(xué)自學(xué)不提倡使用goto語句注意:goto語句能實(shí)現(xiàn)程序無條件轉(zhuǎn)移,為編程提供了便利。但是無限制地使用,會破壞程序的結(jié)構(gòu)化程度。因此要限制使用。12:52905.4用goto語句實(shí)現(xiàn)循環(huán)有興趣的同學(xué)自學(xué)注意:5.5循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語句有如下三種語句實(shí)現(xiàn)跳轉(zhuǎn):continue語句break語句goto語句在循環(huán)語句的循環(huán)體中使用,可以進(jìn)行循環(huán)的流程控制12:52915.5循環(huán)結(jié)構(gòu)中的跳轉(zhuǎn)語句有如下三種語句實(shí)現(xiàn)跳轉(zhuǎn):15.5.1continue語句及應(yīng)用功能:中斷循環(huán)體的本次執(zhí)行(即跳過循環(huán)體中尚未執(zhí)行的語句),立即開始執(zhí)行下一次循環(huán)。12:52925.5.1continue語句及應(yīng)用功能:12:5后續(xù)語句…語句…YN表達(dá)式?后續(xù)語句…語句…表達(dá)式?YN5.5.1continue語句及應(yīng)用(續(xù))continue;while語句continue;do-while語句后續(xù)語句計(jì)算表達(dá)式3計(jì)算表達(dá)式1…語句…表達(dá)式2?YNcontinue;for語句12:5293后續(xù)語句…YN表達(dá)式?后續(xù)語句…表達(dá)式?YN5.5.1co例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);
if(x<0)continue;
s+=x;n++;};
⑵intx,n=0,s=0;do{scanf("%d",&x);
if(x<0)continue;
s+=x;n++;}while(n<10);
⑶for(n=0,s=0;n<10;){scanf("%d",&x);
if(x<0)continue;
s+=x;n++}12:5294例如:⑴intx,n=0,s=0;⑵intx,n=0應(yīng)用舉例【例5.7】把100~200之間能被7整除的數(shù),以十個數(shù)為一行的形式輸出,最后輸出一共有多少個這樣的數(shù)。
思路:設(shè)變量n,從100變化到200;對每個n進(jìn)行判斷,當(dāng)n不能被7整除時,終止本次循環(huán),否則就輸出這個數(shù);設(shè)變量j作為輸出個數(shù)的計(jì)數(shù)器,每輸出一個數(shù)就令j++;當(dāng)輸出了10個數(shù)時(即j%10等于0),輸出’\n’退出循環(huán)后輸出j的值。
12:5295應(yīng)用舉例【例5.7】把100~200之間能被7整除的數(shù),以算法和程序main(){intn,j=0;for(n=100;n<=200;n++){if(n%7!=0)continue; printf("%6d",n);
j++;
if(j%10==0)printf("\n");
}printf("\n");printf("j=%d\n",j);}for(n=100;n<=200;n++)n不能被7整除
TF終止本次循環(huán)輸出n
輸出10個數(shù)
TF
換行運(yùn)行jc5_712:5296算法和程序main()for(n=100;n<=2005.5.2循環(huán)中break的應(yīng)用功能:利用break語句能夠強(qiáng)迫終止本層循環(huán),轉(zhuǎn)到后續(xù)語句執(zhí)行。12:52975.5.2循環(huán)中break的應(yīng)用功能:12:5234后續(xù)語句…語句…YN表達(dá)式?后續(xù)語句…語句…表達(dá)式?YN5.5.2循環(huán)中break的應(yīng)用(續(xù))break;while語句break;do-while語句后續(xù)語句計(jì)算表達(dá)式3計(jì)算表達(dá)式1…語句…表達(dá)式2?YNbreak;for語句12:5298后續(xù)語句…YN表達(dá)式?后續(xù)語句…表達(dá)式?YN5.5.2循環(huán)例如:⑴intx,n=0,s=0;while(n<10){scanf("%d",&x);
if(x<0)break;s+=x;n++;};⑵intx,n=0,s=0;do{scanf("%d",&x);
if(x<0)break;s+=x;n++;}while(n<10);⑶for(n=0,s=0;n<10;n++){scanf("%d",&x);
if(x<0)break;s+=x;}12:5299例如:⑴intx,n=0,s=0;⑵intx,n=0編程輸出如下形式的乘法九九表
12:52100編程輸出如下形式的乘法九九表12:5237將上例輸出格式改成如下的下三角格式打印
12:52101將上例輸出格式改成如下的下三角格式打印12:52385.6循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語句,則稱為循環(huán)的嵌套使用嵌套的循環(huán)體時,應(yīng)注意以下問題在嵌套的各層循環(huán)體中,使用復(fù)合語句(即用一對大花括號將循環(huán)體語句括起來)保證邏輯上的正確性內(nèi)層和外層循環(huán)控制變量不應(yīng)同名,以免造成混亂嵌套的循環(huán)最好采用右縮進(jìn)格式書寫,以保證層次的清晰性循環(huán)嵌套不能交叉,即在一個循環(huán)體內(nèi)必須完整的包含著另一個循環(huán)12:521025.6循環(huán)的嵌套如果循環(huán)語句的循環(huán)體內(nèi)又包含了另一條循環(huán)語合法的嵌套循環(huán)12:52103合法的嵌套循環(huán)12:52405.6循環(huán)的嵌套例如:
#include<stdio.h>main(){inti,j;
for(
i=1;i<10;i++
)
for(
j=1;j<=i;j++
)
printf((j==i)?"%4d\n":"%4d",i*j);
}運(yùn)行jc5_a外循環(huán)語句內(nèi)循環(huán)語句外循環(huán)體內(nèi)循環(huán)體12:521045.6循環(huán)的嵌套例如:#include<stdio.注意:while、do-while、for循環(huán)語句可以并列,也可以相互嵌套,但要層次清楚,不能出現(xiàn)交叉。多重循環(huán)程序執(zhí)行時,外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)都需要循環(huán)執(zhí)行多次。例如:for(a=1;a<=10;a++){for(b=0;b<=5;b++)
……}外循環(huán)執(zhí)行了10次,內(nèi)循環(huán)執(zhí)行6次循環(huán)正常結(jié)束時,內(nèi)循環(huán)執(zhí)行了10×6=60次12:52105注意:while、do-while、for循環(huán)語句可以并列,馬克思手稿中有一道趣味數(shù)學(xué)題:有30個人,其中有男人、女人和小孩,在一家飯館里吃飯共花了50先令,每個男人各花3先令,每個女人各花2先令,每個小孩各花1先令,問男人、女人和小孩各有幾人?
解方程組窮舉法12:52106馬克思手稿中有一道趣味數(shù)學(xué)題:有30個人,其中有男人、女人和方法1:采用三重循環(huán)窮舉x,y,z的全部可能的組合
#include<stdio.h>main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=30;x++)
for(y=0;y<=30;y++)for(z=0;z<=30;z++)
if(x+y+z==30&&3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}
12:52107方法1:采用三重循環(huán)窮舉x,y,z的全部可能的組合#inc方法2:改進(jìn)算法
#include<stdio.h>
main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=16;x++)
for(y=0;y<=25;y++){z=30–x-y;
if(3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}}
12:52108方法2:改進(jìn)算法#include<stdio.h>5.7循環(huán)結(jié)構(gòu)程序設(shè)計(jì)【例5.5】按每行輸出5個數(shù)的形式輸出Fibonacci數(shù)列的前20項(xiàng)
。思路:Fibonacci數(shù)列的前幾項(xiàng)是:1、1、2、3、5、8、13、21、34、…。此數(shù)列的變化規(guī)律是:1(n=1)1(n=2)fn-1+fn-2(n>2)fn=設(shè)變量f1、f2和f3,并為f1和f2賦初值1,令f3=f1+f2得到第3項(xiàng);將f1←f2,f2←f3,再求f3=f1+f2得到第4項(xiàng);依此類推求第5項(xiàng)、第6項(xiàng)…這是一種遞推算法應(yīng)采用循環(huán)實(shí)現(xiàn)12:521095.7循環(huán)結(jié)構(gòu)程序設(shè)計(jì)【例5.5】按每行輸出5個數(shù)的形式輸算法和程序#defineN20main
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030汽車零部件產(chǎn)品供應(yīng)鏈優(yōu)化行業(yè)競爭格局發(fā)展現(xiàn)狀投資環(huán)境分析
- 2025-2030汽車服務(wù)產(chǎn)業(yè)市場現(xiàn)狀分析及前景趨勢深度預(yù)測報告
- 2025-2030汽車后市場服務(wù)體系建設(shè)與商業(yè)模式創(chuàng)新
- 2025-2030汽車制造業(yè)市場調(diào)研與發(fā)展趨勢研究
- 2025-2030汽車傳感器應(yīng)用領(lǐng)域要點(diǎn)調(diào)查競爭格局發(fā)展策略研究報告
- 2025-2030江西稀土資源開發(fā)利用行業(yè)市場前景供需分析投資評估規(guī)劃分析研究報告
- 極端氣候下建筑物整體性能評價指南
- 行為偏差的自我調(diào)節(jié)策略研究
- 高速硅光子通信-洞察及研究
- 基于大數(shù)據(jù)分析的面向?qū)ο筌浖踩匝芯?洞察及研究
- 石子廠規(guī)范管理制度
- 大數(shù)據(jù)驅(qū)動下的塵肺病發(fā)病趨勢預(yù)測模型
- 成都2025年四川成都市新津區(qū)招聘衛(wèi)生專業(yè)技術(shù)人才21人筆試歷年參考題庫附帶答案詳解
- 2026屆廣東省高考英語聽說考試備考技巧講義
- 炎德英才大聯(lián)考雅禮中學(xué)2026屆高三月考試卷英語(五)(含答案)
- 2026年經(jīng)營人員安全生產(chǎn)責(zé)任制范文
- 2026年及未來5年中國鍛造件行業(yè)市場深度分析及發(fā)展前景預(yù)測報告
- 2026年及未來5年市場數(shù)據(jù)中國大型鑄鍛件行業(yè)市場深度分析及投資戰(zhàn)略數(shù)據(jù)分析研究報告
- 林草濕地生態(tài)調(diào)查監(jiān)測技術(shù)探索
- 兒科2025年終工作總結(jié)及2026年工作計(jì)劃匯報
- 2025赤峰市敖漢旗就業(yè)服務(wù)中心招聘第一批公益性崗位人員112人(公共基礎(chǔ)知識)測試題附答案解析
評論
0/150
提交評論