C語言程序設(shè)計教程課件:程序控制結(jié)構(gòu)_第1頁
C語言程序設(shè)計教程課件:程序控制結(jié)構(gòu)_第2頁
C語言程序設(shè)計教程課件:程序控制結(jié)構(gòu)_第3頁
C語言程序設(shè)計教程課件:程序控制結(jié)構(gòu)_第4頁
C語言程序設(shè)計教程課件:程序控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

程序控制結(jié)構(gòu)3.1順序結(jié)構(gòu)3.2選擇結(jié)構(gòu)3.3循環(huán)結(jié)構(gòu)3.4其他控制語句本章小結(jié)

3.1順序結(jié)構(gòu)

順序結(jié)構(gòu)就是程序按照語句出現(xiàn)的先后順序依次執(zhí)行。順序結(jié)構(gòu)流程圖如圖3-1所示,它有一個入口、一個出口,依次執(zhí)行語句1和語句2。圖3-1順序結(jié)構(gòu)流程圖

3.1.1表達式語句

C語言程序由若干條語句組成,每條語句以分號結(jié)束。表達式語句是C語言語句中最基本的語句,在表達式后面加一個分號,就構(gòu)成了表達式語句。其形式為:

表達式;

最典型的例子是由賦值表達式構(gòu)成的賦值語句。如:

x=3 /*賦值表達式*/

x=3; /*一個賦值語句*/

3.1.2空語句

空語句是一個只由分號組成的語句。其形式為:

;

空語句什么都不做,當(dāng)程序中某個位置在語法上需要一條語句,但在語義上又不要求執(zhí)行任何操作時,可在此處使用一條空語句。空語句常用于循環(huán)語句中的循環(huán)體,表示循環(huán)體什么都不做。如:

for(i=1;i<=1000;i++); /*表示循環(huán)空轉(zhuǎn)1000次,可用來延時*/

3.1.3復(fù)合語句

復(fù)合語句是用花括號括起來的、由若干條語句組成的語句塊,又稱為分程序,在語法上等價于一條語句?;ɡㄌ杻?nèi)的語句組可以由任何合法的C語言語句組成,可以是說明語句、表達式語句,也可以是復(fù)合語句,若有說明語句,應(yīng)該寫在可執(zhí)行語句的前面。復(fù)合語句的形式為:

{

[說明語句]

語句組;

}

3.2選擇結(jié)構(gòu)

3.2.1if語句 C語言的if語句有三種形式:單分支if語句、雙分支if-else語句和多分支if-elseif語句。1.單分支if語句 單分支if語句的基本形式為: if(條件表達式) 語句

其中:

(1)條件表達式可以是任意的數(shù)值、字符、關(guān)系表達式或邏輯表達式,非0表示真,0表示假。條件表達式必須用圓括號括起來。

(2)語句可以是一條簡單語句或一條復(fù)合語句。

單分支if語句的執(zhí)行流程是:先計算條件表達式,若表達式結(jié)果為真(非0),則執(zhí)行語句;否則,不執(zhí)行語句,而執(zhí)行if語句后面的下一條語句。其流程圖如圖3-2所示。圖3-2單分支if語句流程圖

【例3-1】從鍵盤上輸入兩個整數(shù),將它們從小到大排列,即若第一個數(shù)大于第二個數(shù),則交換順序。

分析:由于計算機內(nèi)存有易覆蓋的特點,因此計算機中交換兩個變量的值只能采取通過第三個變量間接交換的方法來實現(xiàn),如圖3-3所示。圖3-3兩個數(shù)交換的過程

2.雙分支if語句

雙分支if語句的基本形式為:

if(條件表達式)

語句1

else

語句2

雙分支if語句的執(zhí)行流程是:先計算條件表達式,若表達式結(jié)果為真(非0),則執(zhí)行語句1;否則,執(zhí)行語句2。其流程圖如圖3-4所示。圖3-4雙分支if語句流程圖

【例3-2】從鍵盤上輸入兩個整數(shù),求最大值。

程序代碼如下:

【例3-3】計算分段函數(shù):

3.多分支if語句

多分支if語句的基本形式為:

if(條件表達式1)

語句1

elseif(條件表達式2)

語句2

elseif(條件表達式n)

語句n

else

語句n+1

