循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第1頁
循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第2頁
循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第3頁
循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第4頁
循環(huán)結(jié)構(gòu)程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

循環(huán)結(jié)構(gòu)程序設(shè)計(jì)2(1)goto語句和if語句構(gòu)成的循環(huán)結(jié)構(gòu)。(2)while語句構(gòu)成的循環(huán)結(jié)構(gòu)。(3)do-while語句構(gòu)成的循環(huán)結(jié)構(gòu)。(4)for語句構(gòu)成的循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)又稱重復(fù)結(jié)構(gòu),是按照一定的條件重復(fù)執(zhí)行某段語句的程序控制結(jié)構(gòu)。3while語句一般形式為:while(表達(dá)式){循環(huán)體}

循環(huán)體表達(dá)式真假while語句用來構(gòu)造“當(dāng)型”循環(huán),多用于解決循環(huán)次數(shù)事先不確定的問題?!纠?.1】編程實(shí)現(xiàn)1+2+3+…+100。

i=1當(dāng)i<=100sum=sum+Ii=i+1i<=100假真sum=sum+i

i=i+1i=1#include""main(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf("%d\n",sum);}循環(huán)的初始值循環(huán)的條件循環(huán)變量的增量具有唯一真值的表達(dá)式循環(huán)體5【例5.2】一個(gè)簡單的印數(shù)程序。

#include""main(){intnumber=0;

while(number<=1)

{

number++;printf("%d\n",number);}}number011226#include""main(){intnumber=0;while(number++<=1)printf("*%d\n",number);printf("**%d\n",number);

}【例5.3】第二個(gè)印數(shù)程序number012*101*223**3循環(huán)體的構(gòu)成不一樣有一個(gè)延時(shí)效應(yīng)while(number<=1){

number++;printf("%d\n",number);}while(number<=1){

number++;printf("%d\n",number);}【例1】輸入一行字符,按字母、數(shù)字和其它分成三類,分別統(tǒng)計(jì)各類字符的數(shù)目(換行符'\n'不在統(tǒng)計(jì)范圍內(nèi))。字母的條件:c>='a'&&c<='z'c>='A'&&c<='Z'

||

數(shù)字的條件:c>='0'&&c<='9'while(ch!='\n'){

}if(ch>='A'&&ch<='Z'||ch<='a'&&ch<='z')z++;elseif(ch>='0'&&ch<='9')s++;elseq++;scanf("%c",&ch);charch;scanf("%c",&ch);intz=s=q=0;8【例2】輸入一正文,統(tǒng)計(jì)正文包含的行數(shù),字?jǐn)?shù)和字符數(shù)。分析:字符數(shù):對每個(gè)輸入的字符(不包含EOF)進(jìn)行計(jì)數(shù)行數(shù):以'

\n'為結(jié)束標(biāo)志的一串字符,字?jǐn)?shù):假定識(shí)別符為空格字符'

'、換行字符'

\n'或制表字符'

\t'對'

\n'計(jì)數(shù)標(biāo)志

如果c是空格字符'

'、換行字符'

\n'或制表字符'

\t',則將標(biāo)志符置為0,表示c字符不在字中

否則,如果標(biāo)志符為0(表示c是字的第一個(gè)字符)則將字?jǐn)?shù)加1,并修改標(biāo)志為1(表示當(dāng)前字符c是一個(gè)字中的字符)。pleaseinputn:while((c=getchar())!=EOF){++nc;if(c=='\n')++nl;if(c==''||c=='\n'||c=='\t')state=OUT;

elseif(state==OUT){++nw;state=IN;}

}pleaseinputn:#defineIN1#defineOUT0if(c=='\n')++nl;if(c==''||c=='\n'||c=='\t')state=OUT;

