C語言程序設計課件:循環(huán)結構_第1頁
C語言程序設計課件:循環(huán)結構_第2頁
C語言程序設計課件:循環(huán)結構_第3頁
C語言程序設計課件:循環(huán)結構_第4頁
C語言程序設計課件:循環(huán)結構_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言程序設計

循環(huán)結構 6.1while循環(huán) 6.2do-while循環(huán) 6.3for循環(huán) 6.4循環(huán)結構嵌套 6.5轉向語句 6.5.1break語句 6.5.2continue語句 6.5.3goto語句 6.5.4return語句 6.6應用舉例

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

用m除以n,令r為m除以n的余數(shù);③若r不等于0,則令m等于n,n等于r,返回步驟②繼續(xù);若r等于0,則n中的數(shù)值就是兩個整數(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(表達式);

先執(zhí)行循環(huán)體語句一次,再判別表達式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán),do-while語句還應注意以下幾點:①在if語句,while語句中,表達式后面都不能加分號,而在do-while語句的表達式后面則必須加分號。②do-while語句也可以組成多重循環(huán),而且也可以和while語句相互嵌套。③在do和while之間的循環(huán)體由多個語句組成時,也必須用{}括起來組成一個復合語句。④do-while和while語句相互替換時,要注意修改循環(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輸入一個正整數(shù),然后按反向輸出。如輸入87654,則輸出為45678。運行結果:Inputaninteger87654456786.3for循環(huán)for語句的基本形式如下:for(<表達式e1>;<表達式e2>;<表達式e3>)

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

6.3for循環(huán)例6-6for語句實現(xiàn)找出一個整數(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語句中要注意以下幾點:(1)for語句中的各表達式都可省略,但分號間隔符不能少。(2)在循環(huán)變量已賦初值時,可省去表達式1。如果省去表達式2或表達式3則將造成無限循環(huán),這時應在循環(huán)體內設法結束循環(huán)。下面是幾種不同的表示方法:①表達式1和表達式3是逗號表達式,如:intsum,i;for(sum=0,i=1;i<=100;i++,i++)sum+=i;其中sum=0和循環(huán)控制變量無關。

②省略表達式1和表達式3,如:intsum=0,i=1;for(;i<=100;){sum+=i;i+=2;}③三個表達式全部省略,如: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);這時應注意,原循環(huán)體中的語句一定要放在控制變量增值之前,否則就會出錯。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)結構嵌套(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)結構嵌套例6-8求出用數(shù)字0至9可以組成多少個沒有重復的兩位偶數(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個學生,每個學生考6門課。要求分別統(tǒng)計出每個學生的平均成績。

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)的嵌套結構要注意以下幾點:

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

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

{…

for{…}{…}

}while(…);

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

例如:

for(i…){

for(i…)

{…}

}(3)嵌套的循環(huán)要注意正確使用縮進式書寫格式來明確嵌套循環(huán)的層次關系,以增加程序的可讀性。6.5轉向語句6.5.1break語句break語句只能用在switch語句或循環(huán)語句中,其作用是跳出switch語句或跳出本層循環(huán),轉去執(zhí)行后面的程序。由于break語句的轉移方向是明確的,所以不需要語句標號與之配合。break語句的一般形式為:break;使用break語句可以使循環(huán)語句有多個出口,在一些場合下使編程更加靈活、方便。例6-10輸出50以內的素數(shù)。素數(shù)是只能被1和本身整除的數(shù)??捎酶F舉法來判斷一個數(shù)是否是素數(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語句是截斷循環(huán)體中的部分語句,使其不執(zhí)行。作用為結束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定。continue語句只能用在循環(huán)體中。一般格式是:continue;結束本次循環(huán),即不再執(zhí)行循環(huán)體continue語句之后的語句,轉入下一次循環(huán)條件的判斷與執(zhí)行。本語句只結束本層本次的循環(huán),并不跳出循環(huán)??梢杂胋reak語句跳出循環(huán),用continue語句結束本次循環(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語句也稱為無條件轉移語句。其一般格式如下:goto語句標號;其中語句標號是按標識符規(guī)定書寫的符號,放在某一語句行的前面,標號后加冒號(:)。語句標號起標識語句的作用,與goto語句配合使用。如:label:i++;loop:while(x<5);6.5.4return語句return語句的一般形式是:return[(表達式)];方括號的意思是里面的內容可以省略。因而return語句有兩種使用形式:return;和return(表達式);表達式可以括起來,也可以不括,下面的幾種使用形式都是合法的:return;return0;return(i);return(a>b?a:b);return語句主要用在函數(shù)中,用來結束函數(shù)的執(zhí)行,把控制轉向函數(shù)調用點。若在主函數(shù)main中,則結束程序的運行。(1)有多個return語句的函數(shù):floatmax(floatx,floaty){if(x>y)returnx;elsereturny;}(2)無return語句的函數(shù):voidnext(charc){putchar(c+1);}6.6循環(huán)結構應用舉例1.遞推法這類問題具有的共同特點是:前后項存在一定的關系,即后項可由前項推導出。主要指有通項公式的各類級數(shù)、數(shù)列等。遞推法的思路是:后項可由前項導出;找出了前后項關系后,就可應用循環(huán)結構實現(xiàn)算法。關鍵是找前后項關系。例6-13求1-2+3-4+5-...-100的和。①設定項號,定義變量,找前后項關系,這是關鍵的一步。項號n=1,2,3,4,5,...sum=1-2+3-4+5-...–100前后項關系為n=n+1,比較簡單。生成的數(shù)n有正負號,且有規(guī)律:奇數(shù)為正,偶數(shù)為負,可用if語句判別;這里定義一個變量s幫助判別。②構造循環(huán)結構求解這類題目,循環(huán)體總要執(zhí)行多次,采用dowhile循環(huán)結構。do{n=n+1;s=-s;sum=sum+s*n;}while(n<100);③設置變量初值

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

第一步

第二步

第三步n=n+1;

1 2 3s=-s 1 -1 1sum=sum+s*n; 1 -1 2通過上述分析,確定了數(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.迭代法下列問題具有的共同特點是:已知迭代公式和誤差公式,可直接應用循環(huán)結構,按迭代公式計算一個新根,并與前一個根比較,直到滿足誤差為止。例如求a1/2

的近似值:

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

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

第一次第二次

第三次x0=x1;

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

1.5 1.417 1.414從上面x1的各次計算值可以看出:x1值一步一步逼近21/2的根值。求解這類問題,一般都采用do…while循環(huán)結構實現(xiàn)。例6-15求a1/2的近似值。程序如下:#include<stdio.h>#include<math.h>#defineEPS1e-8voidmain(){floata;doublex0,x1;printf("讀入一個實數(shù):");scanf("%f",&a);if(a<0){printf("錯誤:輸入的實數(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("調庫函數(shù)sqrt(%f)=%0.8f\n",a,sqrt(a));

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

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

溫馨提示

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

評論

0/150

提交評論