多分支if語句的執(zhí)行流程是:先計算條件表達式1的值,若該值為真(非0),則執(zhí)行語句1;否則,計算條件表達式2的值,若該值為真(非0),就執(zhí)行語句2;依此類推,若各條件表達式的值都為假(0),則執(zhí)行語句n+1。其流程圖如圖3-5所示。圖3-5多分支if語句流程圖

【例3-4】根據(jù)百分制成績score,決定對應(yīng)的五級制評定:大于等于90分為A級,80分及以上且90分以下為B級,70分及以上且80分以下為C級,60分及以上且70分以下為D級,60分以下為E級。

4.if語句的嵌套

【例3-5】計算分段函數(shù):

思考:下面三個程序段,是否能實現(xiàn)上述題目要求?為什么?

3.2.2switch語句

除了多分支if語句,C語言還提供了另外一種多分支選擇結(jié)構(gòu)switch語句,又稱為開關(guān)語句。

switch語句的基本形式為:

switch(表達式)

{

case常量表達式1:語句組1;[break;]

case常量表達式2:語句組2;[break;]

case常量表達式n:語句組n;[break;]

[default:語句組n+1;]

}

switch語句的執(zhí)行流程是:首先計算switch后面表達式的值,逐個和case子句中的常量表達式相比較,當(dāng)switch表達式的值與某個case后面的常量表達式的值相等時,即執(zhí)行其后的語句組。如果該語句組中有break子句,則退出switch語句,若沒有,則不再判斷其他常量表達式的值是否匹配,繼續(xù)執(zhí)行后面其他case語句組。若switch表達式的值與所有case后面的常量表達式的值均不相等,且有default子句,則執(zhí)行default后的語句組。其流程圖如圖3-6所示。圖3-6switch語句流程圖

【例3-6】某商場采用購物打折的優(yōu)惠辦法促銷,每位顧客一次購物:1000元以下不優(yōu)惠;1000元以上,按九五折優(yōu)惠;2000元以上,按九折優(yōu)惠;3000元以上,按八五折優(yōu)惠;5000元以上,按八折優(yōu)惠。編寫程序,輸入顧客的購物款,計算并顯示出顧客的實際應(yīng)付款。

分析:設(shè)顧客的購物款為x,打折后的貨款為y,優(yōu)惠公式為:

因為case后面的常量表達式不能寫成一個表示范圍的邏輯表達式,因此可以將switch表達式設(shè)為(int)x/1000,結(jié)果正好是一個整數(shù);當(dāng)x在3000≤x<5000范圍內(nèi)時,表達式(int)x/1000的值可能為3,也可能為4,這時兩個case子句可以共用同一個語句組。

思考:若省去程序中的所有break,程序運行結(jié)果正確嗎?

3.3循環(huán)結(jié)構(gòu)

3.3.1while語句 while循環(huán)又稱為當(dāng)型循環(huán),先判斷循環(huán)條件再決定是否執(zhí)行循環(huán)體,當(dāng)事先未知循環(huán)的次數(shù)而根據(jù)條件來決定是否循環(huán)時,一般用while語句。while語句的基本形式為: while(條件表達式) 循環(huán)體語句

其中:

(1)“條件表達式”稱為循環(huán)條件,可以是任意的數(shù)值、字符、關(guān)系表達式或邏輯表達式,非0表示真,0表示假。“條件表達式”必須用圓括號括起來。

(2)“循環(huán)體語句”可以是一條簡單語句或一條復(fù)合語句。

while語句的執(zhí)行流程是:先計算表達式的值,判斷其是否為真(非0),若為真(非0),表示循環(huán)條件滿足,則執(zhí)行循環(huán)體,如此重復(fù),直至表達式的值為假(0),表示循環(huán)條件不滿足,退出循環(huán)執(zhí)行后繼語句。其流程圖如圖3-7所示。圖3-7while語句流程圖

【例3-7】編寫程序,求1+2+3+…+100的值。

分析:這是一個求累加和的問題。加數(shù)從1開始有規(guī)律地變化到100,每次遞增1,可以設(shè)置一個整型變量i來表示加數(shù),每循環(huán)一次將當(dāng)前加數(shù)累加后,該整型變量增1,表示下一個加數(shù),用變量sum存放每次累加的和,初始令sum=0。

思考:

(1)若循環(huán)體內(nèi)無語句i++;,則會出現(xiàn)什么情況?

(2)若將循環(huán)體內(nèi)語句sum=sum+i;?與i++;?調(diào)換一下次序,結(jié)果會如何?

