第一部分語言第4章循環(huán)結(jié)構(gòu)版_第1頁
第一部分語言第4章循環(huán)結(jié)構(gòu)版_第2頁
第一部分語言第4章循環(huán)結(jié)構(gòu)版_第3頁
第一部分語言第4章循環(huán)結(jié)構(gòu)版_第4頁
第一部分語言第4章循環(huán)結(jié)構(gòu)版_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第四章 循環(huán)結(jié)構(gòu)第一節(jié) for語句第二節(jié) while語句第三節(jié) do-while語句第四節(jié) 循環(huán)嵌套第一節(jié) for語句一、語句格式格式1說明:語句1是for循環(huán)語句的循環(huán)體,它將在滿足條件的情況下被重復(fù)執(zhí)行。格式2說明:循環(huán)體部分由多個(gè)語句構(gòu)成,應(yīng)由一對(duì)花括號(hào)括起來,構(gòu)成一個(gè)語句塊的形式程序風(fēng)格提示:寫for循環(huán)語句時(shí),循環(huán)體的語句相對(duì)于for縮進(jìn)兩格。第一節(jié) for語句二、語句執(zhí)行過程for語句的執(zhí)行過程可由以下4步來描述。(1)執(zhí)行“控制變量初始化語句”,使控制變量獲得一個(gè)初值。(2)判斷控制變量是否滿足“條件表達(dá)式”,若滿足條件則執(zhí)行一遍循環(huán)體,否則結(jié)束整個(gè)for語句,繼續(xù)執(zhí)行for循環(huán)

2、下面的句子。(3)根據(jù)增量表達(dá)式,計(jì)算出控制變量所得到的新值(4)自動(dòng)轉(zhuǎn)到第(2)步。第一節(jié) for語句三、語句格式舉例 (1)將控制變量從1變到100,增量為1 for(i=1;i=1;-i) (3)控制變量從7變到77,增量為7 for(i=7;i=2;i-=2) (5)按所示數(shù)列改變控制變量值:99、88、77、66、55、44、33、22、11、0,增量為-11 for(int j=99;j=0;j-=11) (6)控制變量i和j共同進(jìn)行循環(huán)控制,i從1變到99,j從2變到100,增量均為2。 for(int i=1,j=2;i=99&j=100;i+=2,j+=2)需要說明的是:可以

3、在for循環(huán)“ 控制變量初始化語句”中聲明變量(如上面最后3個(gè)例子),這些變量只在for循環(huán)結(jié)構(gòu)中有效,離開了該for結(jié)構(gòu),變量就無效了。 第一節(jié) for語句例4.1 輸出1100之間所有偶數(shù)。#include using namespace std;int main () for (int i=2; i=100 ; i+=2) cout i ;return 0;例4.2 利用for循環(huán),計(jì)算輸出1+2+100的和#include using namespace std;int main () int sum=0; for (int i=1; i=100 ; +i) sum+=i; cout

4、sum; return 0;第一節(jié) for語句例4.3 利用for循環(huán)計(jì)算n!的值。分析:n!1*2*3*n#include using namespace std;int main () long long s; /Noip2010開始C+語言中l(wèi)ong long類型允許使用 int n; /n不能定義為long long,否則for語句死循環(huán) s=1; scanf(%d,&n); for (int i=1; i=13時(shí),s值超過了int類型的表示范圍。還有一種比int更大的類型,稱為long long,它的表示范圍是-263263-1,比-10191019略窄,而我們一直使用的int范圍是

5、-231231-1,只比-2*1092*109略寬。 輸入輸出long long也可以借助于printf和scanf語句,但對(duì)應(yīng)的占位符卻是和平臺(tái)與編譯器相關(guān)的:在linux中,gcc很統(tǒng)一的用%lld;在windows中,MinGW的gcc和VC6都需要用%I64d;但VS2008卻是用%lld。第一節(jié) for語句例4.4 利用for循環(huán),分別計(jì)算1100中奇數(shù)的和、偶數(shù)的和。#include using namespace std;int main ( ) int jssum=0; int ossum=0; for (int js=1,os=2;js=99&os=100;js+=2 ,os

6、+=2 ) jssum+=js; ossum+=os; cout the sum of odd numbers 1 to 100 is : jssumendl; cout the sum of even numbers 1 to 100 is : ossumendl; return 0;說明: 我們也可以在for循環(huán)初始化或增值表達(dá)式部分中放一條以上的語句,中間用逗號(hào)隔開?!旧蠙C(jī)練習(xí)4.1】1、求12+22+32+ 2、求s=1+1/2+1/3+1/1003、計(jì)算100之內(nèi)所有的奇數(shù)之和。4、求10個(gè)數(shù)中的最大值和最小值。5、按字母表的順序,從字母A到Z順序打印輸出。6、求菲波拉契數(shù)列a0,a

