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

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)

循環(huán)結(jié)構(gòu) 6.1while循環(huán) 6.2do-while循環(huán) 6.3for循環(huán) 6.4循環(huán)結(jié)構(gòu)嵌套 6.5轉(zhuǎn)向語句 6.5.1break語句 6.5.2continue語句 6.5.3goto語句 6.5.4return語句 6.6應(yīng)用舉例

while語句的一般形式為:while(表達(dá)式)語句;while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體語句,然后在判斷表達(dá)式,直到表達(dá)式為假(0)時(shí)結(jié)束循環(huán)。6.1while循環(huán) 使用while語句應(yīng)注意以下幾點(diǎn):(1)while語句中的表達(dá)式一般是關(guān)系表達(dá)式或邏輯表達(dá)式,只要表達(dá)式的值為真(非0)即可繼續(xù)循環(huán)。使用while語句應(yīng)注意以下幾點(diǎn):(2)循環(huán)體如包括有一個(gè)以上的語句,則必須用{}括起來,組成復(fù)合語句。(3)應(yīng)注意循環(huán)條件的選擇以避免死循環(huán)。如:inta,n=0;while(a=1)printf("%d",n++);例6-2利用輾轉(zhuǎn)相除法求解兩個(gè)整數(shù)的最大公約數(shù)。問題的方法如下:①令m為兩個(gè)整數(shù)中的較大者,n為兩個(gè)整數(shù)中的較小者;②

用m除以n,令r為m除以n的余數(shù);③若r不等于0,則令m等于n,n等于r,返回步驟②繼續(xù);若r等于0,則n中的數(shù)值就是兩個(gè)整數(shù)的最大公約數(shù)。#include<stdio.h>voidmain(){intm,n,r,temp;

printf("輸入整數(shù)m:");

scanf("%d",&m);

printf("輸入整數(shù)n:");

scanf("%d",&n);

if(m<n) {temp=m;

m=n;

n=temp;}

r=m%n

;while(r!=0) {m=n;n=r;r=m%n;}printf("最大公約數(shù)為%d",n); }6.2do-while循環(huán)do-while語句的一般形式為:do語句;

while(表達(dá)式);

先執(zhí)行循環(huán)體語句一次,再判別表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán),do-while語句還應(yīng)注意以下幾點(diǎn):①在if語句,while語句中,表達(dá)式后面都不能加分號,而在do-while語句的表達(dá)式后面則必須加分號。②do-while語句也可以組成多重循環(huán),而且也可以和while語句相互嵌套。③在do和while之間的循環(huán)體由多個(gè)語句組成時(shí),也必須用{}括起來組成一個(gè)復(fù)合語句。④do-while和while語句相互替換時(shí),要注意修改循環(huán)控制條件。6.2

do-while循環(huán)#include<stdio.h>voidmain(){intnumber,digit;printf(″Inputaninteger\n″);scanf(″%d″,&number);do{digit=number%10;printf(″%d″,digit);number/=10;}while(number);printf(″\n″);}例6-4輸入一個(gè)正整數(shù),然后按反向輸出。如輸入87654,則輸出為45678。運(yùn)行結(jié)果:Inputaninteger87654456786.3for循環(huán)for語句的基本形式如下:for(<表達(dá)式e1>;<表達(dá)式e2>;<表達(dá)式e3>)

<語句s>;6.3for循環(huán)

6.3for循環(huán)例6-6for語句實(shí)現(xiàn)找出一個(gè)整數(shù)的所有因子。#include<stdio.h>voidmain(){inti=1,x;scanf("%d",&x);for(;i<=x;){if(x%i==0)printf("%3d",i);i++;}}6.3for循環(huán)在使用for語句中要注意以下幾點(diǎn):(1)for語句中的各表達(dá)式都可省略,但分號間隔符不能少。(2)在循環(huán)變量已賦初值時(shí),可省去表達(dá)式1。如果省去表達(dá)式2或表達(dá)式3則將造成無限循環(huán),這時(shí)應(yīng)在循環(huán)體內(nèi)設(shè)法結(jié)束循環(huán)。下面是幾種不同的表示方法:①表達(dá)式1和表達(dá)式3是逗號表達(dá)式,如:intsum,i;for(sum=0,i=1;i<=100;i++,i++)sum+=i;其中sum=0和循環(huán)控制變量無關(guān)。

