第五講循環(huán)結(jié)構(gòu)(C++版)_第1頁
第五講循環(huán)結(jié)構(gòu)(C++版)_第2頁
第五講循環(huán)結(jié)構(gòu)(C++版)_第3頁
第五講循環(huán)結(jié)構(gòu)(C++版)_第4頁
第五講循環(huán)結(jié)構(gòu)(C++版)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第三章 循環(huán)結(jié)構(gòu)第一節(jié) for語句第二節(jié) while語句第三節(jié) do-while語句第四節(jié) 循環(huán)嵌套for 語句for(表達(dá)式1、表達(dá)式2、表達(dá)式3) 語句或語句組 for (i=0、i10、i+) cout“welcome ”endl; 求解表達(dá)式1表達(dá)式2語句求解表達(dá)式3For語句的下一語句假真第一節(jié) for語句一、語句格式一、語句格式格式格式1 1說明:語句說明:語句1 1是是forfor循環(huán)語句的循環(huán)體,它將在滿足條件的情況下被重復(fù)執(zhí)行。循環(huán)語句的循環(huán)體,它將在滿足條件的情況下被重復(fù)執(zhí)行。格式格式2 2說明:循環(huán)體部分由多個語句構(gòu)成,應(yīng)由一對花括號括起來,構(gòu)成一個語句塊的說明:循環(huán)體部

2、分由多個語句構(gòu)成,應(yīng)由一對花括號括起來,構(gòu)成一個語句塊的形式程序風(fēng)格提示:寫形式程序風(fēng)格提示:寫for循環(huán)語句時,循環(huán)體的語句相對于循環(huán)語句時,循環(huán)體的語句相對于for縮進(jìn)兩格??s進(jìn)兩格。第一節(jié) for語句 二、語句執(zhí)行過程 for語句的執(zhí)行過程可由以下4步來描述。 (1)執(zhí)行“控制變量初始化語句”,使控制變量獲得一個初值。 (2)判斷控制變量是否滿足“條件表達(dá)式”,若滿足條件則執(zhí)行一遍循環(huán)體,否則結(jié)束整個for語句,繼續(xù)執(zhí)行for循環(huán)下面的句子。 (3)根據(jù)增量表達(dá)式,計(jì)算出控制變量所得到的新值 (4)自動轉(zhuǎn)到第(2)步。第一節(jié) for語句三、語句格式舉例三、語句格式舉例 (1) (1)將控

3、制變量從將控制變量從1 1變到變到100100,增量為,增量為1 1 for(i=1;i=100;+i) for(i=1;i=1;-i) for(i=100;i=1;-i) (3) (3)控制變量從控制變量從7 7變到變到7777,增量為,增量為7 7 for(i=7;i=77;i+=7) for(i=7;i=2 for(int i=20;i=2;i-=2)i-=2) (5) (5)按所示數(shù)列改變控制變量值:按所示數(shù)列改變控制變量值:9999、8888、7777、6666、5555、4444、3333、2222、1111、0 0,增,增量為量為-11-11 for(int j=99;j=0;j

4、-=11) for(int j=99;j=0;j-=11) (6) (6)控制變量控制變量i i和和j j共同進(jìn)行循環(huán)控制,共同進(jìn)行循環(huán)控制,i i從從1 1變到變到9999,j j從從2 2變到變到100100,增量均為,增量均為2 2。 for for(int i=1,j=2;i=99&j=100int i=1,j=2;i=99&j=100;i+=2,j+=2i+=2,j+=2)需要說明的是:可以在需要說明的是:可以在forfor循環(huán)循環(huán)“ 控制變量初始化語句控制變量初始化語句”中聲明變量(如上面最后中聲明變量(如上面最后3 3個例個例子),這些變量只在子),這些變量只在f

5、orfor循環(huán)結(jié)構(gòu)中有效,離開了該循環(huán)結(jié)構(gòu)中有效,離開了該forfor結(jié)構(gòu),變量就無效了。結(jié)構(gòu),變量就無效了。 第一節(jié) for語句例例4.1 4.1 輸出輸出1 1100100之間所有偶數(shù)。之間所有偶數(shù)。#include #include using namespace std;using namespace std;int main ()int main () for (int i=2; i=100 ; i+=2) for (int i=2; i=100 ; i+=2) cout i ; cout i ;return 0;return 0; 例例4.24.2 利用利用forfor循環(huán)循環(huán),

6、,計(jì)算輸出計(jì)算輸出1+2+1+2+100+100的和的和#include using namespace std;#include using namespace std;int main ()int main () int sum=0; int sum=0; for (int i=1; i=100 ; +i) for (int i=1; i=100 ; +i) sum+=i; sum+=i; cout sum;cout sum; return 0; return 0; 循環(huán)語句循環(huán)控制語句包括:循環(huán)語句:for當(dāng)型循環(huán)語句:while直到型循環(huán)語句:do-while循環(huán)語句for 循環(huán)語句f