7、1,a2,a20。 a0=0,a1=1,a2=a1+a0,a3=a2+a1,an=an-1+an-2; 如0,1,1,2,3,5,8,13,21,第二節(jié) while語句一、語句格式格式1 說明:循環(huán)體部分由多個(gè)語句構(gòu)成,應(yīng)由一對(duì)花括號(hào)括起來,構(gòu)成一個(gè)語句塊的形式。程序風(fēng)格提示:寫while循環(huán)語句時(shí),循環(huán)體的語句相對(duì)于while縮進(jìn)兩格。說明:語句1是while循環(huán)語句的循環(huán)體,它將在滿足條件的情況下被重復(fù)執(zhí)行。格式2第二節(jié) while語句二、語句執(zhí)行過程(1)計(jì)算作為循環(huán)控制條件表達(dá)式的值,得到邏輯真或假,假定用M表示。(2)若M為真,則執(zhí)行了一遍循環(huán)體,否則離開循環(huán),結(jié)束整個(gè)while語句

8、的執(zhí)行。(3)循環(huán)體的所有語句執(zhí)行結(jié)束后,自動(dòng)轉(zhuǎn)向第(1)步執(zhí)行。三、格式舉例(1) i=0; while (ix; while(xx;功能:當(dāng)輸入的數(shù)據(jù)小于0時(shí),重復(fù)讀數(shù)據(jù)。第二節(jié) while語句例4.5 求s=1 +2 +3+n,當(dāng)加到第幾項(xiàng)時(shí),s的值會(huì)超過1000?程序如下: #include using namespace std;int main () int n=0,s=0; while (s=1000) +n; s+=n; coutn; return 0;第二節(jié) while語句例4.6 求兩個(gè)正整數(shù),的最大公約數(shù)。分析:求兩個(gè)整數(shù)的最大公約數(shù)可以采用輾轉(zhuǎn)相除法。以下是輾轉(zhuǎn)相除法的

9、算法:分別用m,n,r表示被除數(shù)、除數(shù)、余數(shù);1)求m除以n的余數(shù)r;2)當(dāng)r!=0,執(zhí)行第3)步;若r=0,則n為最大公約數(shù),算法結(jié)束。3)將n的值賦給m,將r的值賦給n;再求m除以n的余數(shù)r。4)轉(zhuǎn)到第2)步#include using namespace std;int main () int m,n,r; cinmn; r =m % n; while (r!=0) /也可以使用 while (r),c+中 非0即真 m=n; n=r; r=m % n; cout最大公約數(shù)=n=5的最小n值。分析:此題不等式的左邊是一個(gè)求和的算式,該和式中的數(shù)據(jù)項(xiàng)個(gè)數(shù)是未知的,也正是要求出的。對(duì)于和式中

10、的每個(gè)數(shù)據(jù)項(xiàng),對(duì)應(yīng)的通式為1/i,i=1,2,n。所以可采用循環(huán)累加的方法來計(jì)算出它的值。設(shè)循環(huán)變量為i,它應(yīng)從1開始取值,每次增加1,直到和式的值不小于5為止,此時(shí)的i值就是所求的n。設(shè)累加變量為s,在循環(huán)體內(nèi)把1/i的值累加到s上。根據(jù)以上分析,采用while循環(huán)編寫出程序如下:#include using namespace std;int main () int i=0; float s=0; while(s5) /當(dāng)s的值還未超過5時(shí) +i; s+=1.0/i; couti; return 0;若采用for循環(huán)來寫,則如下所示:#include using namespace std

11、;int main () int i; float s=0; for(i=1;s5;+i) s+=1.0/i; couti-1; return 0;第二節(jié) while語句例4.8 數(shù)據(jù)統(tǒng)計(jì) 輸入一些整數(shù),求出它們的最小值、最大值和平均值(保留3位小數(shù))。輸入保證這些數(shù)都是不超過1000的整數(shù)。 樣例輸入:2 8 3 5 1 7 3 6 樣例輸出:1 8 4.375【參考程序】#includeint main() int x,n=0,min,max,s=0; while (scanf(%d,&x)=1) s+=x; if (xmax) max=x; +n; printf(%d %d %.3lfn