elseif(state==OUT){++nw;state=IN;}

}pleaseinputn:#defineIN1#defineOUT0#include""voidmain(){intc,nl,nw,nc,state;state=OUT;nl=nw=nc=0;printf("inputatextendofctrl+z:\n");while((c=getchar())!=EOF){++nc;if(c=='\n')++nl;11【例5.6】搬磚問題。(36塊磚,36人搬;男搬4,女搬3,兩個(gè)小孩抬一磚。要求一次全搬完,問男、女、小孩各若干)設(shè)計(jì)搬磚問題的程序。分析:男人(men)的可能取值范圍為:0-8;女人(women)的可能取值范圍為:0-11;對于men:men=0;while(men<=8){找出滿足題意的women,children;men++;}找每一個(gè)women下的children:

children=36-women-menwomen=0;while(women<=11){找出滿足題意的children;women++;}

if(4*men+3*women+children/2.0==36)#include""main(){intmen=0,women,children;while(men<=8){women=0;while(women<=11){children=36-women-men;if(4*men+3*women+children/2.0==36){printf("\nmenis%d",men);printf("\twomenis%d",women);printf("\tchildrenis%d\n",children);}women++;}men++;}return0;}【例5.7】利用公式:求的值,直到最后一項(xiàng)的絕對值小于等于為止。

main(){floatpi,t,n;intsign=1; pi=0.0;n=1.0;t=1.0;while(fabs(t)>=1e-6){ t=sign/n; pi+=t; n+=2;sign=-sign; }pi=pi*4;printf("pi=%f\n",pi);}14do-while語句do-while語句的一般格式是:

do{

循環(huán)體

}while(<表達(dá)式>);表達(dá)式循環(huán)體假真

功能:先執(zhí)行一次循環(huán)體,再判斷表達(dá)式的真假。若表達(dá)式為真(非0)則繼續(xù)執(zhí)行循環(huán)體,一直到表達(dá)式為假(0)時(shí)退出循環(huán)結(jié)構(gòu)。15

【例4】用do-while語句實(shí)現(xiàn)1+2+3+…+100main() {inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);printf("%d\n",sum);}while后面的“;”號不能少16

【例5】while和do-while循環(huán)的比較。⑴main()(2)main(){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("sum=%d\n",sum);printf("sum=%d\n",sum);}}運(yùn)行結(jié)果如下:運(yùn)行結(jié)果如下:11sum=55sum=55運(yùn)行一次:再運(yùn)行一次:1111sum=0sum=11for語句for語句的一般形式:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

循環(huán)體【例5.10】求自然數(shù)列前n項(xiàng)的和。for語句#include""main(){inti,sum=0;i=1;while(i<=100){sum+=i;i++;}printf("%d\n",sum);}main(){inti,sum=0;

scanf("%d",&n);for(i=1;i<=n;i++)sum+=i;printf("%d\n",sum);return0;}for語句【例5.11】從鍵盤上輸入10個(gè)數(shù),求其平均值。main(){inti;floatf,sum;for(i=1,sum=0;i<11;i++){scanf("%f",&f);sum+=f;}printf("average=%f\n",sum/10);return0;}for語句【例5.12】試求2000-2050年間的閏年。inty;(y%4==0&&y%100!=0)(y%400==0)||該年份能被4整除,但不能被100整除;或者該年份能被400整除。printf("%d",y);if()for語句的幾種特殊情況進(jìn)行說明:(1)對于for語句的一般格式for(p1;p2;p3)中,p1可以省略,但分號不能省略。for(;i<=100;i++)sum+=i;(2)p2可以省略,但保留分號。for(i=1,sum=0;;i++)sum+=i;for(i=1,sum=0;;i++){sum+=i;if(i>100)break;}(3)P3后面沒有分號,也可以省略。for(i=1,sum=0;i<=100;){sum+=i;}i=1;for(;i<=100;i++)sum+=i;for(i=1,sum=0;i<=100;){sum+=i;i++;}???