7、or(另一種當(dāng)型循環(huán))for(初始條件表達(dá)式;循環(huán)控制表達(dá)式;循環(huán)操作表達(dá)式)語句/語句組 一次for循環(huán)執(zhí)行過程 首先執(zhí)行初始條件表達(dá)式(第一次):可以為空 循環(huán)控制表達(dá)式:一定是一個數(shù)值表達(dá)式,也可以為空 如果表達(dá)式值為真,條件成立,執(zhí)行循環(huán)體一次 如果表達(dá)式值為假,條件不成立,退出循環(huán) 如果省略,默認(rèn)值為真,直到遇到break, return語句退出循環(huán) 循環(huán)操作表達(dá)式:也可為空初始條件初始條件表達(dá)式表達(dá)式語句語語句語句組句組循環(huán)操作循環(huán)操作表達(dá)式表達(dá)式循環(huán)控循環(huán)控制表達(dá)制表達(dá)式式循環(huán)語句for循環(huán)語句for 例,計(jì)算從0到100的整數(shù)中有多少個數(shù)是偶數(shù)(包括),奇數(shù)中有多少數(shù)是的倍數(shù)#

8、include using namespace std;int main() int i, n2=0, n3=0; for(i=0; i=100; i+) if (i%2=0) n2+; else if (i%3=0) n3+; coutn2“ ”n3endl; return 0;第一節(jié) for語句例例4.3 4.3 利用利用forfor循環(huán)計(jì)算循環(huán)計(jì)算n n!的值。!的值。分析:分析:n n!1 1* *2 2* *3 3* *n n#include #include using namespace std;using namespace std;int main ()int main ()

9、 long long s; /Noip2010 long long s; /Noip2010開始開始C+C+語言中語言中l(wèi)ong longlong long類型允許使用類型允許使用 int n; /n int n; /n不能定義為不能定義為long longlong long,否則,否則forfor語句死循環(huán)語句死循環(huán) s=1; s=1; cinncinn; ; for (int i=1; i=n ; +i) / for (int i=1; i=n ; +i) /若若s s定義為定義為intint,當(dāng),當(dāng)n=13n=13時時s s的值就溢出了的值就溢出了 s s* *=i;=i; coutsc

10、out=13n=13時,時,s s值超過了值超過了intint類型的表示范圍。還有一種比類型的表示范圍。還有一種比intint更大的類型,稱為更大的類型,稱為long longlong long,它的表,它的表示范圍是示范圍是-2-263632 26363-1-1,比,比-10-10191910101919略窄,而我們一直使用的略窄,而我們一直使用的intint范圍是范圍是-2-231312 23131-1,-1,只比只比-2-2* *10109 92 2* *10109 9略寬。略寬。 輸入輸出輸入輸出long longlong long也可以借助于也可以借助于printfprintf和和s

11、canfscanf語句,但對應(yīng)的占位符卻是和平臺與編譯器相語句,但對應(yīng)的占位符卻是和平臺與編譯器相關(guān)的:在關(guān)的:在linuxlinux中,中,gccgcc很統(tǒng)一的用很統(tǒng)一的用%lld%lld;在;在windowswindows中,中,MinGWMinGW的的gccgcc和和VC6VC6都需要用都需要用%I64d%I64d;但;但VS2008VS2008卻是用卻是用%lld%lld。第一節(jié) for語句例例4.44.4 利用利用forfor循環(huán)循環(huán), ,分別計(jì)算分別計(jì)算1 1100100中奇數(shù)的和、偶數(shù)的和。中奇數(shù)的和、偶數(shù)的和。#include #include using namespace

12、std;using namespace std;int main ( )int main ( ) int jssum=0; int jssum=0; int ossum=0; int ossum=0; for (int js=1,os=2;js=99&os=100;js+=2 ,os+=2 ) for (int js=1,os=2;js=99&os=100;js+=2 ,os+=2 ) jssum+=js; jssum+=js; ossum+=os; ossum+=os; cout the sum of odd numbers 1 to 100 is : jssumendl;

13、cout the sum of odd numbers 1 to 100 is : jssumendl; cout the sum of even numbers 1 to 100 is : ossumendl; cout the sum of even numbers 1 to 100 is : ossumendl; return 0; return 0; 說明:說明: 我們也可以在我們也可以在forfor循環(huán)初始化或增值表達(dá)式部分中放一條以上的語句,中間用逗號隔開。循環(huán)初始化或增值表達(dá)式部分中放一條以上的語句,中間用逗號隔開?!旧蠙C(jī)練習(xí)4.1】 1、求12+22+32+1002 2、求s=