12、,min,max,(double)s/n); return 0;第二節(jié) while語句【優(yōu)化程序】#include#define INF 100000000int main()int x,n=0,min=INF,max=-INF,s=0;while (scanf(%d,&x)=1) /scanf(%d,&x)!=EOF,如果沒數(shù)據(jù)可讀,scanf返回EOF s+=x; if (xmax) max=x; +n;printf(%d %d %.3lfn,min,max,(double)s/n);return 0;第二節(jié) while語句 最后,我們來更仔細(xì)地研究一下輸入輸出。研究對(duì)象就是經(jīng)典的“A+B

13、”問題:輸入若干對(duì)整數(shù),輸出每對(duì)之和。假設(shè)每個(gè)整數(shù)不超過109,一共不超過106個(gè)數(shù)對(duì)。 第1種方法是: #include int main() int a,b; while(scanf(%d%d,&a,&b)=2) printf(%dn,a+b); return 0; 第2種方法也許更加常用(你再也不用記住%d、%lf等惱人的占位符了): #include using namespace std; int main() int a,b; while(cin a b ) cout a+b endl; return 0; 【上機(jī)練習(xí)4.2】1、用while循環(huán)完成如下3題:求s=1+2+3+4+

14、10求s=1+1/2+1/3+1/100計(jì)算n!,其中n由鍵盤輸入。2、輸入任意的自然數(shù)A,B,求A,B的最小公倍數(shù)。3、小球從100高處自由落下,著地后又彈回高度的一半再落下。求第20次著地時(shí),小球共通過多少路程?4、Faibonacci數(shù)列前幾項(xiàng)為:0,1,1,2,3,5,8,其規(guī)律是從第三項(xiàng)起,每項(xiàng)均等于前兩項(xiàng)之和。求前30項(xiàng),并以每行5個(gè)數(shù)的格式輸出。第三節(jié) do-while語句一、語句格式格式1說明:語句1是do-while的循環(huán)體。格式2說明:循環(huán)體部分由多個(gè)語句構(gòu)成,應(yīng)由一對(duì)花括號(hào)括起來,構(gòu)成一個(gè)語句塊的形式。二、語句執(zhí)行過程(1)執(zhí)行一遍循環(huán)體。(2)求出作為循環(huán)條件的“條件表

15、達(dá)式”的值,若為邏輯值真則自動(dòng)轉(zhuǎn)向第(1)步,否則結(jié)束do循環(huán)的執(zhí)行過程,繼續(xù)執(zhí)行其后面的語句。在do語句的循環(huán)體中也可以使用break語句,用它來非正常結(jié)束循環(huán)的執(zhí)行。第三節(jié) do-while語句三、實(shí)例例4.9 對(duì)于求兩個(gè)正整數(shù),的最大公約數(shù)可以用dowhile實(shí)現(xiàn)。代碼如下,請(qǐng)完善: #include using namespace std;int main () int m,n,r; cinmn; do /輾轉(zhuǎn)相除法 r =m % n; m=_; n=_; while ( _ ); coutthe greatest common divisor is:_; return 0;第三節(jié) d

16、o-while語句例4.10 求1992個(gè)1992的乘積的末兩位數(shù)是多少?【分析】積的個(gè)位與十位數(shù)只與被乘數(shù)與乘數(shù)的個(gè)位與十位數(shù)字有關(guān),所以本題相當(dāng)于求1992個(gè)92相乘,而且本次的乘積是下一次相乘的被乘數(shù),因此也只需取末兩位參與運(yùn)算就可以了。 #includeusing namespace std;int main() int a=1,t=0; do +t; a=(a*92)%100; while (t!=1992); coutaendl; return 0;第三節(jié) do-while語句例4.11 校體操隊(duì)到操場(chǎng)集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分別按每行排4,5,

17、6人,都多出1人;當(dāng)排成每行7人時(shí),正好不多。求校體操隊(duì)至少多少人?【分析】設(shè)校體操隊(duì)為x人,根據(jù)題意x應(yīng)是7的倍數(shù),因此x的初值為7,以后用x+=7)改變x值; 為了控制循環(huán), 用邏輯變量yes為真(true) 使循環(huán)結(jié)束; 如果諸條件中有一個(gè)不滿足, yes 的值就會(huì)為假(false),就繼續(xù)循環(huán)。 #includeusing namespace std;int main() bool yes; int x=0; do yes=true; x+=7; if (x%2!=1) yes=false; if (x%3!=1) yes=false; if (x%4!=1) yes=false; i