【例5.13】兔子繁殖問題。設(shè)有一對新生的兔子,從第三個(gè)月開始,它們每個(gè)月都生一對兔子。按照這樣的規(guī)律,并假設(shè)兔子沒有死亡,一年后共有多少對兔子。

1 n=1f(n)=1 n=2f(n-2)+f(n-1)n>=311f1f2ff1f23ff1f2f?258f=f1+f2;f1=f2;f2=f;for(i=3;i<=n;i++){}intf,f1=1,f2=1,i,n;#include""main(){longintf,f1=1,f2=1;inti,n;scanf("%d",&n);printf("%8ld%8ld",f1,f2);for(i=3;i<=n;i++){f=f1+f2;f1=f2;f2=f;printf("%8ld",f);if(i%6==0)printf("\n");

}return0;}應(yīng)用舉例

【例5.14】相傳,印度舍罕時(shí)期有個(gè)宰相名字叫達(dá)依爾,達(dá)依爾見國王很自負(fù),整天被一群溜須拍馬的大臣們包圍,百無聊賴,特別需要一種新的方式來排遣郁悶的心情.他就向國王舍罕推薦了一種游戲,這種游戲就是現(xiàn)在的國際象棋,國王對這種新奇的游戲很快就產(chǎn)生了濃厚的興趣,高興之余,他便問達(dá)依爾,你對我這么衷心耿耿,希望我用什么來褒獎(jiǎng)你呢?達(dá)依爾回答說:“國王只要在國際象棋的棋盤上的第一個(gè)格子上放一粒麥子,第二個(gè)格子上放上2粒,第三個(gè)格子上放上4粒,依次類推,每格是前一格的2倍,一直放到64格,我就感恩不盡了”?!昂冒桑 眹豕笮?,慷慨地答應(yīng)了達(dá)依爾的請求。然而等到麥子成熟時(shí),國王才發(fā)現(xiàn),按照與達(dá)依爾的約定,全印度的麥子竟然連棋盤一半的格子數(shù)目都不夠。國王很納悶,怎么也算不清這筆帳。(1立方的小麥大約1.42×108粒)sum+=t;t*=2;{}sum=0.0,t=1.0;

for(n=0;n<64;n++)

main(){intn;doublev,sum=0.0,t=1.0;for(n=0;n<64;n++){sum+=t;t*=2;}printf("sum=%e",sum);v=sum/1.42e8;printf("v=%e",v);}*****現(xiàn)實(shí)的問題如何打印下列圖形********************printf("*****\n");printf("*****\n");循環(huán)的嵌套

在一個(gè)循環(huán)內(nèi)又完整地包含另一個(gè)循環(huán),稱為循環(huán)的嵌套。printf("%c\n",'*');for(i=1;i<=5;i++)for(j=1;j<=5;j++){}printf("\n");循環(huán)嵌套的應(yīng)用舉例【例5.15】計(jì)算下式的結(jié)果,n由終端輸入。for(sum=0,i=1;i<=n;i++){

}t=1;for(j=1;j<=i;j++)t*=i;sum+=t;for(i=1;i<=n;i++)sum+=i;t*=2;sum+=t;for(t=1,i=0;i<n;i++){}main(){inti,j,n;longsum,term;scanf("%d",&n);for(sum=0,i=1;i<=n;i++){term=1;for(j=1;j<=i;j++)

term

*=i;sum+=term;}printf("sum=%ld\n",sum);}編程實(shí)現(xiàn)求下列數(shù)據(jù)的和(n從鍵盤輸入):

n【例5.15】求整數(shù)3~100中的素?cái)?shù)。