14、1+1/2+1/3+1/100 3、計(jì)算100之內(nèi)所有的奇數(shù)之和。 4、求10個數(shù)中的最大值和最小值。 5、按字母表的順序,從字母A到Z順序打印輸出。 6、求菲波拉契數(shù)列a0,a1,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 1 說明:循環(huán)體部分由多個語句構(gòu)成,應(yīng)由一對花括號括起來,構(gòu)成一個語句塊的形式。說明:循環(huán)體部分由多個語句構(gòu)成,應(yīng)由一對花括號括起來,構(gòu)成一個語句塊的形式。程序風(fēng)格提示:寫程序風(fēng)格提示:寫whilewhile循環(huán)語句時

15、,循環(huán)體的語句相對于循環(huán)語句時,循環(huán)體的語句相對于whilewhile縮進(jìn)兩格??s進(jìn)兩格。說明:語句說明:語句1是是while循環(huán)語句的循環(huán)體,它將在滿足條件的情況下被重復(fù)執(zhí)行。循環(huán)語句的循環(huán)體,它將在滿足條件的情況下被重復(fù)執(zhí)行。格式格式2循環(huán)語句while 循環(huán)語句while(當(dāng)型循環(huán))while(表達(dá)式)語句/語句組 表達(dá)式必須是數(shù)值表達(dá)式 一次循環(huán) 計(jì)算表達(dá)式的值 如果表達(dá)式值為真,執(zhí)行循環(huán)體,為假退出循環(huán)表達(dá)式表達(dá)式語句語句/語語句組句組第二節(jié) while語句二、語句執(zhí)行過程二、語句執(zhí)行過程(1)(1)計(jì)算作為循環(huán)控制條件表達(dá)式的值,得到邏輯真或假,假定用計(jì)算作為循環(huán)控制條件表達(dá)式的值

16、,得到邏輯真或假,假定用M M表示。表示。(2)(2)若若M M為真,則執(zhí)行了一遍循環(huán)體,否則離開循環(huán),結(jié)束整個為真,則執(zhí)行了一遍循環(huán)體,否則離開循環(huán),結(jié)束整個whilewhile語句的執(zhí)行。語句的執(zhí)行。(3)(3)循環(huán)體的所有語句執(zhí)行結(jié)束后,自動轉(zhuǎn)向第循環(huán)體的所有語句執(zhí)行結(jié)束后,自動轉(zhuǎn)向第(1)(1)步執(zhí)行。步執(zhí)行。三、格式舉例三、格式舉例(1) i=0;(1) i=0; while (i10) while (ix;(2) cinx; while while(x0 xx; cinx;功能:當(dāng)輸入的數(shù)據(jù)小于功能:當(dāng)輸入的數(shù)據(jù)小于0 0時,重復(fù)讀數(shù)據(jù)。時,重復(fù)讀數(shù)據(jù)。循環(huán)語句while計(jì)算從1到

17、100的所有整數(shù)的平方和#include using namespace std;int main() int i=100; int sum=0; while(i0) sum = sum+i*i; i-; printf(“sum=%dn”, sum); return 0;循環(huán)語句while第二節(jié) while語句例例4.5 4.5 求求s=1 +2 +3s=1 +2 +3+n+n,當(dāng)加到第幾項(xiàng)時,當(dāng)加到第幾項(xiàng)時,s s的值會超過的值會超過10001000?程序如下:程序如下: #include #include using namespace std;using namespace std;in

18、t main ()int main () int n=0,s=0; int n=0,s=0; while (s=1000) while (s=1000) +n; +n; s+=n; s+=n; coutn; coutn; return 0; return 0; 第二節(jié) while語句例例4.6 4.6 求兩個正整數(shù),的最大公約數(shù)。求兩個正整數(shù),的最大公約數(shù)。分析:求兩個整數(shù)的最大公約數(shù)可以采用輾轉(zhuǎn)相除法。以下是輾轉(zhuǎn)相除法的算法:分別用分析:求兩個整數(shù)的最大公約數(shù)可以采用輾轉(zhuǎn)相除法。以下是輾轉(zhuǎn)相除法的算法:分別用m m,n n,r r表示被除數(shù)、除數(shù)、余數(shù);表示被除數(shù)、除數(shù)、余數(shù);1)1)求求m

19、 m除以除以n n的余數(shù)的余數(shù)r r;2)2)當(dāng)當(dāng)r!=0,r!=0,執(zhí)行第執(zhí)行第3)3)步;若步;若r=0r=0,則,則n n為最大公約數(shù)為最大公約數(shù), ,算法結(jié)束。算法結(jié)束。3)3)將將n n的值賦給的值賦給m m,將,將r r的值賦給的值賦給n n;再求;再求m m除以除以n n的余數(shù)的余數(shù)r r。4)4)轉(zhuǎn)到第轉(zhuǎn)到第2)2)步步#include #include using namespace std;using namespace std;int main ()int main () int m,n,r; int m,n,r; cinmn; cinmn; r =m % n; r =m

