第六章循環(huán)控制_第1頁
第六章循環(huán)控制_第2頁
第六章循環(huán)控制_第3頁
第六章循環(huán)控制_第4頁
第六章循環(huán)控制_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第六章循環(huán)控制通過本章實(shí)驗(yàn)作業(yè)應(yīng)達(dá)目標(biāo)1熟悉while、for、do_while、break、continue語句的作用與使用規(guī)范。2學(xué)習(xí)并掌握利用while語句、for語句、do_while語句實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。3掌握循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)之間嵌套、多重循環(huán)間嵌套的設(shè)計(jì)方法。4進(jìn)行算法設(shè)計(jì)訓(xùn)練,能綜合所學(xué)控制結(jié)構(gòu)語句解決一般問題。本章上交作業(yè)程序6_1.c、6_2.c、6_5.c、6_6.c上傳至21/casp。循環(huán)程序設(shè)計(jì)計(jì)算機(jī)解決問題都是按指定的順序執(zhí)行一系列的動(dòng)作。按照特定的順序執(zhí)行相應(yīng)的動(dòng)作來求解問題的過程稱為算法。程序中的語句是算法的體現(xiàn),而算法要解決的是“做什么”

2、和“怎么做”的問題。計(jì)算機(jī)程序中指定語句的執(zhí)行順序稱為“程序控制”。結(jié)構(gòu)化的程序控制包含三種基本結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。1. 循環(huán)設(shè)計(jì)循環(huán)是在循環(huán)條件為真時(shí)反復(fù)執(zhí)行的一組計(jì)算機(jī)指令,是計(jì)算機(jī)解題的一個(gè)重要結(jié)構(gòu)。循環(huán)控制有兩種基本方法:計(jì)數(shù)法和標(biāo)志法。1)計(jì)數(shù)器控制的循環(huán)事先準(zhǔn)確地知道循環(huán)次數(shù),因此設(shè)計(jì)一個(gè)循環(huán)控制變量,由變量值來控制循環(huán)次數(shù)。每循環(huán)一次,循環(huán)變量的值會(huì)遞增(增值通常為1或-1),當(dāng)其值達(dá)到終值時(shí)結(jié)束循環(huán)。教材例6.2、6.3、6.7都是典型的計(jì)數(shù)器控制的固定次數(shù)次數(shù)循環(huán)。2)標(biāo)志控制的循環(huán)事先不知道準(zhǔn)確的循環(huán)次數(shù),由某一目標(biāo)值標(biāo)記循環(huán)的結(jié)束。如,教材例6.6中以|t

3、|的值達(dá)到標(biāo)記下限值1e-6作為循環(huán)的結(jié)束。循環(huán)設(shè)計(jì)時(shí)要注意合理設(shè)計(jì)循環(huán)條件,使得循環(huán)不會(huì)成為死循環(huán)。2. 算法程序設(shè)計(jì)的首要工作是算法設(shè)計(jì),離開了算法也就沒有了程序。算法,是指完成某一項(xiàng)工作而采取的方法和步驟,具體到程序設(shè)計(jì),是對解題過程的準(zhǔn)確而完整的描述,并用一種程序設(shè)計(jì)語言的來實(shí)現(xiàn)。循環(huán)主要用來解決程序設(shè)計(jì)中兩類基本的算法:窮舉和迭代。1)窮舉窮舉的基本思想是對問題的所有可能狀態(tài)一一測試,直到找到解或?qū)⑷靠赡軤顟B(tài)都測試過為止。窮舉是一種重復(fù)型算法,其核心是設(shè)計(jì)循環(huán),在循環(huán)體中依次測試。例:輸入兩個(gè)正整數(shù)x和y,求其最大公約數(shù)。main()int x,y,i,flag;printf(&q

4、uot;Please input two numbers:"); scanf("%d%d",&x,&y); for(i=x<y?x:y;i>=1;i-) /* 使用i進(jìn)行窮舉 */if(x%i=0&&y%i=0) break; /*條件滿足,就結(jié)束循環(huán) */printf("greatest common divisor=%dn",i); 兩個(gè)數(shù)中的小者到2之間任何一個(gè)數(shù)都有可能是公約數(shù),因此用變量i從大到小一一窮舉,直到找到為止。若兩數(shù)互質(zhì),當(dāng)i=1時(shí)也能使條件滿足。2)迭代按照特定規(guī)律和方法,不斷用

5、新值取代變量的舊值,或由舊值遞推出變量新值,直至問題解決為止,這種解決問題的方法為迭代。迭代的關(guān)鍵因素是:迭代初值、迭代公式和迭代次數(shù)(精度要求)。例:使用輾轉(zhuǎn)相除法求兩數(shù)的最大公約數(shù)。輾轉(zhuǎn)相除法:如果x除以y的余數(shù)為0,則除數(shù)y就是最大公約數(shù),或余數(shù)不為0,則被除數(shù)x被除數(shù)y取代,除數(shù)y被余數(shù)取代,再用新的x除以新的y,判斷余數(shù)是否為0,如果不為0,則重復(fù)此迭代過程,直至余數(shù)為0,此時(shí)的除數(shù)y即為最大公約數(shù)。main()int x,y,temp; printf("Please input two numbers:"); scanf("%d%d",&am

6、p;x,&y); temp=x%y; while(temp!=0)/* 輾轉(zhuǎn)相除,直到temp為0 */x=y;/*迭代*/ y=temp;/*迭代*/ temp=x%y; printf("greatest common divisor=%dn",y); 運(yùn)行時(shí)輸入:66 121輸出:greatest common divisor=11 各值的變化如下:x y temp=x%y 66 121 66 121 66 1166 11 0實(shí)驗(yàn)一固定次數(shù)的循環(huán)設(shè)計(jì)【實(shí)驗(yàn)?zāi)康摹繉W(xué)習(xí)設(shè)計(jì)固定次數(shù)的循環(huán)?!緦?shí)驗(yàn)內(nèi)容】編寫程序,計(jì)算x的y次方。這里x為double型,y為int型。x

