第5章 循環(huán)結(jié)構(gòu)_第1頁
第5章 循環(huán)結(jié)構(gòu)_第2頁
第5章 循環(huán)結(jié)構(gòu)_第3頁
第5章 循環(huán)結(jié)構(gòu)_第4頁
第5章 循環(huán)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章循環(huán)結(jié)構(gòu)*考點01:while語句

§5.1while語句及用while語句構(gòu)成的循環(huán)結(jié)構(gòu)(當型)

1.形式:while(表達式)語句(循環(huán)體)例如while(i<0){printf("*");i++;}。

2.說明:while是C語言的關(guān)鍵字,表達式的值數(shù)據(jù)類型任意,用于控制循環(huán)體是否執(zhí)行。3.執(zhí)行S1.計算表達式的值,當值非0,執(zhí)行S2;值為0執(zhí)行S4。S2.執(zhí)行循環(huán)體中的語句。S3.轉(zhuǎn)去執(zhí)行S1。S4.退出while循環(huán)。例5-1求2+4+6+……+98+100=?main(){intsum,i;sum=0;i=2;while(i<=100){sum+=i;i+=2;}printf("Sum=%d\n",sum);}運行結(jié)果為:Sum=2550運行例5-1

例5-2愛因斯坦階梯問題:設(shè)有階梯,不知其階數(shù),但知每跨2階最后剩1階;每跨3階最后剩2階;每跨5階最后剩4階;每跨6階最后剩5階;每跨7階正好到樓頂,求共有多少階。分析:使用窮舉法。設(shè)階數(shù)n,則n%2=1,n%3=2,n%5=4,n%6=5,n%7=0;n是奇數(shù)且是7的倍數(shù),所以只需要用7,21,35……一一進行測試即可得到正確的n值。main(){intn=7;while(n%3!=2||n%5!=4||n%6!=5)n+=14;printf("Total=%d\n",n);}運行結(jié)果為:Total=119運行例5-2

例5-3猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個;第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少桃子。

分析:使用遞推法。采取逆向思維的方法,從后往前推斷,循環(huán)條件為天數(shù)>0。

main()

{intx1,x2=1,day=9;

while(day>0)

{x1=(x2+1)*2;/*第1天的桃子數(shù)是第2天桃子數(shù)加1后的2倍*/

x2=x1;

day--;}

printf("Thetotalis%d!\n",x1);}運行結(jié)果為:Thetotalis1534!運行例5-3注意:(1)“當”型是指當循環(huán)條件滿足時,就執(zhí)行循環(huán);“直到”型指執(zhí)行循環(huán)直到不滿足循環(huán)條件為止。(2)如果在第一次進入循環(huán)時,表達式的值為0,循環(huán)一次也不執(zhí)行。(3)循環(huán)控制變量是在循環(huán)條件中控制條件是真是假的變量。要編寫正確的循環(huán)結(jié)構(gòu),需對循環(huán)控制變量做3個工作:循環(huán)控制變量正確賦初值、將循環(huán)控制變量寫入正確的循環(huán)條件、循環(huán)控制變量的更新、調(diào)整。(4)在循環(huán)體中一定要有使循環(huán)趨于結(jié)束的操作,否則形成死循環(huán)(循環(huán)條件永遠滿足),這時循環(huán)將永遠進行下去,只有Ctrl+Break(Pause)強制退出。(5)在循環(huán)體中,語句的先后位置必須符合邏輯,如i++這樣的循環(huán)控制變量更新的語句位置必須正確,否則運算過程中可能會漏掉一項多加一項,如例5-1中的i+=2在前則結(jié)果為2650。歷年真題精解1.有以下程序

main()

{inta=1,b=2;

while(a<6){b+=a;a+=2;b%=10;}

printf("%d,%d\n",a,b);}程序運行后的輸出結(jié)果是(1009)A)5,11

B)7,1

C)7,11

D)6,1答案:

B解析:

1<6執(zhí)行循環(huán),b=b+a=2+1=3、a=a+2=3、b=b%10=3%10=3;3<6繼續(xù)循環(huán),b=3+3=6、a=3+2=5、b=6%10=6;5<6繼續(xù)循環(huán),b=6+5=11、a=5+2=7、b=11%10=1;7>6結(jié)束循環(huán)。