20、 % n; while (r!=0) / while (r!=0) /也可以使用也可以使用 while (r),c+ while (r),c+中中 非非0 0即真即真 m=n; m=n; n=r; n=r; r=m % n; r=m % n; cout cout最大公約數(shù)最大公約數(shù)=nendl;=n=5+1/n =5的最小的最小n n值。值。分析:此題不等式的左邊是一個求和的算式,該和式中的數(shù)據(jù)項(xiàng)個數(shù)是未知的,也正是要分析:此題不等式的左邊是一個求和的算式,該和式中的數(shù)據(jù)項(xiàng)個數(shù)是未知的,也正是要求出的。對于和式中的每個數(shù)據(jù)項(xiàng),對應(yīng)的通式為求出的。對于和式中的每個數(shù)據(jù)項(xiàng),對應(yīng)的通式為1/i1/i

21、,i=1i=1,2 2,n n。所以可采用循環(huán)累加的方法來計(jì)算出它的值。設(shè)循環(huán)變量為所以可采用循環(huán)累加的方法來計(jì)算出它的值。設(shè)循環(huán)變量為i i,它應(yīng)從,它應(yīng)從1 1開始取值,每次增開始取值,每次增加加1 1,直到和式的值不小于,直到和式的值不小于5 5為止,此時的為止,此時的i i值就是所求的值就是所求的n n。設(shè)累加變量為。設(shè)累加變量為s s,在循環(huán)體內(nèi),在循環(huán)體內(nèi)把把1/i1/i的值累加到的值累加到s s上。上。根據(jù)以上分析,采用根據(jù)以上分析,采用whilewhile循環(huán)編寫出程序如下:循環(huán)編寫出程序如下:#include #include using namespace std;usin

22、g namespace std;int main ()int main () int i=0; int i=0; float s=0; float s=0; while(s5) / while(s5) /當(dāng)當(dāng)s s的值還未超過的值還未超過5 5時時 +i; +i; s+=1.0/i; s+=1.0/i; couti; couti; return 0; return 0; 若采用若采用forfor循環(huán)來寫,則如下所示:循環(huán)來寫,則如下所示:#include #include using namespace std;using namespace std;int main ()int main (

23、) int i; int i; float s=0; float s=0; for(i=1;s5;+i) for(i=1;s5;+i) s+=1.0/i; s+=1.0/i; couti-1; couti-1; return 0; return 0; 第二節(jié) while語句例例4.84.8 數(shù)據(jù)統(tǒng)計(jì)數(shù)據(jù)統(tǒng)計(jì) 輸入一些整數(shù),求出它們的最小值、最大值和平均值(保留輸入一些整數(shù),求出它們的最小值、最大值和平均值(保留3 3位小數(shù))。輸入保證這位小數(shù))。輸入保證這些數(shù)都是不超過些數(shù)都是不超過10001000的整數(shù)。的整數(shù)。 樣例輸入:樣例輸入:2 8 3 5 1 7 3 62 8 3 5 1 7 3

24、6 樣例輸出:樣例輸出:1 8 4.3751 8 4.375【參考程序】【參考程序】#include#includeint main()int main() int x,n=0,min,max,s=0; int x,n=0,min,max,s=0; while (scanf(“%d”,&x)= =1) while (scanf(“%d”,&x)= =1) /當(dāng)有輸入的時候,表達(dá)式為真,即當(dāng)有輸入的時候,表達(dá)式為真,即= =1= =1,執(zhí)行循環(huán),執(zhí)行循環(huán) s+=x; s+=x; if (xmin) min=x; if (xmax) max=x; if (xmax) max=x;

25、+n; +n; printf(%d %d %.3lfn,min,max,(double)s/n); printf(%d %d %.3lfn,min,max,(double)s/n); return 0; return 0; 第二節(jié) while語句 最后,我們來更仔細(xì)地研究一下輸最后,我們來更仔細(xì)地研究一下輸入輸出。研究對象就是經(jīng)典的入輸出。研究對象就是經(jīng)典的“A+B”“A+B”問問題:輸入若干對整數(shù),輸出每對之和。假題:輸入若干對整數(shù),輸出每對之和。假設(shè)每個整數(shù)不超過設(shè)每個整數(shù)不超過10109 9,一共不超過,一共不超過10106 6個個數(shù)對。數(shù)對。 第第1 1種方法是:種方法是: #incl

26、ude #include int main() int main() int a,b; int a,b; while(scanf(%d%d,&a,&b)=2) while(scanf(%d%d,&a,&b)=2) printf(%dn,a+b); printf(%dn,a+b); return 0; return 0; 第第2 2種方法也許更加常用(你再也不種方法也許更加常用(你再也不用記住用記住%d%d、%lf%lf等惱人的占位符了):等惱人的占位符了): #include #include using namespace std; using namespa

