




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025山東棗莊東林農(nóng)文化產(chǎn)業(yè)發(fā)展有限公司招聘68人筆試參考題庫附帶答案詳解
- 紡織設(shè)計(jì)師需關(guān)注的客戶需求試題及答案
- 風(fēng)格變化對紡織品設(shè)計(jì)的影響試題及答案
- 工程材料轉(zhuǎn)讓合同協(xié)議書
- 口腔門診投資合同協(xié)議書
- 樓房買賣合同協(xié)議書范文
- 《逆序法施工技術(shù)》課件
- 各種合同協(xié)議書
- 合同 變更 協(xié)議書
- 合同協(xié)議書收納
- 民宿合同轉(zhuǎn)讓協(xié)議書
- 五年級下學(xué)期科學(xué)立體小菜園課件
- 《臨床藥物治療學(xué)》考試復(fù)習(xí)題庫寶典(含答案)
- 2024年東南亞數(shù)字辦公場所軟件市場深度研究及預(yù)測報(bào)告
- 手冊的介紹課件講解
- 2024年山東高考物理真題試題(原卷版+含解析)
- 2024年4月自考00055企業(yè)會計(jì)學(xué)試題及答案
- 2022-2023學(xué)年浙江省杭州市錢塘區(qū)八年級(下)期末數(shù)學(xué)試卷含答案
- 空調(diào)維修規(guī)章制度
- 殘疾人康復(fù)輔助器具適配服務(wù)規(guī)范
- 社會主義發(fā)展史智慧樹知到期末考試答案2024年
評論
0/150
提交評論