(3)若循環(huán)體不用復(fù)合語句(即去掉循環(huán)體的花括號),程序是否正確?

(4)循環(huán)執(zhí)行結(jié)束后,循環(huán)變量i的值為多少?

【例3-8】輸入兩個自然數(shù),求最大公約數(shù)。

分析:通常采用輾轉(zhuǎn)相除法求兩個自然數(shù)的最大公約數(shù)。方法如下:

(1)對于已知的兩個數(shù)m、n,使得m>n;

(2)?m除以n得余數(shù)r;

(3)若r=0,則n即為最大公約數(shù),算法結(jié)束,否則令n->m,r->n,轉(zhuǎn)到第(2)步繼續(xù)執(zhí)行。

【例3-9】編寫程序?qū)⒁徽麛?shù)按逆序形式輸出。

分析:逆序輸出是指先輸出個位數(shù),再輸出十位數(shù)、百位數(shù)……,可以先通過n%10求出個位,然后將n縮小10倍(n=n/10)后求出新的個位,即原來的十位數(shù),再縮小10倍求得百位數(shù),依此類推,直到n等于0時為止。

3.3.2do-while語句

do-while語句的基本形式為:

do

循環(huán)體語句

while(條件表達式);

do-while語句的執(zhí)行流程是:先執(zhí)行循環(huán)體語句一次,然后判斷條件表達式是否成立,若為真(非?0),表示循環(huán)條件滿足,繼續(xù)執(zhí)行循環(huán)體語句,如此重復(fù),直至表達式的值為假(0),退出循環(huán)執(zhí)行后繼語句。其流程圖如3-8所示。圖3-8do-while語句流程圖

【例3-10】編寫程序,求1+3+5+…+99的值。

【例3-11】用公式?/4≈1-1/3+1/5-1/7+…求??的近似值,直到最后一項的絕對值小于10-6為止。

分析:本題也是求累加和的問題,因此循環(huán)體中可用sum=sum+t這樣的求和表達式,其中sum表示累加的和,t是公式的某一項。關(guān)鍵問題是如何求出每一項t?首先考慮1+1/3+1/5+1/7+…相鄰兩項之間的關(guān)系,不難看出它們的分子都是1,分母是1,3,5,7,9…的奇數(shù)序列。若用變量i來存放分母的值,則每求和一次后i應(yīng)增加2;另外,每次累加項不是整數(shù),而是實數(shù),因此t=1.0/i,其中i=i+2。

下面再考慮每加一項后下一項符號的變化,可用單獨一個變量表示符號,每次求下一項時,原來項的符號乘?-1來實現(xiàn)符號變化。

最后確定循環(huán)條件:從上面求?的公式來看,根據(jù)題目要求可用每一項t的絕對值大于10-6來作為循環(huán)的條件。

3.3.3for語句

C語言中通常用for語句來實現(xiàn)已知循環(huán)次數(shù)的循環(huán)結(jié)構(gòu),當(dāng)然它也可以替代while語句或do-while語句實現(xiàn)循環(huán)次數(shù)不確定的情況。

for語句的基本形式為:

for(表達式1;表達式2;表達式3)

循環(huán)體語句

for語句的執(zhí)行流程是:

(1)先計算“表達式1”的值。

(2)再計算“表達式2”的值,并判斷其是否為真,若為真(非0),則執(zhí)行循環(huán)體語句;若為假(0),則跳出循環(huán),執(zhí)行for語句的后續(xù)語句。

(3)循環(huán)體語句執(zhí)行后,計算“表達式3”的值,然后轉(zhuǎn)到步驟(2)重復(fù)執(zhí)行。

其流程圖如圖3-9所示。圖3-9for語句流程圖

【例3-12】求n!,即計算1*2*3*…*n的值。

分析:求多個數(shù)累積與累加和的算法思想類似,只是要注意存放累積數(shù)的變量初值應(yīng)該為1。

【例3-13】輸出所有的水仙花數(shù)。水仙花數(shù)是指一個三位數(shù),其各位數(shù)字的立方和等于該數(shù)本身,如153是一個水仙花數(shù),153=13+53+33。

分析:從100到999每個三位數(shù)依次判斷是否為水仙花數(shù),用一個循環(huán)變量表示該三位數(shù),每個三位數(shù)都拆分為個位、十位和百位三個數(shù)字,再比較三個數(shù)字的立方和是否等于該數(shù)本身。