27、ce std; int main() int main() int a,b; int a,b; while(cin a b ) while(cin a b ) cout a+b endl; cout a+b endl; return 0; return 0; 課堂練習(xí) 以下的 for 循環(huán)( )。 for(x=0,y=0;(y!=123)&(x0); a的值是( )。A. 5B. 0C. 1D. -2BC【上機(jī)練習(xí)4.2】 1、用while循環(huán)完成如下3題: 求s=1+2+3+4+10 求s=1+1/2+1/3+1/100 計(jì)算n!,其中n由鍵盤輸入。 2、輸入任意的自然數(shù)A, B,

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

29、程二、語句執(zhí)行過程(1)(1)執(zhí)行一遍循環(huán)體。執(zhí)行一遍循環(huán)體。(2)(2)求出作為循環(huán)條件的求出作為循環(huán)條件的“條件表達(dá)式條件表達(dá)式”的值,若為邏輯值真則自動轉(zhuǎn)向第的值,若為邏輯值真則自動轉(zhuǎn)向第(1)(1)步,否則結(jié)束步,否則結(jié)束dodo循環(huán)的執(zhí)循環(huán)的執(zhí)行過程,繼續(xù)執(zhí)行其后面的語句。行過程,繼續(xù)執(zhí)行其后面的語句。在在dodo語句的循環(huán)體中也可以使用語句的循環(huán)體中也可以使用breakbreak語句,用它來非正常結(jié)束循環(huán)的執(zhí)行。語句,用它來非正常結(jié)束循環(huán)的執(zhí)行。循環(huán)語句do-while 循環(huán)語句do-while(直到型循環(huán))do 語句/語句組while(表達(dá)式); 一次循環(huán) 執(zhí)行一次循環(huán)體 計(jì)算表

30、達(dá)式,條件成立再執(zhí)行一次循環(huán)體,否則退出循環(huán)語句語句/語句語句組組表達(dá)式表達(dá)式循環(huán)語句do-while循環(huán)語句do-while計(jì)算從1到100的所有整數(shù)的平方和#include using namespace std;int main() int i=100; int sum=0; do sum = sum+i*i; i-; while (i0); coutsumendl; return 0;第三節(jié) do-while語句三、實(shí)例三、實(shí)例例例4.9 4.9 對于求兩個正整數(shù),的最大公約數(shù)可以用對于求兩個正整數(shù),的最大公約數(shù)可以用dodowhilewhile實(shí)現(xiàn)。實(shí)現(xiàn)。代碼如下,請完善:代碼如下,

31、請完善: #include #include using namespace std;using namespace std;int main ()int main () int m int m,n n,r;r; cinmn; cinmn; do / do /輾轉(zhuǎn)相除法輾轉(zhuǎn)相除法 r =m % n; r =m % n; m=_; m=_; n=_; n=_; while ( _ ); while ( _ ); coutthe greatest common divisor is:_; coutthe greatest common divisor is:_; return 0; return

32、0; 第三節(jié) do-while語句例例4.104.10 求求19921992個個19921992的乘積的末兩位數(shù)是多少?的乘積的末兩位數(shù)是多少?【分析】積的個位與十位數(shù)只與被乘數(shù)與乘數(shù)的個位與十位數(shù)字有關(guān),所以本題相當(dāng)于求【分析】積的個位與十位數(shù)只與被乘數(shù)與乘數(shù)的個位與十位數(shù)字有關(guān),所以本題相當(dāng)于求19921992個個9292相乘,而且本次的乘積是下一次相乘的被乘數(shù),因此也只需取末兩位參與運(yùn)算就相乘,而且本次的乘積是下一次相乘的被乘數(shù),因此也只需取末兩位參與運(yùn)算就可以了??梢粤?。 #include#includeusing namespace std;using namespace std;i

33、nt main()int main() int a=1,t=0; int a=1,t=0; do do +t; +t; a=(a a=(a* *92)%100;92)%100; while (t!=1992); while (t!=1992); coutaendl; coutaendl; return 0; return 0; 第三節(jié) do-while語句例例4.11 4.11 校體操隊(duì)到操場集合校體操隊(duì)到操場集合, ,排成每行排成每行2 2人人, ,最后多出最后多出1 1人人; ;排成每行排成每行3 3人人, ,也多出也多出1 1人人; ;分別按每行排分別按每行排4,5,64,5,6人人,

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

35、環(huán)。,就繼續(xù)循環(huán)。 #include#includeusing namespace std;using namespace std;int main()int main() bool yes; bool yes; int x=0; int x=0; do do yes=true; yes=true; x+=7; x+=7; if (x%2!=1) yes=false; if (x%2!=1) yes=false; if (x%3!=1) yes=false; if (x%3!=1) yes=false; if (x%4!=1) yes=false; if (x%4!=1) yes=false;

36、 if (x%5!=1) yes=false; if (x%5!=1) yes=false; if (x%6!=1) yes=false; if (x%6!=1) yes=false; while (yes=false); / while (yes=false); /直到直到y(tǒng)esyes的值為真的值為真 coutAll=x; coutAll=x; return 0; return 0; 程序中對每個程序中對每個x x值,都先給值,都先給yes yes 賦真值,只有在循環(huán)體各句對賦真值,只有在循環(huán)體各句對x x進(jìn)行判斷時,都得到進(jìn)行判斷時,都得到“通過通過”(此處不(此處不賦假值)才能保持真值。

37、賦假值)才能保持真值?!旧蠙C(jī)練習(xí)4.3】1 1、用、用do-whiledo-while循環(huán)完成如下循環(huán)完成如下3 3題:題:求求s=1+2+3+4+s=1+2+3+4+10+10求求s=1+1/2+1/3+s=1+1/2+1/3+1/100+1/100計(jì)算計(jì)算n n!,其中!,其中n n由鍵盤輸入。由鍵盤輸入。2 2、讀一組實(shí)數(shù)、讀一組實(shí)數(shù), ,遇零終止遇零終止, ,打印其中正、負(fù)數(shù)的個數(shù)及各自的總和。打印其中正、負(fù)數(shù)的個數(shù)及各自的總和。3 3、用輾轉(zhuǎn)相除法求兩個自然數(shù)的最大公約數(shù)。、用輾轉(zhuǎn)相除法求兩個自然數(shù)的最大公約數(shù)。4 4、找出被、找出被2 2、3 3、5 5除時余數(shù)為除時余數(shù)為1 1的

38、最小的十個數(shù)。的最小的十個數(shù)。5 5、將一根長為、將一根長為369cm369cm的鋼管截成長為的鋼管截成長為69cm69cm和和39cm39cm兩種規(guī)格的短料。在這兩種規(guī)兩種規(guī)格的短料。在這兩種規(guī)格的短料至少各截一根的前提下格的短料至少各截一根的前提下, , 如何截才能余料最少?如何截才能余料最少?第四節(jié) 循環(huán)嵌套 例例4.12 4.12 求求 S=1!+2!+3!+.+10! S=1!+2!+3!+.+10! 分析:這個問題是求分析:這個問題是求1010以內(nèi)自然數(shù)的階乘之和,可以用以內(nèi)自然數(shù)的階乘之和,可以用forfor循環(huán)來實(shí)現(xiàn)。程循環(huán)來實(shí)現(xiàn)。程序結(jié)構(gòu)如下:序結(jié)構(gòu)如下: for(i=1;i

39、=10;+i) for(i=1;i=10;+i) (1)i (1)i階乘的值存到階乘的值存到t t; /t=i! /t=i! (2) (2)累加累加t t到到s s中;中; /s+=t /s+=t 顯然根據(jù)以上結(jié)構(gòu),通過顯然根據(jù)以上結(jié)構(gòu),通過1010次的循環(huán)可以求出次的循環(huán)可以求出1 1!,!,2 2!,!,10!,10!,并不斷累并不斷累加起來,求出加起來,求出s s。而求。而求t=i!,t=i!,又可以用一個又可以用一個forfor循環(huán)來實(shí)現(xiàn):循環(huán)來實(shí)現(xiàn): t=1; t=1; for (j=1;j=i;+j) for (j=1;j=i;+j) t t* *=j;=j; 因此整個程序?yàn)椋阂虼?/p>