7、、y通過鍵盤輸入,要考慮y為負(fù)數(shù)的情況。例:當(dāng)輸入2.5 3時(shí),輸出15.625000;當(dāng)輸入2.5 -3時(shí)則輸出0.064000。程序以6_1.c命名并上交。輸入輸出屏幕示例【指導(dǎo)】本實(shí)驗(yàn)中,假設(shè)y為正數(shù)時(shí),可定義結(jié)果變量sum,想辦法使sum*=x語句執(zhí)行y次。對固定次數(shù)的循環(huán),通常方法是設(shè)計(jì)一個(gè)循環(huán)變量i,讓其在初值與終值之間變化控制控制循環(huán)次數(shù),循環(huán)條件通常是:i終值。如:for(i=初值;i終值;i+)循環(huán)體語句;實(shí)驗(yàn)二整數(shù)按位折分求和【實(shí)驗(yàn)?zāi)康摹繉W(xué)習(xí)設(shè)計(jì)與控制循環(huán),并熟練%(求余)運(yùn)算。【實(shí)驗(yàn)內(nèi)容】輸入一個(gè)不大于2×109(用long型數(shù)據(jù))的正整數(shù)x,求這個(gè)數(shù)每位數(shù)字之

8、和。例如,若輸入33456781,輸出37。程序以6_2.c命名并上交?!咎崾尽吭O(shè)計(jì)循環(huán),每次求出x的個(gè)位數(shù)(使用求余運(yùn)算)并累加到和值變量中,再迭代操作,改變x的值,使原來的十位變個(gè)位。【討論與思考】 long型數(shù)據(jù)的最大值是2147483647,受變量類型限制,本程序只能接收不大于2×109的正整數(shù)。如果進(jìn)行擴(kuò)充,要求能接收并計(jì)算一個(gè)30位整數(shù)的各位之和,那么數(shù)據(jù)類型應(yīng)如何設(shè)置,程序應(yīng)該如何編寫?實(shí)驗(yàn)三輸出九九乘法表【實(shí)驗(yàn)?zāi)康摹繉W(xué)習(xí)多重循環(huán)的嵌套?!緦?shí)驗(yàn)內(nèi)容】下面程序輸出九九乘法表如下圖。請完善程序并以6_3.c命名。#include<stdio.h>void mai