3.3.4循環(huán)語句的嵌套

循環(huán)語句的嵌套是指在一個循環(huán)體語句內(nèi)又包含了一個完整的循環(huán)語句,內(nèi)嵌的循環(huán)體還可以再嵌套循環(huán),形成多重循環(huán)。在實際應(yīng)用中,三種循環(huán)語句可以自身嵌套,也可相互嵌套。但無論哪種嵌套形式,都要層次清楚,不能出現(xiàn)交叉。在編程或閱讀程序時,要注意各層的循環(huán)變量的變化。

【例3-14】編寫程序,打印如圖3-10所示的圖形。圖3-10例3-14運行結(jié)果圖

分析:這是一個按照規(guī)則變化的字符圖形,一共有4行,每行由空格和星號構(gòu)成,空格和星號的個數(shù)與行有關(guān):每行前面的空格數(shù)按行減少,每行后面的星號按行增加。

思考:如何輸出如圖3-11所示的菱形?圖3-11菱形的字符圖形

打印字符圖形的一般方法是:

(1)先分割圖形,將有共同規(guī)律的圖形或上下對稱的圖形作為一個兩重循環(huán)可打印的部分,從上到下依次打印各部分圖形。其中外循環(huán)變量代表行,內(nèi)循環(huán)變量代表列。

(2)圖形的每行都是由一組或若干組空格字符、非空格字符和一個回車組成,重要的是找到字符數(shù)與行號之間的關(guān)系。

【例3-15】百元買百雞問題?,F(xiàn)有100元,要求買100只雞。假定母雞每只3元,公雞每只2元,小雞每只5角。編程列出所有可能的購雞方案。

分析:設(shè)母雞、公雞、小雞的數(shù)量分別為x、y、z,根據(jù)題目要求,列出方程組:

其中包括3個未知數(shù),2個方程。此題有若干個解,可采用試湊法(也稱為窮舉法)來實現(xiàn),將可能出現(xiàn)的各種情況一一羅列測試,判斷是否滿足條件。

可用如下兩種方法實現(xiàn):

方法一利用了三重循環(huán)分別表示三只雞的數(shù)量,考慮了所有的購雞情況,最內(nèi)層的循環(huán)體一共執(zhí)行了1000000次;而方法二進行了優(yōu)化,因為三只雞總數(shù)為100只,若已知母雞和公雞的數(shù)量就可以通過100-x-y獲得小雞的數(shù)量,同時根據(jù)總共價格只有100元,可以得到母雞的數(shù)量不會超過33只,公雞的數(shù)量也不會超過50只,這樣最內(nèi)層循環(huán)體只需執(zhí)行1734次。運行結(jié)果如圖3-12所示。圖3-12例3-15運行結(jié)果圖

3.4其他控制語句

3.4.1goto語句 goto語句的基本形式為: goto標(biāo)號; … 標(biāo)號:語句其中:“標(biāo)號”的命名規(guī)則同標(biāo)識符,表示goto語句的轉(zhuǎn)向入口;“標(biāo)號:”后的語句是任意C語言語句。goto語句通常與if語句一起配合使用,表示滿足條件時將程序的執(zhí)行流程轉(zhuǎn)到標(biāo)號所指定的語句處。

【例3-16】用goto語句實現(xiàn)1+2+3+…+n,n的值從鍵盤輸入。

3.4.2break語句和continue語句

程序中有時需要在滿足某種條件時改變循環(huán)的正常流程,因此,C語言提供了break和continue兩種循環(huán)轉(zhuǎn)移語句。

1.break語句

break語句有兩個作用:一是用于switch語句中,出現(xiàn)在case子句后,強制終止switch語句的執(zhí)行,退出switch結(jié)構(gòu),保證多分支情況的正確執(zhí)行;二是用于循環(huán)語句中,強制終止本層循環(huán),轉(zhuǎn)到循環(huán)的后續(xù)語句執(zhí)行。其流程圖如圖3-13所示。圖3-13break語句流程圖

【例3-17】從鍵盤輸入一個正整數(shù),判斷它是否為素數(shù)。

分析:素數(shù)是指大于1,且除了1和它本身以外,不能被其他任何數(shù)整除的數(shù)。為了判斷某數(shù)m是否為素數(shù),最簡單的方法是用2~m-1中的數(shù)逐個去除m,看是否能整除,只要能被其中某個數(shù)整除,m就

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論