40、整個程序?yàn)椋?include #include using namespace std;using namespace std;int main ()int main () int t,s; int t,s; s=0; s=0; for(int i=1;i=10;+i) for(int i=1;i=10;+i) t=1; t=1; for (int j=1;j=i;+j) / for (int j=1;j=i;+j) /求求i!i! t t* *=j;=j; s+=t; / s+=t; /累加累加i!i! couts; couts; return 0; return 0; 以上程序是一個以上程

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

42、+i) for(int i=1;i=10;+i) t t* *=i; /t=i; /t為上一個數(shù)的為上一個數(shù)的i-1i-1的階乘值,再乘的階乘值,再乘以以i i即為即為i!i! s+=t; / s+=t; /累加累加i!i! couts; couts; return 0; return 0; 顯然第二個程序的效率要比第一個高得多。第一個程序要進(jìn)行顯然第二個程序的效率要比第一個高得多。第一個程序要進(jìn)行1+2+3+10=551+2+3+10=55次循環(huán),而第二程序進(jìn)行次循環(huán),而第二程序進(jìn)行1010次循環(huán)。若題目中求的是次循環(huán)。若題目中求的是1 1!+2+2!+1000+1000!,則兩!,則兩個程

43、序的效率區(qū)別更明顯。個程序的效率區(qū)別更明顯。第四節(jié) 循環(huán)嵌套例例4.13 4.13 一個炊事員上街采購,用一個炊事員上街采購,用500500元錢買了元錢買了9090只雞,其中母雞一只只雞,其中母雞一只1515元元, ,公雞一只公雞一只1010元,元,小雞一只小雞一只5 5元,正好把錢買完。問母雞,公雞,小雞各買了多少只?元,正好把錢買完。問母雞,公雞,小雞各買了多少只?【分析】設(shè)母雞【分析】設(shè)母雞i i只只, ,公雞公雞j j只只, ,則小雞為則小雞為90-i-j90-i-j只只, ,則則1515* *i+ 10i+ 10* * j+(90-i-j) j+(90-i-j)* *5=500,5=