18、f (x%5!=1) yes=false; if (x%6!=1) yes=false; while (yes=false); /直到y(tǒng)es的值為真 coutAll=x; return 0;程序中對(duì)每個(gè)x值,都先給yes 賦真值,只有在循環(huán)體各句對(duì)x進(jìn)行判斷時(shí),都得到“通過”(此處不賦假值)才能保持真值?!旧蠙C(jī)練習(xí)4.3】1、用do-while循環(huán)完成如下3題:求s=1+2+3+4+10求s=1+1/2+1/3+1/100計(jì)算n!,其中n由鍵盤輸入。2、讀一組實(shí)數(shù),遇零終止,打印其中正、負(fù)數(shù)的個(gè)數(shù)及各自的總和。3、用輾轉(zhuǎn)相除法求兩個(gè)自然數(shù)的最大公約數(shù)。4、找出被2、3、5除時(shí)余數(shù)為1的最小的十

19、個(gè)數(shù)。5、將一根長(zhǎng)為369cm的鋼管截成長(zhǎng)為69cm和39cm兩種規(guī)格的短料。在這兩種規(guī)格的短料至少各截一根的前提下, 如何截才能余料最少?第四節(jié) 循環(huán)嵌套 例4.12 求 S=1!+2!+3!+.+10! 分析:這個(gè)問題是求10以內(nèi)自然數(shù)的階乘之和,可以用for循環(huán)來實(shí)現(xiàn)。程序結(jié)構(gòu)如下: for(i=1;i=10;+i) (1)i階乘的值存到t; /t=i! (2)累加t到s中; /s+=t 顯然根據(jù)以上結(jié)構(gòu),通過10次的循環(huán)可以求出1!,2!,10!,并不斷累加起來,求出s。而求t=i!,又可以用一個(gè)for循環(huán)來實(shí)現(xiàn): t=1; for (j=1;j=i;+j) t*=j; 因此整個(gè)程序?yàn)?/p>

20、:#include using namespace std;int main () int t,s; s=0; for(int i=1;i=10;+i) t=1; for (int j=1;j=i;+j) /求i! t*=j; s+=t; /累加i! couts; return 0;以上程序是一個(gè)for循環(huán)的嵌套。這種方法是比較容易想到的,但實(shí)際上對(duì)于求i!,我們可以根據(jù)求出的(i-1)!乘上i即可得到,而無需重新從1再累乘到i。第四節(jié) 循環(huán)嵌套第四節(jié) 循環(huán)嵌套因此程序可改為:#include using namespace std;int main () int t=1,s=0; for(i

21、nt i=1;i=10;+i) t*=i; /t為上一個(gè)數(shù)的i-1的階乘值,再乘以i即為i! s+=t; /累加i! couts; return 0;顯然第二個(gè)程序的效率要比第一個(gè)高得多。第一個(gè)程序要進(jìn)行1+2+3+10=55次循環(huán),而第二程序進(jìn)行10次循環(huán)。若題目中求的是1!+2!+ !,則兩個(gè)程序的效率區(qū)別更明顯。第四節(jié) 循環(huán)嵌套例4.13 一個(gè)炊事員上街采購,用500元錢買了90只雞,其中母雞一只15元,公雞一只10元,小雞一只5元,正好把錢買完。問母雞,公雞,小雞各買了多少只?【分析】設(shè)母雞i只,公雞j只,則小雞為90-i-j只,則15*i+ 10* j+(90-i-j)*5=500,

22、顯然一個(gè)方程求兩個(gè)未知數(shù)是不能直接求解。必須組合出所有可能的i,j值,看是否滿足條件。這里i的值可以是0到33,j的值可以0到50。源程序如下:#include using namespace std;int main () int k; for (int i=0;i=33;+i) /枚舉母雞的數(shù)量 for (int j=0;j=50;+j) /枚舉公雞的數(shù)量 k=90-i-j; if (15*i+10*j+k*5=500) cout母雞有i只,公雞有j只,小雞有k只 endl; return 0;第四節(jié) 循環(huán)嵌套例4.14 利用for循環(huán)語句輸出圖4-1中的三角形。*圖4-1#include

23、 using namespace std;int main () for (int i=1; i=5; +i) /控制行數(shù) for (int j=1; j=i; +j) /輸出一行中的*數(shù) cout*; coutendl; /換行 return 0;第四節(jié) 循環(huán)嵌套例4.15 求100999中的水仙花數(shù)。若三位數(shù)ABC,ABC=A3+B3+C3,則稱ABC為水仙花數(shù)。例如153,13+53+33=1+125+27=153,則153是水仙花數(shù)?!痉治觥?根據(jù)題意,采用三重循環(huán)來求解。由于循環(huán)次數(shù)一定,用for循環(huán)最為簡(jiǎn)單。程序如下:#include#include /調(diào)用setw函數(shù)需注明使用該