9、n()int i,j; clrscr(); for(_)for(_)printf("%d*%d=%-2d ",i,j,i*j);_; 實(shí)驗(yàn)四打印數(shù)字塔圖形【實(shí)驗(yàn)?zāi)康摹繉W(xué)習(xí)使用循環(huán)語句構(gòu)成的多重循環(huán)嵌套?!緦?shí)驗(yàn)內(nèi)容】編寫程序,使用循環(huán)輸出如下圖所示的數(shù)字塔圖形。程序以6_4.c命名?!咎崾尽看藞D形上下對稱,可將程序分為上下兩部分實(shí)現(xiàn)。上半部輸出9行,下半部輸出8行。每一行包含三部分內(nèi)容:開始的空格、中間的數(shù)字及最后的換行符。需要考慮的是字符個(gè)數(shù)與行號(hào)的關(guān)系。下面程序用于輸出如下*字符塔,供本題參考。#include<stdio.h>void main()int i

10、,j; clrscr();/* 清屏 */ for(i=1;i<=9;i+)/* 行循環(huán) */for(j=1;j<=9-i;j+)/* 輸出行左空格*/printf(" "); for(j=1;j<=2*i-1;j+)/* 輸出若干* 字符*/printf("%c",'*'); printf("n");/* 換行 */ 實(shí)驗(yàn)五尋找素?cái)?shù)【實(shí)驗(yàn)?zāi)康摹款I(lǐng)會(huì)并牢固掌握素?cái)?shù)算法,深入循環(huán)結(jié)構(gòu)設(shè)計(jì)。【實(shí)驗(yàn)內(nèi)容】從鍵盤輸入一個(gè)大于3的正整數(shù),輸出距離該數(shù)最近的素?cái)?shù)。根據(jù)輸入的數(shù)不同,此問題可能有一個(gè)答案(或者比輸入

11、的數(shù)大或者比輸入的數(shù)?。?,也可能需要輸出兩個(gè)值(一個(gè)比輸入的數(shù)大,一個(gè)比輸入的數(shù)小,兩個(gè)距離輸入的數(shù)一樣近)。程序以6_5.c命名并上交。實(shí)驗(yàn)六不等式求解【實(shí)驗(yàn)?zāi)康摹繉W(xué)習(xí)在循環(huán)中使用break控制語句?!緦?shí)驗(yàn)內(nèi)容】鍵盤輸入一個(gè)數(shù)給m,計(jì)算并返回滿足表達(dá)式:1+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+n)<=m最大的n。例如,當(dāng)m=10000時(shí),程序輸出:n=38。程序以6_6.c命名并上交?!咎崾尽繀⒖冀夥ǎ篺or(i=1;1;i+) /* 循環(huán)條件為恒真 */計(jì)算(1+2+3+i)ès;將計(jì)算結(jié)果s累加到變量sum中; 判斷sum的值是否大于m是,則終止

12、循環(huán)否,則繼續(xù)進(jìn)入下一次循環(huán)輸出與對應(yīng)結(jié)果,其值會(huì)與i相關(guān)。實(shí)驗(yàn)七統(tǒng)計(jì)字?jǐn)?shù)【實(shí)驗(yàn)?zāi)康摹繉W(xué)習(xí)使用循環(huán)處理字符串相關(guān)問題?!緦?shí)驗(yàn)內(nèi)容】完善以下程序6_7.C 。程序任務(wù):輸入一串字符,以“#”作為輸入結(jié)束標(biāo)志,顯示其中字母與數(shù)字字符的個(gè)數(shù)。#include<stdio.h>void main()int ch_num,dig_num; char ch; ch_num=dig_num=0; doch=getchar();/* 完善程序,統(tǒng)計(jì)52個(gè)英文字母與十個(gè)數(shù)字字符的個(gè)數(shù) */ while(_); /* 給出循環(huán)條件 */ printf("The number of chars

13、 is:%dn",ch_num); printf("The number of digital is:%dn",dig_num); 實(shí)驗(yàn)八驗(yàn)證哥德巴赫猜想【實(shí)驗(yàn)?zāi)康摹烤C合運(yùn)用多重循環(huán)結(jié)構(gòu)、標(biāo)志法、窮舉法解決問題?!締栴}描述】1742年6月,德國數(shù)學(xué)家哥德巴赫在給大數(shù)學(xué)家歐拉的信中提出一個(gè)問題:任何大于4的偶數(shù)均可以表示為兩個(gè)素?cái)?shù)之和嗎?歐拉復(fù)信道:任何大于4的偶數(shù)均可以表示為兩個(gè)素?cái)?shù)之和,這一猜想我還不能證明,但我確信無疑地認(rèn)為這是完全正確的定理。哥德巴赫猜想是世界著名的數(shù)學(xué)難題,至今未能在理論上得到證明,自從計(jì)算機(jī)出現(xiàn)后,人們就開始用計(jì)算機(jī)去嘗試解各種各樣的數(shù)學(xué)