44、500,顯然一顯然一個方程求兩個未知數(shù)是不能直接求解。必須組合出所有可能的個方程求兩個未知數(shù)是不能直接求解。必須組合出所有可能的i,ji,j值,看是否滿足條件。值,看是否滿足條件。這里這里i i的值可以是的值可以是0 0到到3333,j j的值可以的值可以0 0到到5050。源程序如下:。源程序如下:#include #include using namespace std;using namespace std;int main ()int main () int k; int k; for (int i=0;i=33;+i) for (int i=0;i=33;+i) / /枚舉母雞的數(shù)量

45、枚舉母雞的數(shù)量 for (int j=0;j=50;+j) / for (int j=0;j=50;+j) /枚舉公雞的數(shù)量枚舉公雞的數(shù)量 k=90-i-j; k=90-i-j; if (15 if (15* *i+10i+10* *j+kj+k* *5=500)5=500) cout cout母雞有母雞有ii只只,公雞有公雞有jj只只,小雞有小雞有kk只只 endl; endl; return 0; return 0; 第四節(jié) 循環(huán)嵌套例例4.14 4.14 利用利用forfor循環(huán)語句輸出圖循環(huán)語句輸出圖4-4-1 1中的三角形。中的三角形。*圖圖4-1#include #include

46、using namespace std;using namespace std;int main ()int main () for (int i=1; i=5; +i) / for (int i=1; i=5; +i) /控制行數(shù)控制行數(shù) for (int j=1; j=i; +j) / for (int j=1; j=i; +j) /輸出一行中的輸出一行中的* *數(shù)數(shù) cout cout* *; coutendl; / coutendl; /換行換行 return 0; return 0; 第四節(jié) 循環(huán)嵌套例例4.15 4.15 求求100100999999中的水仙花數(shù)。若三位數(shù)中的水仙花

47、數(shù)。若三位數(shù)ABCABC,ABC=AABC=A3 3+B+B3 3+C+C3 3,則稱,則稱ABCABC為水仙花數(shù)。為水仙花數(shù)。例如例如153153,1 13 3+5+53 3+3+33 3=1+125+27=153=1+125+27=153,則,則153153是水仙花數(shù)。是水仙花數(shù)?!痉治觥俊痉治觥?根據(jù)題意,采用三重循環(huán)來求解。由于循環(huán)次數(shù)一定,用根據(jù)題意,采用三重循環(huán)來求解。由于循環(huán)次數(shù)一定,用forfor循環(huán)最為簡單。程循環(huán)最為簡單。程序如下:序如下:#include#include#include /#include /調(diào)用調(diào)用setw函數(shù)需注明使用該庫函數(shù)需注明使用該庫using