②省略表達(dá)式1和表達(dá)式3,如:intsum=0,i=1;for(;i<=100;){sum+=i;i+=2;}③三個(gè)表達(dá)式全部省略,如:intsum=0,i=1;for(;;){sum+=i;i+=2;if(i>100)break;}④省略循環(huán)體,把循環(huán)體變成空語句,原來的工作放到循環(huán)頭中完成,如inti,sum=0;for(i=1;i<=100;sum+=i,i+=2);這時(shí)應(yīng)注意,原循環(huán)體中的語句一定要放在控制變量增值之前,否則就會出錯(cuò)。6.3for循環(huán)(3)循環(huán)體可以是空語句。例6-7循環(huán)體是空的for語句。#include"stdio.h"voidmain(){intn=0;printf("inputastring:\n");for(;getchar()!='\n';n++);printf("%d",n);}6.4循環(huán)結(jié)構(gòu)嵌套(1)while(){

…while()

{…}

}(2)do{

do

{…}while()

}while();(3)while(){

do

{…}while();

}(4)for(;;){

for(;;)

{…}

}(5)for(;;){

while(;;)

{…}

}(4)for(;;){

for(;;)

{…}

}

(6)do{

for(;;)

{…}

}while();6.4循環(huán)結(jié)構(gòu)嵌套例6-8求出用數(shù)字0至9可以組成多少個(gè)沒有重復(fù)的兩位偶數(shù)。

#include<stdio.h>voidmain(){intn,i,k;for(i=1;i<=9;i++){for(k=0;k<=8;k+=2)if(k!=i)printf(″n=%4d″,10*i+k);printf(″\n″);}}例6-9全班有29個(gè)學(xué)生,每個(gè)學(xué)生考6門課。要求分別統(tǒng)計(jì)出每個(gè)學(xué)生的平均成績。

main(){inti,j,score,sum;floataver;j=1;while(j<=29)

{sum=0;for(i=1;i<=6;i++){printf(“EnterNO.%dthescore%d:”,j,i);scanf(“%d”,&score);sum=sum+score;}aver=sum/6.0;printf(“NO.%daver=%5.2f\n”,j,aver);j++;}}使用循環(huán)的嵌套結(jié)構(gòu)要注意以下幾點(diǎn):

(1)外層循環(huán)應(yīng)“完全包含”內(nèi)層循環(huán),不能發(fā)生交叉。

例如,下面這種形式是不允許的。do

{…

for{…}{…}

}while(…);

(2)嵌套的循環(huán)控制變量一般不應(yīng)同名,以免造成混亂。

例如:

for(i…){

for(i…)

{…}

}(3)嵌套的循環(huán)要注意正確使用縮進(jìn)式書寫格式來明確嵌套循環(huán)的層次關(guān)系,以增加程序的可讀性。6.5轉(zhuǎn)向語句6.5.1break語句break語句只能用在switch語句或循環(huán)語句中,其作用是跳出switch語句或跳出本層循環(huán),轉(zhuǎn)去執(zhí)行后面的程序。由于break語句的轉(zhuǎn)移方向是明確的,所以不需要語句標(biāo)號與之配合。break語句的一般形式為:break;使用break語句可以使循環(huán)語句有多個(gè)出口,在一些場合下使編程更加靈活、方便。例6-10輸出50以內(nèi)的素?cái)?shù)。素?cái)?shù)是只能被1和本身整除的數(shù)??捎酶F舉法來判斷一個(gè)數(shù)是否是素?cái)?shù)。