2.有以下程序

main()

{inty=10;

while(y--);

printf("y=%d\n",y);}程序執(zhí)行后的輸出結(jié)果是(1009)A)y=0

B)y=-1

C)y=1

D)while構(gòu)成無限循環(huán)答案:

B解析:要結(jié)束循環(huán),表達式y(tǒng)--值為0;--在后,故y后減1=-1。

3.有以下程序

main(){intn=2,k=0;while(k++&&n++>2);printf("%d%d\n",k,n);}

程序運行后的輸出結(jié)果是(0909)A)02 B)13 C)57 D)12答案:

D解析:先計算表達式k++的值為0,則求值短路,n++>2沒有執(zhí)行;循環(huán)沒有執(zhí)行,但此時k為1,所以選D。

4.有以下程序

main(){charc1,c2;scanf("%c",&c1);while(c1<65||c1>90)scanf("%c",&c1);c2=c1+32;printf("%c,%c\n",c1,c2);}

程序運行輸入65回車后,能否輸出結(jié)果、結(jié)束運行(請回答能或不能)(0903)。答案:不能解析:因為c1為字符變量,所以輸入65等價于輸入'6'和'5','6'的ASCII碼值為54,滿足循環(huán)條件,故系統(tǒng)繼續(xù)讀入'5','5'的ASCII碼值為53,仍然滿足循環(huán)條件,'\n'的ASCII碼值為10,仍然滿足循環(huán)條件,故系統(tǒng)會等待下一個數(shù)據(jù)的輸入。只有繼續(xù)輸入直到不滿足循環(huán)條件為止,才能有輸出結(jié)果。5.下列程序運行時,若輸入labced12df<回車>輸出結(jié)果為(0903)#include<stdio.h>voidmain(){chara=0,ch;while((ch=getchar())!='\n'){if(a%2!=0&&(ch>='a'&&ch<='z'))ch=ch-'a'+'A';a++;putchar(ch);}printf("\n");}答案:

lAbCdE12dF

解析:循環(huán)結(jié)束條件為輸入回車;第一次循環(huán)時a%2為0,則直接執(zhí)行a++;putchar(ch);輸出l且a為1;第二次a%2為1,且'a'為小寫字母,則將ch轉(zhuǎn)換成'A',輸出A且a為2;至此可得規(guī)律,輸入的第1、3、5、7、9字符原樣輸出,而第2、4、6、10字符小寫變大寫輸出,第8字符為'2'不滿足&&右側(cè)條件,故原樣輸出。6.有以下程序

main(){intk=5;while(--k)printf("%d",k-=3);printf("\n");}

執(zhí)行后的輸出結(jié)果是(0609)A)1 B)2 C)4 D)死循環(huán)答案:

A解析:

--k為4非0輸出k-=3表達式(k=4-3)的值為1,再判斷--k為0,結(jié)束循環(huán)。

*考點02:do-while語句1.形式:

do語句(循環(huán)體)while(表達式);例如do{i++;s+=i;}while(i<10);?!?.2do-while語句及用do-while語句構(gòu)成的循環(huán)結(jié)構(gòu)(直到型)

2.說明:

do是C語言的關(guān)鍵字,必須與while聯(lián)合使用。循環(huán)由do開始,到while結(jié)束;必須注意while(表達式)后的“;”不能缺少,它代表do-while語句的結(jié)束。

3.執(zhí)行S1.執(zhí)行do后面循環(huán)體中的語句。S2.計算表達式的值,當值非0,執(zhí)行S1;否則退出do-while循環(huán)。

例5-4輸入并輸出一串字符,遇“!”結(jié)束。

#include<stdio.h>voidmain(){charc;do{c=getchar();putchar(c);}while(c!='!');}運行例5-4例5-5輸入一個正整數(shù),然后按反向輸出。比如輸入123456則輸出654321。分析:個位上的數(shù)通過模10得到,十位上的數(shù)通過除10再模10得到,其余依此類推;循環(huán)條件為商不等于0。