48、namespace std;using namespace std;int main()int main() for (int a=1; a=9; +a) for (int a=1; a=9; +a) for (int b=0; b=9; +b) for (int b=0; b=9; +b) for (int c=0; c=9; +c) for (int c=0; c=9; +c) if (a if (a* *a a* *a+ba+b* *b b* *b+cb+c* *c c* *c=ac=a* *100+b100+b* *10+c) 10+c) coutsetw(6)a coutsetw(6

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

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

51、mathusing 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.174.17 輸出所有形如輸出所有形如aabbaabb的四位完全平方數(shù)(即前兩位數(shù)字相等,后兩位數(shù)字也相等)。的四位完全平方數(shù)(即前兩位數(shù)字相等,后兩位數(shù)字也相等)。【分析】【分析】分支和循環(huán)結(jié)合在一起時威力特別強(qiáng)大:我們枚舉所有可能的分支和循環(huán)結(jié)合在一起時威力特別強(qiáng)大:我們枚舉所有可能的aabbaabb,然后判斷它們是否為完全平方數(shù)。,然后判斷它們是

52、否為完全平方數(shù)。注意,注意,a a的范圍是的范圍是1 19 9,b b可以是可以是0 0。主程序如下:。主程序如下: for (a=1; a=9; a+) for (a=1; a=9; a+) for (b=0; b=9; b+) for (b=0; b=9; b+) if (aabb if (aabb是完全平方數(shù)是完全平方數(shù)) printf(%dn,aabb);) printf(%dn,aabb);另一個思路是枚舉平方根另一個思路是枚舉平方根x x,參考程序如下:,參考程序如下:#include#includeint main()int main() int n=0,hi,lo;int n=

53、0,hi,lo;for (int x=1 ; ; +x) /for (int x=1 ; ; +x) /可以直接從可以直接從x=32x=32開始枚舉開始枚舉 n=xn=x* *x;x; if (n1000) continue;if (n9999) break;if (n9999) break; hi = n/100;hi = n/100;lo = n%100;lo = n%100;if (hi/10 = hi%10 & lo/10 = lo%10) printf(%dn,n);if (hi/10 = hi%10 & lo/10 = lo%10) printf(%dn,n); r

54、eturn 0;return 0; 第四節(jié) 循環(huán)嵌套例例4.18 4.18 階乘之和階乘之和 輸入輸入n n,計(jì)算,計(jì)算S=1! + 2! + 3! + S=1! + 2! + 3! + + n! + n!的末的末6 6位位( (不含前導(dǎo)不含前導(dǎo)0)0)。n=10n=106 6, n! n!表示前表示前n n個正整數(shù)之積。個正整數(shù)之積。 樣例輸入:樣例輸入:1010 樣例輸出:樣例輸出:3791337913【分析】【分析】 這個任務(wù)并不難,引入累加變量這個任務(wù)并不難,引入累加變量S S之后,核心算法只有一句話:之后,核心算法只有一句話:for (i=1;i=n;i+) S+=i!for (i=

55、1;i=n;i+) S+=i!。不過。不過C+C+語言并沒有階乘運(yùn)算符,所以這句話只是偽代碼,而不是真正的代碼。事實(shí)上,我們還需要一次循語言并沒有階乘運(yùn)算符,所以這句話只是偽代碼,而不是真正的代碼。事實(shí)上,我們還需要一次循環(huán)來計(jì)算環(huán)來計(jì)算i!i!:for (j=1;j=i;+j) factorialfor (j=1;j=i;+j) factorial* *=j;=j;。代碼如下:。代碼如下:#include#includeint main()int main() int n,s=0;int n,s=0;scanf(%d,&n);scanf(%d,&n);for (int i=1

56、;i=n;+i)for (int i=1;i=n;+i) int factorial=1;int factorial=1;for (int j=1;j=i;+j)for (int j=1;j=i;+j) factorial factorial* *=j;=j;s+=factorial;s+=factorial; printf(%dn,s%1000000);printf(%dn,s%1000000);return 0;return 0; 注意累乘器注意累乘器factorial(factorial(英文英文“階乘階乘”的意思的意思) )定義在循環(huán)里面。換句話說,每執(zhí)行一次循環(huán)體,都定義在循環(huán)里面。

57、換句話說,每執(zhí)行一次循環(huán)體,都要重新聲明一次要重新聲明一次factorialfactorial,并初始化為,并初始化為1(1(想一想,為什么不是想一想,為什么不是0)0)。因?yàn)橹灰R驗(yàn)橹灰? 6位,所以輸出時對位,所以輸出時對10106 6取模。取模。第四節(jié) 循環(huán)嵌套 當(dāng)當(dāng)n=100n=100時,輸出時,輸出-961703-961703,直覺告訴我們:乘法溢出了。這個直覺很容易通過,直覺告訴我們:乘法溢出了。這個直覺很容易通過“輸出中間變量輸出中間變量”法得到驗(yàn)證,但若要解決這個問題,還需要一點(diǎn)數(shù)學(xué)知識。試一下法得到驗(yàn)證,但若要解決這個問題,還需要一點(diǎn)數(shù)學(xué)知識。試一下n=10n=106

58、6時輸出什么?更會溢出,但是時輸出什么?更會溢出,但是重點(diǎn)不在這里。事實(shí)上,它的速度太慢!讓我們把程序改成重點(diǎn)不在這里。事實(shí)上,它的速度太慢!讓我們把程序改成“每步取模每步取?!钡男问?,然后加一個的形式,然后加一個“計(jì)時計(jì)時器器”,看看它到底有多慢,看看它到底有多慢。#include#include#include#includeint main()int main() const int MOD=1000000;const int MOD=1000000;int n,s=0;int n,s=0;scanf(%d,&n);scanf(%d,&n);for (int i=1;i=n;+i)for (int i=1;i=n;+i) int factorial=1;int factorial=1;for (

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論