24、庫using namespace std;int main() for (int a=1; a=9; +a) for (int b=0; b=9; +b) for (int c=0; c=9; +c) if (a*a*a+b*b*b+c*c*c=a*100+b*10+c) coutsetw(6)a*100+b*10+c; /setw函數(shù)控制輸出場(chǎng)寬 return 0;運(yùn)行結(jié)果:153370371407第四節(jié) 循環(huán)嵌套同時(shí)也可以采用一個(gè)for循環(huán)來求解,表面上看好像優(yōu)于三重循環(huán),實(shí)際上卻比上面的程序效率低,請(qǐng)同學(xué)們自己分析。程序如下:#include#includeusing namespace

25、 std;int main() int a,b,c; for (int m=100; m=999; +m) a=m/100; /m的百位 b=(m%100)/10; /m的十位 c=m%10; /m的個(gè)位 if (a*a*a+b*b*b+c*c*c=m) coutsetw(6)m; return 0;第四節(jié) 循環(huán)嵌套例4.16 輸出100200中所有的素?cái)?shù)。分析:我們可對(duì)100-200之間的每一個(gè)整數(shù)進(jìn)行判斷,若它是為素?cái)?shù),則輸出。而對(duì)于任意整數(shù)i,根據(jù)素?cái)?shù)定義,我們從2開始,到sqrt(i),找i的第一個(gè)約數(shù),若找到第一個(gè)約數(shù),則i必然不是素?cái)?shù)。程序如下:#include #include

26、/在Dev C+中可調(diào)用數(shù)學(xué)函數(shù)庫cmathusing namespace std;int main () int x; for (int i=100;i=200;+i) x=2; while(xfloor(sqrt(i) coutit; return 0;第四節(jié) 循環(huán)嵌套例4.17 輸出所有形如aabb的四位完全平方數(shù)(即前兩位數(shù)字相等,后兩位數(shù)字也相等)?!痉治觥糠种Ш脱h(huán)結(jié)合在一起時(shí)威力特別強(qiáng)大:我們枚舉所有可能的aabb,然后判斷它們是否為完全平方數(shù)。注意,a的范圍是19,b可以是0。主程序如下: for (a=1; a=9; a+) for (b=0; b=9; b+) if (aa

27、bb是完全平方數(shù)) printf(%dn,aabb);另一個(gè)思路是枚舉平方根x,參考程序如下:#includeint main()int n=0,hi,lo;for (int x=1 ; ; +x) /可以直接從x=32開始枚舉n=x*x; if (n9999) break; hi = n/100;lo = n%100;if (hi/10 = hi%10 & lo/10 = lo%10) printf(%dn,n);return 0;第四節(jié) 循環(huán)嵌套例4.18 階乘之和 輸入n,計(jì)算S=1! + 2! + 3! + + n!的末6位(不含前導(dǎo)0)。n=106, n!表示前n個(gè)正整數(shù)之積。 樣例

28、輸入:10 樣例輸出:37913【分析】 這個(gè)任務(wù)并不難,引入累加變量S之后,核心算法只有一句話:for (i=1;i=n;i+) S+=i!。不過C+語言并沒有階乘運(yùn)算符,所以這句話只是偽代碼,而不是真正的代碼。事實(shí)上,我們還需要一次循環(huán)來計(jì)算i!:for (j=1;j=i;+j) factorial*=j;。代碼如下:#includeint main()int n,s=0;scanf(%d,&n);for (int i=1;i=n;+i)int factorial=1;for (int j=1;j=i;+j) factorial*=j;s+=factorial;printf(%dn,s%1

29、000000);return 0; 注意累乘器factorial(英文“階乘”的意思)定義在循環(huán)里面。換句話說,每執(zhí)行一次循環(huán)體,都要重新聲明一次factorial,并初始化為1(想一想,為什么不是0)。因?yàn)橹灰?位,所以輸出時(shí)對(duì)106取模。第四節(jié) 循環(huán)嵌套 當(dāng)n=100時(shí),輸出-961703,直覺告訴我們:乘法溢出了。這個(gè)直覺很容易通過“輸出中間變量”法得到驗(yàn)證,但若要解決這個(gè)問題,還需要一點(diǎn)數(shù)學(xué)知識(shí)。試一下n=106時(shí)輸出什么?更會(huì)溢出,但是重點(diǎn)不在這里。事實(shí)上,它的速度太慢!讓我們把程序改成“每步取?!钡男问?,然后加一個(gè)“計(jì)時(shí)器”,看看它到底有多慢。#include#includeint main()const int MOD=1000000;int n,s=0;scanf(%d,&n);for (int i=1;i=n;+i)int fa

溫馨提示

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

評(píng)論

0/150

提交評(píng)論