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

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論