方法一:#include<stdio.h>voidmain(){intn,i;for(n=2;n<=50;n++){for(i=2;i<n;i++)if(n%i==0)break;if(i>=n)printf("%4d",n);}}6.5.2continue語句continue語句是截?cái)嘌h(huán)體中的部分語句,使其不執(zhí)行。作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。continue語句只能用在循環(huán)體中。一般格式是:continue;結(jié)束本次循環(huán),即不再執(zhí)行循環(huán)體continue語句之后的語句,轉(zhuǎn)入下一次循環(huán)條件的判斷與執(zhí)行。本語句只結(jié)束本層本次的循環(huán),并不跳出循環(huán)??梢杂胋reak語句跳出循環(huán),用continue語句結(jié)束本次循環(huán)。例6-11輸出100至200之間不能被5整除的數(shù)。#include<stdio.h>voidmain(){intn;for(n=100;n<=200;n++){if(n%5==0)continue;printf("%d",n);}}6.5.3goto語句goto語句也稱為無條件轉(zhuǎn)移語句。其一般格式如下:goto語句標(biāo)號;其中語句標(biāo)號是按標(biāo)識符規(guī)定書寫的符號,放在某一語句行的前面,標(biāo)號后加冒號(:)。語句標(biāo)號起標(biāo)識語句的作用,與goto語句配合使用。如:label:i++;loop:while(x<5);6.5.4return語句return語句的一般形式是:return[(表達(dá)式)];方括號的意思是里面的內(nèi)容可以省略。因而return語句有兩種使用形式:return;和return(表達(dá)式);表達(dá)式可以括起來,也可以不括,下面的幾種使用形式都是合法的:return;return0;return(i);return(a>b?a:b);return語句主要用在函數(shù)中,用來結(jié)束函數(shù)的執(zhí)行,把控制轉(zhuǎn)向函數(shù)調(diào)用點(diǎn)。若在主函數(shù)main中,則結(jié)束程序的運(yùn)行。(1)有多個(gè)return語句的函數(shù):floatmax(floatx,floaty){if(x>y)returnx;elsereturny;}(2)無return語句的函數(shù):voidnext(charc){putchar(c+1);}6.6循環(huán)結(jié)構(gòu)應(yīng)用舉例1.遞推法這類問題具有的共同特點(diǎn)是:前后項(xiàng)存在一定的關(guān)系,即后項(xiàng)可由前項(xiàng)推導(dǎo)出。主要指有通項(xiàng)公式的各類級數(shù)、數(shù)列等。遞推法的思路是:后項(xiàng)可由前項(xiàng)導(dǎo)出;找出了前后項(xiàng)關(guān)系后,就可應(yīng)用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)算法。關(guān)鍵是找前后項(xiàng)關(guān)系。例6-13求1-2+3-4+5-...-100的和。①設(shè)定項(xiàng)號,定義變量,找前后項(xiàng)關(guān)系,這是關(guān)鍵的一步。項(xiàng)號n=1,2,3,4,5,...sum=1-2+3-4+5-...–100前后項(xiàng)關(guān)系為n=n+1,比較簡單。生成的數(shù)n有正負(fù)號,且有規(guī)律:奇數(shù)為正,偶數(shù)為負(fù),可用if語句判別;這里定義一個(gè)變量s幫助判別。②構(gòu)造循環(huán)結(jié)構(gòu)求解這類題目,循環(huán)體總要執(zhí)行多次,采用dowhile循環(huán)結(jié)構(gòu)。do{n=n+1;s=-s;sum=sum+s*n;}while(n<100);③設(shè)置變量初值

設(shè)置變量初值是保證正確計(jì)算出第一項(xiàng)值。十分明顯,各變量的初值為:n=0;sum=0;s=-1;④靜態(tài)檢查跟蹤三步左右,如果結(jié)果是正確的,一般情況下,可斷定算法是正確的。語句

第一步

第二步

第三步n=n+1;