14、難題,包括費(fèi)馬大定理、四色問題、哥德巴赫猜想等,雖然計(jì)算機(jī)無法從理論上嚴(yán)密地證明它們,只能在有限的范圍內(nèi)對其進(jìn)行檢驗(yàn),但也不失其意義。【實(shí)驗(yàn)內(nèi)容】程序要求:輸入一個(gè)int型數(shù)據(jù)范圍內(nèi)的偶數(shù)x(x>4),找到兩個(gè)素?cái)?shù)a、b,滿足 x=a+b。最后輸出此等式。如輸入98,輸出98=19+79。程序以6_8.c命名?!緦?shí)驗(yàn)提示】讀入偶數(shù)x,找出一對數(shù)a、b滿足x=a+b,測試a、b是否都為素?cái)?shù),若不滿足,則找下一對a、b繼續(xù)測試,直到a、b均為素?cái)?shù)為止。算法描述如下:讀入x;a=3;while(a<x/2)b=x-a; 測素?cái)?shù)循環(huán),測試a是否為素?cái)?shù); 測素?cái)?shù)循環(huán),測試b是否為素?cái)?shù); if

15、(a、b同為素?cái)?shù))退出while循環(huán); a+=2; /* a在奇數(shù)上窮舉 */ if(a<x/2) 驗(yàn)證成功,輸出x=a+b; else 驗(yàn)證失敗,輸出失敗信息;為了判斷a、b是否是素?cái)?shù),可以設(shè)置兩個(gè)二元標(biāo)志變量flag_a和flag_b,其值為1時(shí)表示對應(yīng)變量是素?cái)?shù),其值為0時(shí)表示變量是非素?cái)?shù)。令flag_a和flag_b的初始值為0,代表開始時(shí)假設(shè)a、b都不是素?cái)?shù),然后進(jìn)入測試循環(huán)。若測素?cái)?shù)循環(huán)檢測a是素?cái)?shù),則改變flag_a=1;若b是素?cái)?shù),則令flag_b=1。則 if(a、b同為素?cái)?shù))可以表示為 if(flag_a*flag_b!=0)。實(shí)驗(yàn)九計(jì)算立方根【實(shí)驗(yàn)?zāi)康摹烤毩?xí)迭代算法

16、,學(xué)習(xí)幾種解一元高次方程的方法?!緦?shí)驗(yàn)內(nèi)容】鍵盤輸入一個(gè)實(shí)數(shù)a,輸出它的立方根。請自行設(shè)計(jì)算法編寫程序,不允許調(diào)用pow函數(shù)?!咎崾尽考僭O(shè)a的立方根為x,則x3=a,問題轉(zhuǎn)化求一元高次方程x3-a=0的解?!绢A(yù)備知識(shí)】例1:用牛頓迭代法求一元高次方程x3-7x2+7x+15=0在猜測解10附近的根。牛頓迭代法又稱牛頓切線法,它的基本思想如圖6.1所示。圖6.1 牛頓迭代法示意設(shè)是方程的精確解附近的一個(gè)猜測解,過點(diǎn)做的切線,切線與x軸的交點(diǎn)由下式計(jì)算:,此式子就是牛頓迭代法的迭代公式。如果猜測解與精確解處于同一個(gè)單調(diào)區(qū)間,則經(jīng)過有限次迭代后,可以求得符合誤差要求的近似解。#include<

17、math.h>main()float x,x0,f,f1; x0=10; /* 初始的猜測值 */ dox=x0;f=x*x*x-7*x*x+7*x+15;/* 變量f記錄 */f1=3*x*x-14*x+7; /* 變量f1記錄 */x0=x-f/f1; /* 按公式迭代 */while(fabs(f)>=1e-5);/* 誤差精度為0.00001 */ printf("the root=%fn",x); 運(yùn)行結(jié)果:the root=5.000000。改變初始的猜測值為0,則程序運(yùn)行結(jié)果為:the root=-1.000000。改變初始的猜測值為2.5,則程序