main(){longn;printf("Pleaseinputainteger:");scanf("%ld",&n);printf("Thereverseorderis:");do{printf("%ld",n%10);n/=10;}while(n);printf("\n");}運行例5-5注意:(1)do-while與while的區(qū)別是

do-while是先執(zhí)行循環(huán)再判斷循環(huán)條件,所以無論表達式的值是0還是非0,循環(huán)體至少要被執(zhí)行一次。(2)與while語句一樣,在循環(huán)體中一定要有使循環(huán)趨于結(jié)束的操作。歷年真題精解1.下程序運行后的輸出結(jié)果是(0909)main(){inta=1,b=7;do{b=b/2;a+=b;}while(b>1);printf("%d\n",a);}答案:

5解析:第一次循環(huán)b=3,a=4,3>1執(zhí)行第二次循環(huán);b=1,a=5,1不大于1,結(jié)束循環(huán)。*考點03:for語句1.形式:

for(表達式1;表達式2;表達式3)

語句(循環(huán)體);例如for(k=0;k<10;k++)printf("*");?!?.3for語句及用for語句構(gòu)成的循環(huán)結(jié)構(gòu)(當型)

2.說明:for是C語言的關(guān)鍵字。表達式1通常用來給循環(huán)控制變量賦初值,也允許在for語句前給循環(huán)控制變量賦初值;表達式2通常是循環(huán)條件;表達式3通常用來更新循環(huán)控制變量的值。3.執(zhí)行S1.計算表達式1的值。S2.計算表達式2的值,若值非0則執(zhí)行循環(huán)體一次,否則跳出循環(huán)。S3.計算表達式3的值,轉(zhuǎn)回S2重復執(zhí)行。

注意:(1)for語句中的各表達式都可省略,但“;”不能少。如for(;表達式;表達式)、for(表達式;;表達式)、for(表達式;表達式;)、for(;;)。(2)要省略表達式1,則應(yīng)在循環(huán)前給循環(huán)控制變量賦初值;要省略表達式2,則應(yīng)在循環(huán)體內(nèi)有使循環(huán)結(jié)束的條件;要省略表達式3,則應(yīng)將表達式3作為循環(huán)體的最后一條語句。(3)直接省略表達式2或表達式3,很可能造成死循環(huán)。例5-6一位百萬富翁遇到一個陌生人,陌生人找他談一個換錢計劃:我每天給你十萬元,而你第一天只需給我一分錢;第二天我仍給你十萬元,你給我二分錢;第三天我仍給你十萬元,你給我四分錢……你每天給我的錢是前一天的兩倍,直到滿一個月(30天)。百萬富翁很高興,欣然接受了這個契約。請編寫一個程序計算這一個月中陌生人給了百萬富翁多少錢,百萬富翁給了陌生人多少錢。

分析:等差數(shù)列和等比數(shù)列。陌生人的增量為1000000,百萬富翁為2倍,循環(huán)控制變量2→30。

main(){intn,i;longs=1,k=1,t=100000;for(i=2;i<=30;i++){k*=2;s+=k;t+=100000;}s=s/100;/*將以分為單位換為以元為單位*/printf("millionairegivestranger:%ld$\nstrangergivemillionaire:%ld$\n",s,t);}運行例5-6例5-7古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總對數(shù)為多少?(斐波那契數(shù)列)