1 2 3s=-s 1 -1 1sum=sum+s*n; 1 -1 2通過上述分析,確定了數(shù)據(jù),定義了有關(guān)變量和類型,完成了算法設(shè)計(jì)。程序如下:#include<stdio.h>voidmain(){ intsum=0,n=0,s=-1;do { n++;s=-s;sum+=s*n; }while(n<100); printf("1-2+3-4+...-100=%d\n",sum);}例6-13求1-2+3-4+5-...-100的和。2.迭代法下列問題具有的共同特點(diǎn)是:已知迭代公式和誤差公式,可直接應(yīng)用循環(huán)結(jié)構(gòu),按迭代公式計(jì)算一個(gè)新根,并與前一個(gè)根比較,直到滿足誤差為止。例如求a1/2

的近似值:

迭代公式:xn+1=(xn+a/xn)/2

誤差公式:|xn+1-xn|<=EPS例6-15求a1/2的近似值。定義原根x0表示xn,新根x1表示xn+1,其類型取double。先以求21/2根為實(shí)例,按迭代法循環(huán)計(jì)算三次,觀察根值的變化趨勢。a為2,定義一個(gè)新根x1=a/2,其初值為1.0,循環(huán)按迭代公式計(jì)算一個(gè)新根:語句

第一次第二次

第三次x0=x1;

1.0 1.5 1.417x1=(x0+a/x0)/2;

1.5 1.417 1.414從上面x1的各次計(jì)算值可以看出:x1值一步一步逼近21/2的根值。求解這類問題,一般都采用do…while循環(huán)結(jié)構(gòu)實(shí)現(xiàn)。例6-15求a1/2的近似值。程序如下:#include<stdio.h>#include<math.h>#defineEPS1e-8voidmain(){floata;doublex0,x1;printf("讀入一個(gè)實(shí)數(shù):");scanf("%f",&a);if(a<0){printf("錯(cuò)誤:輸入的實(shí)數(shù)小于0\n");exit(1);}x1=a/2;/*選定初值*/

do {x0=x1;/*前一次根值*/ x1=(x0+a/x0)/2 }while(fabs(x1-x0)>EPS);printf("迭代法sqrt(%f)=%0.8f\n",a,x1);printf("調(diào)庫函數(shù)sqrt(%f)=%0.8f\n",a,sqrt(a));

}3.枚舉法本類問題具有的共同特點(diǎn)是:不能用方程求解,只能一一列舉各種情況,從多種可能中選取滿足要求的一個(gè)(或一組)解。當(dāng)然,也可能得出無解的結(jié)論。例6-16百雞問題:雞翁一,值錢五、雞母一,值錢三、雞雛三,值錢一,百錢買百雞,問雞翁、雞母、雞雛各幾個(gè)?分析:設(shè)雞翁、雞母、雞雛的數(shù)量分別為cocks、hens、chicks,則可得如下模型:5*cocks+3*hens+chicks/3.0=100cocks+hens+chicks=100cocks、hens、chicks都應(yīng)為正整數(shù),且它們的取值范圍應(yīng)分別為:cocks:0~20(假如100元全買cocks,最多20只)hens:0~33(假如100元全買hens,最多33只)chicks:0~100(假如全買chicks,最多100只)本題的枚舉過程如下。首先從0開始,列舉cocks的各個(gè)可能值for(cocks=0;cocks<20;++cocks){S1:找滿足兩個(gè)方程的解的hens、chicksS2:輸出一組解}下面進(jìn)一步用枚舉法來表現(xiàn)S1:for(hens=0;hens<33;++hens){S1.1找滿足方程的一個(gè)chicksS1.2輸出一組解}列舉的每個(gè)cocks與每個(gè)hens都可以按下式求出一個(gè)chickschicks=100-cocks-hens因此,只要該chicks滿足另一個(gè)方程

5*cocks+3*hens+chicks/3.0=100可以得到一組滿足題意的cocks、hens和chick

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論