18、運(yùn)行結(jié)果為:the root=3.000000。例2:用二分法求一元高次方程x3-7x2+7x+15=0解。二分迭代法:先取的兩個(gè)粗略解,若與符號(hào)相異,則方程在區(qū)間間至少有一個(gè)根。圖4.8 二分法示意取,判斷是否是誤差范圍內(nèi)的近似解,若不是,則在和中舍去函數(shù)值與同號(hào)者,圖4.8中應(yīng)去除,這樣與組成了一個(gè)更小的含根區(qū)間。再取的中點(diǎn),判斷是否近似為零,若不是,同理舍去函數(shù)值與同號(hào)的,則得到更小的含根區(qū)間,如此重復(fù),依次得到,當(dāng)足夠小時(shí),即為近似解。此重復(fù)過程由誤差控制,而不能用計(jì)數(shù)循環(huán),因?yàn)槭孪葻o法估計(jì)所需的迭代次數(shù)。#include<math.h>main()float x,x1,x

19、2,f,f1,f2; doprintf("please input x1,x2:");scanf("%f%f",&x1,&x2); /*反復(fù)通過鍵盤輸入兩個(gè)初始值*/f1=x1*x1*x1-7*x1*x1+7*x1+15;f2=x2*x2*x2-7*x2*x2+7*x2+15; while(f1*f2>0); /* 直到保證,之間至少有一個(gè)根 */ dox=(x1+x2)/2;f=x*x*x-7*x*x+7*x+15;if(f*f1>0)/* 與同號(hào),則與異號(hào) */x1=x;/* 迭代舍去原 */f1=f;elsex2=x;/

20、* 迭代,舍去原 */ f2=f; while(fabs(f)>1e-5);/* 達(dá)不到精度要求循環(huán)繼續(xù) */ printf("the root=%fn",x);習(xí)題1對下面程序段描述正確的是_。int k=10; while(k=0)k=k-1;A) while循環(huán)執(zhí)行10次B) 循環(huán)是無限循環(huán)C) 循環(huán)體語句一次也不執(zhí)行D) 循環(huán)體語句執(zhí)行一次2語句while(!E);中的表達(dá)式!E等價(jià)于_.A)E=0 B)E!=1 C) E!=0 D) E=13下面程序段的運(yùn)行結(jié)果是_.int n=0;while(n+<=2);printf("%d",

21、n);A)2 B)3C) 4 D) 有語法錯(cuò)4下面程序的運(yùn)行結(jié)果是_. #include<stdio.h> main()int num=0; while(num<=2)num+; printf("%dn",num); A)1 B)1 C) 1 D) 1 2 2 2 3 3 45以下程序段_. x=-1; do x=x*x; while(!x);A)是死循環(huán)B)循環(huán)執(zhí)行二次C) 循環(huán)執(zhí)行一次D) 有語法錯(cuò)誤6如下程序段 _.int x=3;doprintf("%dn",x-=2);while(!(-x);A)輸出的是1 B)輸出的是1和-

22、2 C) 輸出的是3和0 D) 是死循環(huán)7下面程序的運(yùn)行結(jié)果是_.#include<stdio.h>main()int y=10; doy-;while(-y); printf("%dn",y-); A)-1 B) 1 C) 8 D) 08若i為整型變量,則以下循環(huán)執(zhí)行次數(shù)是_.for(i=2;i=0;)printf("%d",i-);A)無限次B) 0次C) 1次D) 2次9執(zhí)行語句for(i=1;i+<4; );后變量i的值是_.A)3 B) 4 C) 5 D) 不定10以下正確的描述是_.A)continue語句的作用是結(jié)束整個(gè)循

23、環(huán)的執(zhí)行B)只能在循環(huán)體內(nèi)和switch語句體內(nèi)使用break語句C) 在循環(huán)體內(nèi)使用break語句或continue語句的作用相同D) 從多層循環(huán)嵌套中退出時(shí),只能使用goto語句11.運(yùn)行下面程序時(shí),從鍵盤輸入20357<CR>,則下面程序的運(yùn)行結(jié)果是_。#include<stdio.h>main( )int c; while(c=getchar()!='n')switch(c-'2')case 0: case 1: putchar(c+4); case 2: putchar(c+4); break; case 3: putchar(c+3); default: putchar(c+2); break; putchar('n'); 12.下面程序段是從鍵盤輸入的字符串中統(tǒng)計(jì)數(shù)字字符的個(gè)數(shù),用換行符結(jié)

溫馨提示

  • 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

提交評論