版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章順序與分支結(jié)構(gòu)3.1程序結(jié)構(gòu)框圖3.2順序結(jié)構(gòu)3.3二分支結(jié)構(gòu)3.4多分支結(jié)構(gòu)3.5分支結(jié)構(gòu)的綜合示例本章小結(jié)
3.1程序結(jié)構(gòu)框圖
3.1.1算法的表示程序設(shè)計(jì)的關(guān)鍵是算法。那什么是算法?算法就是求解實(shí)際問題的步驟。有了正確有效的算法,就可以用計(jì)算機(jī)語言編寫程序,解決實(shí)際問題。算法可采用自然語言、流程圖或N-S圖來描述。
1.自然語言描述
例3-1從鍵盤輸入3個(gè)數(shù),按由小到大的順序輸出。
解題思路從鍵盤輸入的3個(gè)數(shù)值必須用3個(gè)變量來保存,設(shè)3個(gè)變量為x、y、z。3個(gè)數(shù)按由小到大的順序輸出,則必須將數(shù)據(jù)兩兩比較,在比較的過程中,始終保持變量x最小,變量z的值最大,如果不滿足此條件,則將比較的兩變量互相交換其值。設(shè)中間變量為t。
算法步驟如下:
①輸入3個(gè)數(shù),其值分別賦給3個(gè)變量x、y、z;
②?x、y進(jìn)行比較,如果x大于y,通過t交換x、y的值;
③?x、z進(jìn)行比較,如果x大于z,通過t交換x、z的值;
④?y、z進(jìn)行比較,如果y大于z,通過t交換y、z的值;
⑤按x、y、z的順序輸出其變量的值。
2.流程圖
流程圖是一種傳統(tǒng)的算法描述方法,它用幾種不同的幾何圖來代表不同性質(zhì)的操作,用流程線來指示算法的執(zhí)行方向。用流程圖表示的算法簡單直觀,容易轉(zhuǎn)化成相應(yīng)的語言
程序。
圖3-1所示為國際標(biāo)準(zhǔn)化組織(InternationalStandardOrganization,ISO)規(guī)定的一些常用流程圖符號(hào)。這些符號(hào)已為各國普遍采用。圖3-1常用的流程圖符號(hào)
例3-2將例3-1中的算法用流程圖表示。
流程圖如圖3-2所示。圖3-2例3-1的算法流程圖
3.?N-S圖
N-S圖是程序算法的另一種圖形表示,它是由美國人I.Nassi和B.Shneiderman共同提出來的,其依據(jù)是:因?yàn)槿魏嗡惴ǘ际怯身樞蚪Y(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)這3種結(jié)構(gòu)所組成的,所以可以不需要各結(jié)構(gòu)之間的流程線,全部算法寫在一個(gè)矩形框內(nèi),矩形框內(nèi)由順序、分支、循環(huán)3種結(jié)構(gòu)組成。三種基本結(jié)構(gòu)的N-S圖如圖3-3所示。圖3-33種基本結(jié)構(gòu)的N-S圖
例3-3將例3-1中的算法用N-S圖表示。
N-S圖如圖3-4所示。圖3-4例3-1的N-S圖
3.1.2結(jié)構(gòu)化程序設(shè)計(jì)
結(jié)構(gòu)化程序設(shè)計(jì)的基本思想是:任何程序都由3種基本結(jié)構(gòu)組成,這3種基本結(jié)構(gòu)如下:
(1)順序結(jié)構(gòu):按照語句出現(xiàn)的先后順序依次執(zhí)行的。
(2)分支結(jié)構(gòu):根據(jù)給定條件進(jìn)行判斷,選擇其中的一個(gè)分支執(zhí)行。
(3)循環(huán)結(jié)構(gòu):根據(jù)某一個(gè)條件成立與否來決定是否重復(fù)執(zhí)行某一部分操作,反復(fù)執(zhí)行的部分稱為循環(huán)體。
循環(huán)結(jié)構(gòu)有以下兩種類型:
①當(dāng)型(while型)循環(huán)結(jié)構(gòu):當(dāng)條件滿足時(shí),重復(fù)執(zhí)行某一操作。
②直到型循環(huán)結(jié)構(gòu):先執(zhí)行循環(huán)體操作,再判斷條件,如果條件滿足,則繼續(xù)執(zhí)行循環(huán)體操作,直到條件不滿足時(shí),才退出循環(huán),繼續(xù)執(zhí)行循環(huán)體后面的語句。
由上面3種基本結(jié)構(gòu),可以看出結(jié)構(gòu)化程序設(shè)計(jì)具有以下特點(diǎn):
①只有一個(gè)入口和一個(gè)出口;
②程序中不能有無窮循環(huán)(死循環(huán));
③程序中不能有在任何條件下都執(zhí)行不到的語句(死語句)。
3.1.3復(fù)合語句
將若干語句用一對(duì)花括號(hào)括起來的語句,稱為復(fù)合語句。如
{
y=x++;
printf("%d%d",x,y);
}
復(fù)合語句在邏輯上相當(dāng)于一個(gè)單一語句,在流程控制結(jié)構(gòu),如if結(jié)構(gòu)、for結(jié)構(gòu)、while結(jié)構(gòu)中經(jīng)常用到。復(fù)合語句在書寫時(shí)采用向右縮進(jìn)的方式,語句組相對(duì)于花括號(hào)向右縮進(jìn)一個(gè)制表位。
3.2順序結(jié)構(gòu)
順序結(jié)構(gòu)是最基本、最簡單的程序結(jié)構(gòu)。順序結(jié)構(gòu)中,各語句按照代碼的書寫順序,自上而下地逐條執(zhí)行,沒有任何條件判斷或循環(huán)操作,每個(gè)語句都被執(zhí)行一遍,且只執(zhí)行一次。
例3-4已知長方形的長和寬,計(jì)算其周長和面積。
解題思路輸入長方形的長和寬并用兩個(gè)變量保存,設(shè)兩個(gè)變量分別為length、width,然后利用公式計(jì)算長方形的周長和面積,周長和面積也分別用兩個(gè)變量perimeter、area
表示。
算法步驟如下:
(1)輸入兩個(gè)數(shù),其值分別賦給length、width;
(2)根據(jù)公式計(jì)算長方形的周長,并將其值賦給perimeter;
(3)根據(jù)公式計(jì)算長方形的面積,并將其值賦給area;
(4)輸出perimeter和area。
3.3二分支結(jié)構(gòu)
二分支結(jié)構(gòu)就是判定給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。用if語句可以構(gòu)成分支結(jié)構(gòu),if語句可以根據(jù)不同的條件,選擇不同的執(zhí)行語句。先來看這樣一個(gè)問題,計(jì)算分段函數(shù):
求解問題的流程如下:
(1)輸入x;
(2)如果x≥0,則y=x?-?5;否則y=5/x;
(3)輸出y的值。
要完成該問題的計(jì)算,顯然程序的流程必須由x的值確定。像這樣的流程(根據(jù)某個(gè)變量或表達(dá)式的值做出判定,以決定執(zhí)行某個(gè)模塊和跳過某個(gè)模塊),就需要選擇語句。
3.3.1if-else二分支選擇語句
若表達(dá)式為非0(即條件判斷為真),則執(zhí)行if后面的語句1,而不執(zhí)行語句2;否則(即條件判斷為假),越過語句1,執(zhí)行else后面的語句2。if-else的N-S圖如圖3-5所示。其中的語句1、語句2都是單一的邏輯語句,若語句1、語句2不是單一的邏輯語句,則必須用花括號(hào)括起來形成復(fù)合語句。
在條件控制語句中,人們習(xí)慣把圓括號(hào)內(nèi)的表達(dá)式叫作條件,其中if和else是關(guān)鍵字。
圖3-5if-else的N-S圖
使用if-else語句時(shí)的注意事項(xiàng)如下:
(1)?if語句中的條件一般是條件表達(dá)式或邏輯表達(dá)式,它們必須放在圓括號(hào)內(nèi)。
(2)因?yàn)镃語言中沒有邏輯型變量,這里只是測試表達(dá)式的值是否為0,所以可以將
if(表達(dá)式!=0)
簡化為
if(表達(dá)式)
(3)?if或else后的語句可以是一個(gè)簡單語句,也可以是由幾個(gè)簡單語句組成的復(fù)合語句。若是復(fù)合語句,則必須用花括號(hào)括起來。
(4)要注意賦值運(yùn)算符(=)與關(guān)系運(yùn)算符(==)的區(qū)別。
幾種常見的if表達(dá)式的寫法如下:
①?if(!a):判斷變量a的值是否為0。
②?if(x>=0&&x<=10):當(dāng)x位于區(qū)間[0,10]上,邏輯表達(dá)式為真。
③?if(x>0,y>10):括號(hào)內(nèi)為逗號(hào)表達(dá)式,故最后一個(gè)表達(dá)式(y>10)的值是整個(gè)條件表達(dá)式的值。若表達(dá)式y(tǒng)>10成立,則if的條件為真。
④?if(x>0||y<10):只要一個(gè)關(guān)系表達(dá)式成立,if的條件為真。
例3-5求兩個(gè)整數(shù)x、y中較大的數(shù),并賦給變量max。
解題思路x、y值由輸入函數(shù)輸入,根據(jù)其大小進(jìn)行判斷,較大的數(shù)賦給max變量。其N-S圖如圖3-6所示。圖3-6例3-5的N-S圖
3.3.2不平衡if結(jié)構(gòu)
缺少else分支的二分支結(jié)構(gòu),稱為不平衡if結(jié)構(gòu)。不平衡if結(jié)構(gòu)的基本形式如下:
if(表達(dá)式)語句;
若表達(dá)式為非0(即條件判斷為“真”),則執(zhí)行if后面的語句;否則(即條件判斷為“假”),順序執(zhí)行if語句的下一條語句。不平衡if結(jié)構(gòu)的N-S圖如圖3-7所示。
圖3-7不平衡if結(jié)構(gòu)的N-S圖
例3-6從鍵盤輸入3個(gè)整數(shù),按由小到大的順序輸出。
解題思路輸入3個(gè)整數(shù)x、y、z,兩兩比較,始終保持x的值最小,z的值最大,不滿足此條件,則將其值進(jìn)行交換。N-S圖如圖3-8所示。圖3-8例3-6的N-S圖
例3-7求一元二次方程ax2?+?bx?+?c?=?0(a不為0)的解。
解題思路對(duì)于任意輸入的3個(gè)數(shù)a、b、c(a不等于0),有這樣3種可能:
(1)若b2?-?4ac>0,則方程有兩個(gè)不相等的實(shí)根。
(2)若b2?-?4ac=0,則方程有兩個(gè)相等的實(shí)根。
(3)若b2?-?4ac<0,則方程有兩個(gè)復(fù)數(shù)根。
3.3.3if語句的嵌套
C語言允許if語句嵌套使用。通常,if語句的嵌套有兩種結(jié)構(gòu):不平衡if嵌套結(jié)構(gòu)和多分支嵌套結(jié)構(gòu)。本小節(jié)介紹不平衡if嵌套結(jié)構(gòu)的內(nèi)容,多分支嵌套結(jié)構(gòu)的內(nèi)容將在后面小節(jié)介紹。
在這種形式的if嵌套結(jié)構(gòu)中,若表達(dá)式1為“假”,則跳過花括號(hào)中的所有語句,去執(zhí)行該復(fù)合語句下面的語句;若表達(dá)式1為“真”,則進(jìn)一步去判斷表達(dá)式11,若表達(dá)式11也為“真”,則執(zhí)行語句11,然后越過else子句,去執(zhí)行該復(fù)合語句下面的語句,若表達(dá)式11為“假”,則跳過語句11,而去執(zhí)行語句12,然后去執(zhí)行該復(fù)合語句下面的語句。
其執(zhí)行流程的N-S圖如圖3-9所示。
圖3-9不平衡if嵌套結(jié)構(gòu)的N-S圖
例3-8從鍵盤接收一整數(shù)x,判斷x是否含有因子5的正整數(shù),如有,則輸出“YES”,否則輸出“NO”。
3.4多分支結(jié)構(gòu)
3.4.1if-else多分支語句二分支if語句中,若二分支中的語句1或語句2也是一個(gè)分支結(jié)構(gòu),則整個(gè)結(jié)構(gòu)稱為分支嵌套結(jié)構(gòu)。采用多層嵌套可以實(shí)現(xiàn)多分支結(jié)構(gòu)。
分支結(jié)構(gòu)中,若表達(dá)式1的值不為0,則執(zhí)行語句1,然后越過所有的else子句,去執(zhí)行整個(gè)if語句的下一個(gè)語句。若表達(dá)式1的值為0,則判斷表達(dá)式2的值是否為0,若其值不為0,則執(zhí)行語句2,然后越過它下面的所有else子句,去執(zhí)行整個(gè)if語句下的語句;若表達(dá)式2的值為0,則再判斷下一個(gè)if語句的條件表達(dá)式。若表達(dá)式1,表達(dá)式2,…,表達(dá)式n的結(jié)果都為0,則執(zhí)行語句n+1。其執(zhí)行流程如圖3-12所示。
圖3-10多分支嵌套結(jié)構(gòu)的流程
例3-9計(jì)算下列分段函數(shù)的值。
N-S圖如圖3-11所示。
圖3-11例3-9的算法N-S圖
在if嵌套語句中,應(yīng)注意以下兩點(diǎn)。
(1)?else語句要有if語句與之匹配,在同一個(gè)模塊內(nèi),else總是與其前面最近的、沒有匹配過的if語句相匹配。
(2)?if后的表達(dá)式可以是關(guān)系表達(dá)式、邏輯表達(dá)式。if和else關(guān)鍵字后的語句可以是單語句,也可以是復(fù)合語句,這與單if語句相同。
例3-10從鍵盤輸入一學(xué)生成績,判斷學(xué)生成績等級(jí)。如果成績?cè)?0~100,等級(jí)為“A”;成績?cè)?0~89,等級(jí)為“B”;成績?cè)?0~79,等級(jí)為“C”;成績?cè)?0~69,等級(jí)為“D”;成績小于60,等級(jí)為“E”。
3.4.2switch語句
switch語句將一個(gè)表達(dá)式的值與多個(gè)常量表達(dá)式的值一一進(jìn)行比較,如果相等,則與之相應(yīng)的語句便會(huì)被執(zhí)行。
switch語句的一般形式如下:
其中,語句序列稱為switch語句的子語句;switch語句中的表達(dá)式稱為開關(guān)控制表達(dá)式。方括號(hào)內(nèi)的語句可缺省。
switch語句的執(zhí)行過程如下:
(1)計(jì)算switch語句后面表達(dá)式的值。
(2)逐個(gè)比較表達(dá)式的值與case后面常量表達(dá)式的值是否相等。
(3)當(dāng)表達(dá)式的值與常量表達(dá)式i的值相等時(shí),就轉(zhuǎn)去執(zhí)行語句序列i的各個(gè)語句,若語句序列i后有break語句,則終止switch語句,繼續(xù)執(zhí)行整個(gè)switch語句后的下一條語句;當(dāng)語句序列i后無break語句,則會(huì)順序執(zhí)行語句序列i+1,i+2,…,直到遇到break語句或語句序列n+1為止,然后繼續(xù)執(zhí)行整個(gè)switch語句后的下一條語句。如果沒有一個(gè)常量表達(dá)式的值與switch語句表達(dá)式的值相等,則執(zhí)行語句n+1后,繼續(xù)執(zhí)行整個(gè)switch語句后的下一條語句。
在不考慮break語句的情況下,switch語句一般形式的執(zhí)行流程如圖3-12所示。圖3-12switch語句一般形式的執(zhí)行流程圖
使用switch語句注意事項(xiàng)如下:
(1)?switch后面的表達(dá)式的值類型和常量表達(dá)式的值類型必須一致,且只能是整型、字符型或枚舉型。
(2)當(dāng)表達(dá)式的值與某個(gè)case中的常量表達(dá)式的值進(jìn)行匹配,若相等時(shí),就執(zhí)行相應(yīng)的case后的語句序列,直到遇到break語句或到達(dá)switch語句末尾(無break語句,則入口后的語句序列順序執(zhí)行)。若匹配不成功,則執(zhí)行default后的語句。default語句是可省的,如沒有default語句,所有的匹配不成功,則不執(zhí)行case中任何語句序列,程序繼續(xù)執(zhí)行整個(gè)switch語句后的下一條語句。
(3)多個(gè)連續(xù)的case語句可以共用一個(gè)語句序列。
(4)?case后的常量表達(dá)式的值不能相等。
(5)?break的作用是改變程序在switch結(jié)構(gòu)中的執(zhí)行流程,將程序流程跳出switch語句,轉(zhuǎn)到整個(gè)switch語句后的下一條語句去執(zhí)行。
(6)?switch語句中允許嵌套switch語句,這稱為switch嵌套結(jié)構(gòu)。
例3-11用switch語句完成從鍵盤輸入一學(xué)生成績,判斷學(xué)生成績等級(jí)。如果成績?cè)?0~100分,等級(jí)為A;成績?cè)?0~89分,等級(jí)為B;成績?cè)?0~79分,等級(jí)為C;成績?cè)?0~69分,等級(jí)為D;成績小于60分,等級(jí)為E。
3.5分支結(jié)構(gòu)的綜合示例
例3-12從鍵盤輸入3個(gè)整數(shù),按從小到大的順序輸出。N-S圖如圖3-13所示。
圖3-13例3-12的算法N-S圖
例3-13計(jì)算下面分段函數(shù)的值。
下面使用4種不同的方法實(shí)現(xiàn)上述計(jì)算,以展現(xiàn)C語言多分支結(jié)構(gòu)的風(fēng)格。
(1)使用不嵌套的if語句編程。
(2)使用嵌套的if語句編程。
(3)使用if-else形式編程。
(4)使用switch語句編程。
本章小結(jié)
C語言中,順序結(jié)構(gòu)和分支結(jié)構(gòu)是兩大基本結(jié)構(gòu)。順序結(jié)構(gòu)可確保程序按照既定順序執(zhí)行每條指令,是程序設(shè)計(jì)的基礎(chǔ)。本章首先介紹了程序結(jié)構(gòu)框圖,如流程圖和N-S圖,然后介紹了順序結(jié)構(gòu),最后介紹了分支結(jié)構(gòu)。分支結(jié)構(gòu)中常用的if語句和switch語句,可使程序能夠根據(jù)不同條件選擇執(zhí)行路徑。if語句靈活,適用于處理復(fù)雜的條件判斷,而switch語句在處理多個(gè)簡單條件時(shí)更為高效。將順序結(jié)構(gòu)和分支結(jié)構(gòu)兩者結(jié)合使用,是C語言程序員必須掌握的核心技能。第4章循環(huán)結(jié)構(gòu)4.1循環(huán)結(jié)構(gòu)的要素4.2循環(huán)語句4.3循環(huán)嵌套4.4流程轉(zhuǎn)移控制語句4.5循環(huán)結(jié)構(gòu)的綜合示例本章小結(jié)
4.1循環(huán)結(jié)構(gòu)的要素
循環(huán)結(jié)構(gòu)就是用來處理需要重復(fù)處理的問題的,所以循環(huán)結(jié)構(gòu)又稱為重復(fù)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)有3個(gè)要素:循環(huán)控制變量、循環(huán)體和循環(huán)條件。
1.循環(huán)控制變量
循環(huán)控制變量通常用于控制循環(huán)的次數(shù)和進(jìn)程。它在循環(huán)開始前被初始化,在循環(huán)過程中會(huì)發(fā)生變化,并且循環(huán)條件通常會(huì)依賴于這個(gè)變量的值。在for循環(huán)中,控制變量的初始化、條件檢查和變量更新通常在循環(huán)語句的頭部明確給出。
2.循環(huán)體
循環(huán)體包含了每次循環(huán)迭代時(shí)需要執(zhí)行的代碼塊。只要循環(huán)條件為真,循環(huán)體內(nèi)的代碼就會(huì)被執(zhí)行。循環(huán)體可以是一個(gè)簡單的語句或一個(gè)復(fù)雜的代碼塊,包括更多的控制流語句,如條件判斷、嵌套循環(huán)等。
3.循環(huán)條件
循環(huán)條件是一個(gè)邏輯表達(dá)式,其結(jié)果決定了循環(huán)是否繼續(xù)執(zhí)行。在每次循環(huán)迭代開始前(while和for循環(huán))或結(jié)束時(shí)(do-while循環(huán))檢查這個(gè)條件。如果條件為真(即表達(dá)式結(jié)果非0),則循環(huán)繼續(xù)執(zhí)行;如果條件為假(即表達(dá)式結(jié)果為0),則循環(huán)結(jié)束,控制流轉(zhuǎn)移到循環(huán)結(jié)構(gòu)后的下一條語句。
循環(huán)有兩種:無限循環(huán)和有限循環(huán)。無限循環(huán),如地球繞太陽的轉(zhuǎn)動(dòng)或晝夜的連續(xù)交替,理論上永無止境。有限循環(huán),在滿足特定條件后便會(huì)停止,比如在處理完一個(gè)班級(jí)里所有50名學(xué)生的績點(diǎn)計(jì)算之后循環(huán)停止。
循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的基本結(jié)構(gòu)之一,它和順序結(jié)構(gòu)、分支結(jié)構(gòu)共同作為各種復(fù)雜程序的基本構(gòu)造單元。因此,熟練掌握循環(huán)結(jié)構(gòu)的概念及使用方法是程序設(shè)計(jì)最基本的要求。
4.2循環(huán)語句
循環(huán)語句是一種在編程中使用的語句,它允許程序重復(fù)執(zhí)行一段代碼多次,直到滿足某個(gè)條件為止。C語言中提供for、while、do-while這三種循環(huán)控制語句來實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。
4.2.1for語句
1.?for語句的一般形式
for語句的一般形式為
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
循環(huán)體;
循環(huán)體;
其中:表達(dá)式1可以是賦值表達(dá)式、逗號(hào)表達(dá)式或函數(shù)調(diào)用表達(dá)式,它是循環(huán)控制的初始化部分,為循環(huán)中所使用的變量賦初值,即為循環(huán)作準(zhǔn)備;表達(dá)式2通常是關(guān)系表達(dá)式或邏輯表達(dá)式,它是循環(huán)條件,循環(huán)體反復(fù)執(zhí)行多次,必須在循環(huán)條件滿足的情況下(即表達(dá)式2的值非0)才能進(jìn)行,否則循環(huán)終止;表達(dá)式3是賦值表達(dá)式或算術(shù)表達(dá)式,它使循環(huán)變量的值或循環(huán)條件得到修改,使循環(huán)只能進(jìn)行有限次;循環(huán)體是循環(huán)結(jié)構(gòu)中反復(fù)執(zhí)行的語句,它可以是空語句(單獨(dú)用分號(hào)表示的一條語句)、單語句或復(fù)合語句。
2.?for語句的執(zhí)行過程
for語句的執(zhí)行過程如下:
(1)計(jì)算表達(dá)式1。
(2)判斷表達(dá)式2,若其值非0,則執(zhí)行第(3)步;若為0,則執(zhí)行第(6)步。
(3)執(zhí)行循環(huán)體。
(4)計(jì)算表達(dá)式3。
(5)跳轉(zhuǎn)到第(2)步繼續(xù)執(zhí)行。
(6)終止循環(huán),執(zhí)行for語句后的下一條語句。
for語句的執(zhí)行流程如圖4-1所示。
圖4-1for語句的執(zhí)行流程
3.?for語句的說明
for語句的使用說明如下:
(1)在for語句中3個(gè)表達(dá)式都可以缺省,但其中的兩個(gè)分號(hào)不可省。例如,下面的語句是正確的:
for(;;)
①若表達(dá)式1缺省,則必須將表達(dá)式1作為語句安排在for語句之前。如例4-1中的語句
for(s=0,n=1;n<=100;n++)
可改成
s=0;
n=1;
for(;n<=100;n++)
②若表達(dá)式2缺省,則系統(tǒng)默認(rèn)循環(huán)條件為真(非0值),此時(shí),如果不在循環(huán)體中加其他語句進(jìn)行控制,循環(huán)將無限制進(jìn)行下去,即出現(xiàn)死循環(huán)。如將例4-1中的循環(huán)語句改成
for(s=0,n=1;;n++)
s=s+n;
則會(huì)出現(xiàn)死循環(huán)。
③若表達(dá)式3缺省,可將它的語句放在循環(huán)體的最后。如可將例4-1中的循環(huán)語句改成
for(s=0,n=1;n<=100;)
{
s=s+n;
n++;
}
(2)若循環(huán)體中有多個(gè)語句,則循環(huán)體一定要用花括號(hào)括起來,以復(fù)合語句形式出現(xiàn),且循環(huán)體中的變量在每一次循環(huán)過程中其值一般來說是不相同的。
如例4-1中,第一次循環(huán),s的值是1,n的值是1;第二次循環(huán),s的值是3,n的值是2。
(3)循環(huán)體可以為空語句,但必須有分號(hào)(即循環(huán)為空語句)。
(4)要注意循環(huán)終止后循環(huán)變量的值,一般來講該值是循環(huán)變量最后一次循環(huán)值加步長。如例4-1中循環(huán)變量終止后n的值為100+1,即101。
4.程序舉例
例4-2判斷正整數(shù)x是否為素?cái)?shù)。
解題思路素?cái)?shù)是指除1和本身之外不能被其他數(shù)整除的數(shù)。設(shè)一個(gè)標(biāo)志性變量flag,如果其值等于0,則x不為素?cái)?shù);如果其值等于1,則x為素?cái)?shù)。先設(shè)flag?=?1(即假設(shè)x為素?cái)?shù)),另設(shè)變量n由2變化到x?-?1,接著判斷x是否能被n整除,只要有一個(gè)n值能使x被整除,則令flag=0。
N-S圖如圖4-2所示圖4-2例4-2的N-S圖
例4-3從鍵盤輸入任意兩個(gè)正整數(shù)x和y,求出這兩數(shù)的最大公因子。
解題思路首先輸入兩個(gè)正整數(shù),判斷其大小,大的數(shù)放在x中,小的數(shù)放在y中。其次設(shè)r為余數(shù),x與y的關(guān)系可寫為x?=?ky?+?r,由于x與y有公因子f,因此r中必有公因子f。這樣求大的數(shù)x與y的公因子,就可以轉(zhuǎn)化為求小的數(shù)y與r的公因子f。這就是輾轉(zhuǎn)相除法。當(dāng)r?=?0時(shí),y值為最大公因子。
N-S圖如圖4-3所示,
圖4-3例4-3的N-S圖
例4-4輸出斐波那契數(shù)列的前20項(xiàng)之值。
解題思路設(shè)f0、f1、f2是數(shù)列中的3個(gè)數(shù),且有如下關(guān)系:f2?=?f1?+?f0。在循環(huán)計(jì)算過程中,始終使f1、f0指向兩個(gè)相加的相鄰數(shù),f2始終為新計(jì)算出的和值。
4.2.2while語句
1.?while語句的一般形式
while語句是一種當(dāng)型循環(huán)語句,即先判斷條件,后執(zhí)行循環(huán)體。while語句的一般形式為
while(表達(dá)式)
循環(huán)體;
其中:圓括號(hào)中的表達(dá)式一般是關(guān)系表達(dá)式、邏輯表達(dá)式或算術(shù)表達(dá)式,運(yùn)算結(jié)果是一個(gè)邏輯值,或?yàn)檎?非0),或?yàn)榧?0),它是循環(huán)控制的條件;循環(huán)體是循環(huán)反復(fù)執(zhí)行的語句,它可以是空語句、單語句或復(fù)合語句。
2.?while語句的執(zhí)行過程
首先計(jì)算和判斷表達(dá)式的值,如果表達(dá)式的值為“真”(非0),則執(zhí)行循環(huán)體;然后程序轉(zhuǎn)回去計(jì)算和判斷表達(dá)式的值,當(dāng)表達(dá)式的值為“假”(0)時(shí),終止while循環(huán),繼續(xù)執(zhí)行while語句后的下一條語句。
其N-S圖如圖4-4所示。圖4-4while語句的N-S圖
3.程序舉例
例4-5求10個(gè)數(shù)(實(shí)數(shù))中的最大數(shù)。
解題思路設(shè)存放最大數(shù)的變量為max。先輸入第一個(gè)數(shù),并將其值賦給max。然后輸入第二個(gè)數(shù),將其與當(dāng)前max比較,如果輸入的數(shù)大于max,則將max更新為當(dāng)前最大數(shù)。接著輸入第三個(gè)數(shù)、第四個(gè)數(shù)……
N-S圖如圖4-5所示
圖4-5例4-5的算法N-S圖
例4-6用while語句求s?=?1?+?2?+?3?+?…?+?100。
解題思路首先s賦初值0,被加數(shù)n賦初值1,將n的值(1)累加到s中;然后將n加1后的值(2)累加到s中。這樣,n的值不斷加1并被累加到s中,直到將100也累加到s中為止,此時(shí)s中的值即為所求累加和。
4.2.3do-while語句
1.?do-while語句的一般形式
do-while語句的一般形式為
do
{
循環(huán)體;
}while(表達(dá)式);
2.?do-while語句的執(zhí)行過程
do-while語句的作用是,首先無條件地執(zhí)行循環(huán)體一次(無論表達(dá)式的值是否為0),然后計(jì)算和判斷表達(dá)式的值,若表達(dá)式的值為“真”(非0),則程序轉(zhuǎn)回去反復(fù)執(zhí)行循環(huán)體,直到表達(dá)式的值為“假”(0),這時(shí)終止do-while語句,繼續(xù)執(zhí)行do-while語句后的下一條語句。do-while語句的N-S圖如圖4-6所示。圖4-6do-while語句的N-S圖
3.程序舉例
例4-7求12?+?22?+?32?+?…?+?n2?≤?10?000的最大n值。
解題思路定義累加和變量s和正整數(shù)n。當(dāng)s小于或等于10?000的值為真時(shí)輸出n?-?1。
N-S圖如圖4-7所示圖4-7例4-7的N-S圖
例4-8求一個(gè)正整數(shù)(該數(shù)小于65535)的逆序數(shù)。
解題思路對(duì)于x的逆序數(shù),按順序分離它的每個(gè)數(shù)位t,設(shè)變量newd保存逆序數(shù),初始值為0,按表達(dá)式“newd=newd*10+t”將t累加到newd變量中,則可實(shí)現(xiàn)轉(zhuǎn)換。
例4-9用牛頓迭代法求方程3x3?-?4x2?+?3x?-?6?=?0在1.5附近的根,要求絕對(duì)值誤差小于1E-5,并輸出迭代次數(shù)。
解題思路牛頓迭代法實(shí)際上是根據(jù)曲線f(x)的切線與x軸的交點(diǎn)來求非線性方程的近似解,其迭代公式為
x?=?x0?-?f(x0)?/?f1(x0)
其中f1(x0)是f(x)的導(dǎo)函數(shù)在x0點(diǎn)的值。
4.2.4三種循環(huán)的比較
while循環(huán)和do-while循環(huán)由循環(huán)控制變量、循環(huán)條件和循環(huán)體組成,循環(huán)體中包含需要反復(fù)執(zhí)行的操作和循環(huán)控制變量值的修改語句。而for語句則在它的一般形式中有4個(gè)固定位置,用4個(gè)表達(dá)式表示,其結(jié)構(gòu)更加簡潔。
while循環(huán)和for循環(huán)是先判斷循環(huán)條件,后執(zhí)行循環(huán)體,當(dāng)?shù)谝淮闻袛嘌h(huán)條件不滿足時(shí),循環(huán)體一次也不執(zhí)行,稱為當(dāng)型循環(huán);do-while循環(huán)是先執(zhí)行循環(huán)體一次,后判斷循環(huán)條件,所以循環(huán)體至少執(zhí)行一次,稱為直到型循環(huán)。
4.3循環(huán)嵌套
如果一個(gè)循環(huán)完全包含在另一個(gè)循環(huán)的循環(huán)體中,那么這樣的結(jié)構(gòu)稱為循環(huán)嵌套。內(nèi)嵌的循環(huán)中還可以再嵌套循環(huán),這稱為多重循環(huán)。三種循環(huán)控制語句for、while、do-while可以互相嵌套、自由組合。
例4-10求1~1000中的回文數(shù)(正讀和反讀相同的整數(shù))的個(gè)數(shù)。
解題思路回文數(shù)是正讀和反讀相同的整數(shù),即該數(shù)和它的逆序數(shù)相等。
例4-11求2~1000中所有素?cái)?shù)的個(gè)數(shù)及這些素?cái)?shù)的和。
解題思路判斷一個(gè)數(shù)x是否為素?cái)?shù),在例4-2中有詳細(xì)做法,這里只需要遍歷判斷2~1000的每個(gè)數(shù)是否為素?cái)?shù)即可。
二重循環(huán)的執(zhí)行過程是:外循環(huán)執(zhí)行一次,內(nèi)循環(huán)執(zhí)行一遍,之后,跳轉(zhuǎn)到外循環(huán),若外循環(huán)條件滿足,則重復(fù)執(zhí)行一遍內(nèi)循環(huán),如此反復(fù);當(dāng)外循環(huán)條件不滿足時(shí),結(jié)束整個(gè)循環(huán)。通俗地說,執(zhí)行時(shí)由外循環(huán)進(jìn)入內(nèi)循環(huán),退出則相反,由內(nèi)循環(huán)退至外循環(huán),直到外循環(huán)結(jié)束時(shí)才結(jié)束整個(gè)循環(huán)嵌套。
循環(huán)嵌套可以有效解決復(fù)雜問題,但在使用循環(huán)嵌套時(shí),要注意以下幾點(diǎn):
(1)使用花括號(hào)明確定義每個(gè)循環(huán)體。
(2)區(qū)分各層循環(huán)的控制變量名。
(3)保持清晰的縮進(jìn)層次。
(4)嚴(yán)格遵守循環(huán)的包含關(guān)系。
(5)循環(huán)要進(jìn)行初始化
4.4流程轉(zhuǎn)移控制語句
在C語言中,流程轉(zhuǎn)移控制是指通過特定的語句改變程序的執(zhí)行流程。主要的流程轉(zhuǎn)移控制語句有break、continue等語句,這些控制語句允許程序根據(jù)條件跳過某些代碼的執(zhí)行或提前退出循環(huán),使得代碼的邏輯更加靈活。
4.4.1break語句
break語句經(jīng)常放在循環(huán)語句的循環(huán)體中,且通常和if語句一起連用。break語句的一般形式為
break;
其作用是:在滿足一定條件時(shí),提前退出本層循環(huán)(不管循環(huán)條件是否成立),使程序流程轉(zhuǎn)向該循環(huán)結(jié)構(gòu)后的下一條語句。break語句示例如圖4-8所示。圖4-8break語句示例
例4-13求2~1000中超級(jí)素?cái)?shù)的個(gè)數(shù)。
解題思路超級(jí)素?cái)?shù)指一個(gè)素?cái)?shù)從低位到高位依次去掉一位數(shù)后剩下的數(shù)還是素?cái)?shù)。判斷一個(gè)數(shù)x是否為素?cái)?shù),在例4-2中有詳細(xì)介紹,若x是素?cái)?shù),則去掉x的一個(gè)數(shù)位,繼續(xù)判斷x是否為素?cái)?shù)。
4.4.2continue語句
continue語句的一般形式為
continue;
其作用是:提前結(jié)束本次循環(huán),即跳過循環(huán)體中某些還沒有被執(zhí)行的語句,開始新的一次循環(huán)。continue語句示例如圖4-9所示,執(zhí)行循環(huán)體中的continue時(shí),提前結(jié)束本次循環(huán),即循環(huán)體中continue后的語句不執(zhí)行,接著進(jìn)行下一次循環(huán)操作。圖4-9continue語句示例
例4-14從鍵盤輸入10個(gè)不為0的整數(shù),統(tǒng)計(jì)其中負(fù)數(shù)的個(gè)數(shù),并求所有正數(shù)的平均值。
解題思路程序中定義的變量count用于統(tǒng)計(jì)負(fù)數(shù)個(gè)數(shù);變量avg在循環(huán)結(jié)構(gòu)中用于統(tǒng)計(jì)正數(shù)的和,循環(huán)結(jié)束后用于計(jì)算平均值,
4.5循環(huán)結(jié)構(gòu)的綜合示例
例4-15祖沖之一生鉆研自然科學(xué),其主要貢獻(xiàn)在數(shù)學(xué)、天文歷法和機(jī)械制造三個(gè)方面。他在劉徽開創(chuàng)的探索圓周率的精確方法基礎(chǔ)上,首次將圓周率精算到小數(shù)點(diǎn)后第7位,即在3.1415926和3.1415927之間。他提出的“祖率”對(duì)數(shù)學(xué)的研究具有重大貢獻(xiàn)。請(qǐng)利用級(jí)數(shù)展開式求π的近似值,直到某一項(xiàng)的值小于10-8為止。
解題思路這是一個(gè)累加求和問題,但這里的循環(huán)次數(shù)是未知的,只能使用條件控制的循環(huán)來實(shí)現(xiàn)。由于控制循環(huán)結(jié)束的條件是累加的最后一項(xiàng)的絕對(duì)值小于10-8,因此循環(huán)繼續(xù)的條件是累加的最后一項(xiàng)的絕對(duì)值大于或等于10-8。又由于累加項(xiàng)是由分子和分母兩部分組成的,因此累加項(xiàng)的構(gòu)成規(guī)律為
term=sign/n
由于相鄰累加項(xiàng)的符號(hào)是正負(fù)交替變化的,因此可以令分子sign按+1,-1,+1,-1,…交替變化,這可通過反復(fù)取sign自身的相反數(shù)再重新賦值給自己(即sign=-sign)的方法來實(shí)現(xiàn),注意sign需初始化為1。分母n則按1,3,5,7,…即每次遞增2變化,這可通過n=n+2來實(shí)現(xiàn),注意n也需初始化為1。此外,還要設(shè)置一個(gè)計(jì)數(shù)器變量count來統(tǒng)計(jì)累加的項(xiàng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《電路分析基 礎(chǔ)》課件-西電第2章電路分析的基本方法
- 《大學(xué)英語聽力應(yīng)用教程(第1冊(cè))》課件-Unit 12 What is Intelligence
- 杭州開創(chuàng)非融資性擔(dān)保有限公司的擔(dān)保合同
- 天津航道局勞務(wù)派遣合同
- 2025年三明貨運(yùn)從業(yè)資格證考試題庫
- 2025年太原貨運(yùn)資格證試題答案
- 2025年海西下載貨運(yùn)從業(yè)資格證模擬考試系統(tǒng)試題
- 2025年三亞貨運(yùn)從業(yè)資格證模擬考試下載
- 水電工程項(xiàng)目招標(biāo)疑問
- 水果中心配電房施工合同
- 河北省滄州市2022-2023學(xué)年高一年級(jí)上冊(cè)期末考試英語試題(解析版)
- 太常引建康中秋夜為呂叔潛賦課件
- 韓國豪華游輪7日游課件
- 高中數(shù)學(xué)成績分析報(bào)告
- 自來水廠安全教育課件
- 關(guān)愛自己從心開始課件
- 智慧航天物聯(lián)網(wǎng)
- RM60實(shí)用操作課件
- 2024歷史建筑測繪建檔規(guī)程
- 工地水電倉庫管理制度
- 2024上海高校大學(xué)《輔導(dǎo)員》招聘考試題庫及答案
評(píng)論
0/150
提交評(píng)論