分析:使用遞推法。每個月兔子總對數(shù)為1,1,2,3,5……從第三個月開始,每項是前兩項之和;循環(huán)控制變量1→20。main(){longf1=1,f2=1;inti;for(i=1;i<=20;i++){printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");/*控制輸出,每行四個*/f1=f1+f2;/*前兩個月加起來賦值給第三個月*/f2=f1+f2;/*前兩個月加起來賦值給第三個月*/}

}運行例5-7例5-8打印出所有的“水仙花數(shù)”,所謂“水仙花數(shù)”是指一個三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。如153是一個“水仙花數(shù)”,因為153=13+53+33。分析:每個數(shù)要分解出個位,十位,百位,然后用if進行判斷;控制變量100→999。main()

{inti,j,k,n;

printf("'Waterflower'numberis:");

for(n=100;n<1000;n++)

{i=n/100;/*分解出百位*/

j=(n-i*100)/10;/*分解出十位*/

k=n%10;/*分解出個位*/

if(i*i*i+j*j*j+k*k*k==n)

printf("%d",n);}

printf("\n");}運行例5-8歷年真題精解1.有以下程序

main(){intf,f1,f2,i;f1=0;f2=1;printf("%d%d",f1,f2);for(i=3;i<=5;i++){f=f1+f2;printf("%d",f);f1=f2;f2=f;}printf("\n");}程序運行后的輸出結(jié)果是(0909)答案:

01123解析:首先輸出f1、f2的值01,然后執(zhí)行第一次循環(huán),輸出f的值1,f1變成1、f2還是1;第二次循環(huán),輸出f的值2,f1還是1、f2變成2;第三次循環(huán),輸出f的值3。

2.有以下程序

main()

{intc=0,k;for(k=1;k<3;k++)switch(k){default:c+=k;case2:c++;break;case4:c+=2;break;}printf("%d\n",c);}程序運行后的輸出結(jié)果是(0909)A)3B)5 C)7D)9答案:

A解析:第一次循環(huán),k的值1,執(zhí)行default和case2后的語句,c的值為2;第二次循環(huán),k的值2,執(zhí)行case2后的語句,c的值為3。

3.有以下程序

main()

{inty=9;for(;y>0;y--)if(y%3==0)printf("%d",--y);}程序的運行結(jié)果是(0709)A)741B)963 C)852D)875421答案:

C解析:滿足y%3==0的只有9、6、3,所以輸出為8、5、2(--y)。*考點04:循環(huán)結(jié)構(gòu)的嵌套1.while(){…for(){…}…}2.do{…for(){…}…}while();2.for(){…while(){…}…}4.for(){

…for(){…}…}§5.4循環(huán)結(jié)構(gòu)的嵌套

例5-9輸出9*9口訣。分析:先打印*123456789再分行與列考慮,共9行9列,i控制行,j控制列。

main(){inti,j;printf("*");for(i=1;i<10;i++)printf("%6d",i);printf("\n");for(i=1;i<10;i++){printf("%d",i);for(j=1;j<10;j++) printf("%6d",i*j);printf("\n");}}運行例5-9

例5-10百錢買百雞問題。公元錢五世紀,我國古代數(shù)學家張丘建在《算經(jīng)》一書中提出了“百雞問題”:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?分析:根據(jù)題意,雞翁最多為19(<100/5),雞母最多33(<100/3),雞雛的個數(shù)為100-雞翁個數(shù)-雞母個數(shù),所以使用二重循環(huán),外循環(huán)為雞翁0-19窮舉、內(nèi)循環(huán)為雞母0-33窮舉,內(nèi)循環(huán)體為雞雛賦值語句、使用if來控制輸出的為滿足條件的百雞個數(shù)。main()

{intcocks,hens,chicks;

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

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

{chicks=100-cocks-hens;if(5*cocks+3*hens+chicks/3==100&&chicks%3==0)

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

}

}

}運行例5-10歷年真題精解1.以下程序中的變量已正確定義

for(i=0;i<4;i++,i++)for(k=1;k<3;k++)printf("*");程序段的輸出結(jié)果是(0903)A)********B)****C)**D)*答案:

B解析:第一次外循環(huán):內(nèi)循環(huán)執(zhí)行兩次,輸出**;第二次外循環(huán),輸出**;因為i++,i++所以第二次外循環(huán)結(jié)束后i值為4,結(jié)束循環(huán)。2.有以下程序

main()

{int

i,j;

for(i=3;i>=1;i--)

{

for(j=1;j<=2;j++)

printf("%d",i+j);

printf("\n");

}

}程序的運行結(jié)果是(0809)A)

2

3

4

B)4

3

2

C)2

3

D)4

5

3

4

5

5

4

3

3

4

3

4

4

5

2

3答案:

D解析:外循環(huán)共執(zhí)行3次(i由3到1),內(nèi)循環(huán)執(zhí)行2次(j由1到2),且外循環(huán)最好一條語句為換行,所以輸出結(jié)果有3行,每行有兩個數(shù)據(jù)。而第一次3+1=4、3+2=5,故選D。3.以下程序的輸出結(jié)果是(0809)#include<stdio.h>voidmain(){inti,j,sum;for(i=3;i>=1;i--){sum=0;for(j=1;j<=i;j++)sum+=i*j;}printf("%d\n",sum);}答案:

1解析:外循環(huán)共執(zhí)行3次(i由3到1),內(nèi)循環(huán)隨i遞減次數(shù)依次為3、2、1(j<=i),且每次外循環(huán)開始sum被重新賦值為0,故只需要分析最后一次外循環(huán)。sum+=1*1,故答案為1。4.有以下程序(0809)#include<stdio.h>voidmain(){inti,j,m=55;for(i=1;i<=3;i++)for(j=3;j<=i;j++)m=m%j;printf("%d\n",m);}程序的運行結(jié)果是(0709)A)0B)1C)2D)3答案:

B解析:當外循環(huán)i的值為1、2時,內(nèi)循環(huán)一次也不執(zhí)行,當外循環(huán)i的值為3時,內(nèi)循環(huán)執(zhí)行一次,m=m%3,所以m的值為1。*考點05:break語句1.只能在循環(huán)體內(nèi)和switch語句內(nèi)使用break語句。2.當break出現(xiàn)在循環(huán)體中的switch語句體內(nèi)時,其作用只是跳出該switch語句體;當出現(xiàn)在循環(huán)體中,但并不在switch語句體內(nèi)時,則在執(zhí)行break后,跳出本層循環(huán)體?!?.5break語句和continue語句例5-11用break語句改寫例5-4:輸入并輸出一個字符,遇“!”結(jié)束。

#include<stdio.h>main(){charc;for(;;){c=getchar();putchar(c);if(c=='!')break;}}運行例5-11

例5-12求1+2+3+……+n=?,當該值大于5000時提前結(jié)束。

main(){inti,s;s=0;for(i=1;i;i++){s=s+i;if(s>5000)break;}printf("s=%d\n",s);}運行例5-12歷年真題精解1.有以下程序main(){inti,j,m=1;for(i=1;i<3;i++){for(j=3;j>0;j--){if(i*j>3)break;m*=i*j;}}printf("m=%d\n",m);}程序運行后的輸出結(jié)果是(1003)。A)m=6B)m=2C)m=4D)m=5答案:

A解析:外循環(huán)控制變量i由1→3,內(nèi)循環(huán)控制變量j由3→1;故當i為2、j為3時(2*3>3),即外循環(huán)執(zhí)行第二次、內(nèi)循環(huán)執(zhí)行第一次時循環(huán)提前結(jié)束。此時m=m*i*j=1*1*3*1*2*1*1=6。2.有以下程序

main(){inti=5;do{if(i%3==1)if(i%5==2){printf("*%d",i);break;}i++;}while(i!=0);printf("\n");}程序的運行結(jié)果是(0809)A)*7B)*3*5C)*5D)*2*6答案:

A解析:只有同時滿足i%3==1和i%5==2才能執(zhí)行break使循環(huán)結(jié)束,故最小為7(i++),故輸出結(jié)果為*7。*考點06:continue語句1.在while和do-while循環(huán)中,continue語句使得流程直接跳到循環(huán)控制條件的測試部分,然后決定循環(huán)是否繼續(xù)進行。2.在for循環(huán)中,遇到continue后,跳過循環(huán)體中余下的語句,而去對for語句中的表達式3求值,然后進行表達式2的條件測試,最后根據(jù)表達式2的值來決定for循環(huán)是否執(zhí)行。

例5-13把輸入串中除小寫元音字母以外的字符打印出來。#include<stdio.h>main(){charc;while((c=getchar())!='\n'){if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')continue;putchar(c);}}運行例5-131.以下程序運行后的輸出結(jié)果是(0903)main(){in

溫馨提示

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

評論

0/150

提交評論