main(){inti,n,num;for(n=3,num=0;n<=100;n++){ i=2;

while(i<n&&n%i!=0)i++;if(i==n){printf("%4d",n);num++;}}printf("\n素?cái)?shù)個(gè)數(shù)為%d",num);}字符三角形【例】輸入一個(gè)字母,輸出由這個(gè)字母決定其高度的字符“金字塔”。例如輸入小寫字母d,則輸出下列左邊圖形,如果輸入大寫字母D,則輸出右邊圖形。aAabaABAabcbaABCBAabcdcbaABCDCBAfor(c2=top;c2<=c1;++c2)printf("%c",c2);for(c2=c1-1;c2>=top;--c2)printf("%c",c2);printf("\n");

}}}voidmain(){charc,c1,c2,top;inti;top=isupper(c=getchar())?'A':(islower(c)?'a':'\0');if(top){for(c1=top;c1<=c;++c1)

{for(i=c;i>=c1+1;--i)

putchar('');【例7】輸出如下格式的九九乘法口訣表。*1234567891123456789246810121416183 91215182124274 1620242832365 25303540456 364248547 4956638 64729 81main(void){inti,j;

printf("%4c",'*');for(i=1;i<=9;++i)

printf("%4d",i);printf("\n");

for(i=1;i<=9;++i){printf("%4d",i);for(j=1;j<=9;++j){if(j>=i)printf("%4d",i*j);elseprintf("%4c",'');}

printf("\n");

}return0;}break語句

在循環(huán)結(jié)構(gòu)中執(zhí)行到break語句時(shí),循環(huán)將無條件終止,程序跳出循環(huán)結(jié)構(gòu)。

【例5.22】下列程序的功能是:從鍵盤上輸入任意個(gè)數(shù),求其平均值,當(dāng)輸入值為0時(shí),計(jì)算結(jié)束。仔細(xì)閱讀程序,體會(huì)break的使用。main(){inti;floatf,sum;

for(i=0,sum=0.0;;i++){scanf("%f",&f);if(f==0.0)break;sum+=f;}if(i==0)printf("nodata");elseprintf("average=%f\n",sum/i);}【例5.19】用break語句打印直角三角形的九九乘法表。main(){inti,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++)

{if(i<j)break;printf("%d*%d=%-4d",i,j,i*j);}printf("\n");}return0;}continue語句

continue語句的作用是終止本次循環(huán),continue語句后面的語句不執(zhí)行而進(jìn)入下一次循環(huán)。

【例2】下列程序的功能是:輸出100以內(nèi)能被7整除的數(shù)。仔細(xì)閱讀程序,體會(huì)continue語句的功能。main(){inti;for(i=1;i<=100;i++)

{if(i%7!=0)continue;printf("%4d",i);}return0;}break語句和continue語句區(qū)別終止本次循環(huán),continue語句后面的語句不執(zhí)行而進(jìn)入下一次循環(huán)。循環(huán)將無條件終止,程序跳出循環(huán)結(jié)構(gòu),執(zhí)行循環(huán)體之后的語句。break語句:continue語句:5.7.1列舉算法所謂列舉算法,是指根據(jù)提出的問題,列舉所有可能的情況,并根據(jù)條件檢驗(yàn)?zāi)男┦切枰?,哪些是不需要的。設(shè)計(jì)列舉算法的關(guān)鍵是根據(jù)問題的性質(zhì)確定判斷的條件,從而對列舉的所有條件進(jìn)行判斷?!纠?.22】某單位要在A,B,C,D,E,F(xiàn)六個(gè)人中選派若干個(gè)人去執(zhí)行一項(xiàng)任務(wù),選人的條件如下:⑴若C不去,則B也不去;⑵C和D兩個(gè)人中去一個(gè);⑶D和E要么都去,要么都不去;⑷A、B、F三個(gè)人中要去一個(gè)⑸C和F不能一起去⑹E和F兩個(gè)人中至少去一個(gè)。問應(yīng)該派選哪幾個(gè)人去?用a,b,c,d,e和f這6個(gè)整型變量分別表示A,B,C,D,E和F是否被選中的狀態(tài)。若變量的值為1,則表示該人被選中;若變量值為0,則表示該人沒有選中。根據(jù)選人的條件,可以得到如下相應(yīng)的表達(dá)式:⑴若C不去,則B也不去。這句話表示:C和B都不去或C去而B隨便。相應(yīng)的表達(dá)式為:b+c==0||c==1⑵C和D兩個(gè)人中去一個(gè),相應(yīng)的表達(dá)式為:c+d==1⑶D和E要么都去,要么都不去,相應(yīng)的表達(dá)式為:d+e==0||d+e==2⑷A、B、F三個(gè)人中要去一個(gè),相應(yīng)的表達(dá)式為:a+b+f==2⑸C和F不能一起去,相應(yīng)的表達(dá)式為:c+f!=2⑹E和F兩個(gè)人中至少去一個(gè),相應(yīng)的表達(dá)式為:e+f>1上述6個(gè)表達(dá)式之間是“與”的關(guān)系,最終可以得到總的表達(dá)式如下:(b+c==0||c==1)&&(c+d==1)&&(d+e==0||d+e==2)&&(a+b+f==2)&&(c+f!=2)&&(e+f>1)窮舉每個(gè)人去(變量的值為1)或不去(變量的值為0)的各種情況,用上述邏輯值進(jìn)行判斷,使邏輯表達(dá)式值為真的情況就是最后選派的結(jié)果。#include<>voidmain(){inta,b,c,d,e,f;for(a=0;a<=1;a++)for(b=0;b<=1;b++)for(c=0;c<=1;c++)for(d=0;d<=1;d++)for(e=0;e<=1;e++)for(f=0;f<=1;f++)if((b+c==0||c==1)&&(c+d==1)&&(d+e==0||d+e==2)&&(a+b+f==2)&&(c+f!=2)&&(e+f>1)){printf("Awill%sbeassigned.\n",a?"":"not");printf("Bwill%sbeassigned.\n",b?"":"not");printf("Cwill%sbeassigned.\n",c?"":"not");printf("Dwill%sbeassigned.\n",d?"":"not");printf("Ewill%sbeassigned.\n",e?"":"not");printf("Fwill%sbeassigned.\n",f?"":"not");}}5.7.2試探算法而在有些問題中,可能其列舉量事先并不知道,只能從初始情況開始,往后逐步進(jìn)行試探,直到滿足給定的條件為止。這就是逐步試探法,簡稱試探法?!纠?.23】某幼兒園按如下方法依次給A,B,C,D,E五個(gè)小孩發(fā)蘋果。將全部蘋果的一半加上二分之一個(gè)蘋果發(fā)放給第一個(gè)小孩;將剩下蘋果的三分之一在家三分之一個(gè)蘋果發(fā)給第二個(gè)小孩;將剩下蘋果的四分之一再加四分之一個(gè)蘋果發(fā)給第三個(gè)小孩;將剩下蘋果的五分之一再加五分之一個(gè)蘋果發(fā)給第四個(gè)小孩;將左后剩下的11個(gè)蘋果發(fā)給第五個(gè)小孩。每個(gè)小孩得到的蘋果數(shù)均為整數(shù)。根據(jù)分配策略,假設(shè)總的蘋果樹為x,設(shè)A,B,C,D,E五個(gè)小孩發(fā)蘋果數(shù)為a,b,c,d,e,可按如下公式依次計(jì)算:a=(x+1)/2;b=(x-a+1)/3;c=(x-a-b+1)/4;e=(x-a-b-c+1)/5;e=11;設(shè)當(dāng)前試探點(diǎn)蘋果數(shù)為n,通過前面的分析可以推知,n應(yīng)滿足下列條件:第k個(gè)小孩得到全部剩下蘋果的(k+1)分之一再加(k+1)分之一個(gè)蘋果,即(n+1)/(k+1)個(gè)蘋果。根據(jù)題意,這個(gè)數(shù)

溫馨提示

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

最新文檔

評論

0/150

提交評論