版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5.1函數(shù)的定義和調(diào)用
5.1.1
函數(shù)的定義函數(shù)由函數(shù)名、參數(shù)和函數(shù)體組成。函數(shù)名是用戶為函數(shù)的命名,用于區(qū)別其他函數(shù),函數(shù)名的命名規(guī)則和變量的命名規(guī)則是一樣的。函數(shù)的參數(shù)用來接收傳遞給它的數(shù)據(jù)。
函數(shù)體是函數(shù)完成某些功能的一組語句。函數(shù)定義的一般形式如下:下一頁返回5.1函數(shù)的定義和調(diào)用
其中,數(shù)據(jù)類型是函數(shù)返回值的類型。函數(shù)可以有返回值,也可以沒有返回值。如果忽略函數(shù)返回值類型,則返回值類型為int型。如果函數(shù)沒有返回值,則將類型定義為void,稱為void類型函數(shù)。形式參數(shù)(簡(jiǎn)稱“形參”)列表由逗號(hào)隔開的變量名構(gòu)成,依次說明了每個(gè)形參的類型和名稱。函數(shù)可以有多個(gè)形參,也可以沒有形參。多個(gè)形參之間用逗號(hào)分隔。即使沒有形參,這一對(duì)括號(hào)也不能省略。無參數(shù)函數(shù)的參數(shù)也可以寫成void。函數(shù)的函數(shù)體可以包含變量的定義和執(zhí)行語句,它給出了函數(shù)功能實(shí)現(xiàn)的細(xì)節(jié),它既可以是一條語句,也可以是若干條語句的組合。此外,函數(shù)體也可以空,即沒有任何語句??蘸瘮?shù)可以出現(xiàn)在程序開發(fā)過程中,表示程序中將包含這個(gè)函數(shù),
只是還沒有對(duì)它進(jìn)行詳細(xì)設(shè)計(jì),隨后將編寫它的函數(shù)體。分析例5-1所需函數(shù)的定義,假設(shè)三個(gè)點(diǎn)的坐標(biāo)分別是A(x1,y1
)、
B(x2,y2
)、
C(x3,y3
),
如圖5-1所示。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
已知坐標(biāo)軸上任意兩點(diǎn)坐標(biāo)A(x1,y1
)、
B(x2,y2
),
求c(即邊AB的長(zhǎng)度),
距離公式表示為求解邊BC、邊AC的長(zhǎng)度時(shí),采用的公式相同,所以可以把求解邊長(zhǎng)的需求用一個(gè)函數(shù)實(shí)現(xiàn),該函數(shù)需要兩個(gè)點(diǎn)的坐標(biāo),并對(duì)兩個(gè)點(diǎn)的坐標(biāo)數(shù)據(jù)加工處理,最終輸出兩個(gè)點(diǎn)之間的距離。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
函數(shù)的定義過程如下:(1)函數(shù)名。
假設(shè)函數(shù)名為distance。(2)數(shù)據(jù)類型。
這里先沒有返回值,
即數(shù)據(jù)類型是void。(3)形式參數(shù)。
該函數(shù)需要兩個(gè)點(diǎn)的坐標(biāo),
即4個(gè)實(shí)數(shù)數(shù)據(jù)。(4)函數(shù)體。
根據(jù)距離公式求解距離。(5)輸出兩點(diǎn)之間的距離。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
例5-1求兩點(diǎn)之間的距離函數(shù)程序代碼如下:注意:(1)對(duì)比開平方函數(shù)sqrt、
函數(shù)sqrtf與函數(shù)sqrtl的區(qū)別和使用。(2)在書寫函數(shù)時(shí),
建議先寫完函數(shù)的基本組成,
然后填補(bǔ)詳細(xì)的內(nèi)容,
即先寫一個(gè)空函數(shù),再具體寫形參列表和函數(shù)體。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
5.1.2
函數(shù)的返回C語言設(shè)有返回語句return。return語句會(huì)結(jié)束被調(diào)用函數(shù)的執(zhí)行,使程序返回主調(diào)函數(shù)去執(zhí)行,同時(shí)向調(diào)用者返回計(jì)算結(jié)果(函數(shù)返回值)。返回語句一般有以下兩種形式:第一種形式,返回語句只起返回主調(diào)函數(shù)的作用,沒有返回值。第二種形式,
返回語句的功能有兩項(xiàng):其一,返回主調(diào)函數(shù);其二,將表達(dá)式給定的返回值送給主調(diào)函數(shù)。
這里的表達(dá)式有時(shí)是常量或變量,有時(shí)是復(fù)雜的表達(dá)式,表達(dá)式的括號(hào)也可以省略。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
返回值表達(dá)式的類型必須和該函數(shù)的數(shù)據(jù)類型一致。對(duì)于沒有返回值的函數(shù),如果函數(shù)的數(shù)據(jù)類型指定為void,則return語句不能帶有表達(dá)式,或者直接不寫return語句。一個(gè)函數(shù)中可以沒有return語句,這種函數(shù)運(yùn)行到函數(shù)體的最后一條語句后,會(huì)自動(dòng)返回調(diào)用它的函數(shù)。一個(gè)函數(shù)還可以有一個(gè)以上的return語句,
程序執(zhí)行到哪一條return語句,
則那條re-turn語句就起作用?;仡櫪担笨芍?,判斷是否可以組成三角形時(shí),需要先計(jì)算三條邊的距離,所以需要保存求得的三角形邊長(zhǎng)。設(shè)置distance函數(shù)具有返回值,并且返回值就是通過兩點(diǎn)坐標(biāo)計(jì)算得到的距離,且該數(shù)值是float型。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
改寫5.1.1節(jié)中的distance函數(shù)如下:由return的第二種形式可知,該函數(shù)的函數(shù)體也可以寫成一句,即上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
說明:在后面的程序中,將調(diào)用此處的函數(shù)distance。通過函數(shù)distance,可以得到三條邊的長(zhǎng)度。根據(jù)三條邊之間的關(guān)系,判斷其是否可以組成三角形,可將此寫成一個(gè)函數(shù),這里不妨取函數(shù)名為isTriangle。由數(shù)學(xué)知識(shí)可知,需要判斷的數(shù)據(jù)是三條邊的邊長(zhǎng),所以該函數(shù)的形參列表中是三個(gè)數(shù)據(jù)類型為float的邊長(zhǎng)。根據(jù)任意兩邊之和大于第三邊的判斷定理,判斷的條件就是:該三角形中的三條邊滿足判定定理時(shí),表示可以組成三角形;否則,無法組成三角形。判斷的結(jié)果為是三角形和不是三角形兩種,這樣的邏輯值在程序中用布爾變量表示,由于C語言中沒有布爾變量,所以在通常情況下用0表示邏輯假,1表示邏輯真。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
綜上分析,函數(shù)isTriangle需要三個(gè)形參,三條邊的數(shù)據(jù)均是float型;函數(shù)有返回值,且數(shù)據(jù)是int型。所以,定義函數(shù)isTriangle如下:上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
同樣,根據(jù)三角形的三條邊長(zhǎng)求其面積也可以寫成一個(gè)函數(shù),這里不妨取函數(shù)名為area。由海倫公式可知,需要的數(shù)據(jù)是三條邊長(zhǎng),所以函數(shù)area的形參列表中有三個(gè)形參,數(shù)據(jù)類型都是float;對(duì)于數(shù)據(jù)的處理就是求解海倫公式的實(shí)現(xiàn);例5-1要求在求得面積后輸出,所以函數(shù)area可以沒有返回值,也可以把得到的結(jié)果返回。所以,定義函數(shù)area如下:上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
5.1.3
函數(shù)的調(diào)用當(dāng)一個(gè)函數(shù)需要使用某個(gè)函數(shù)的功能時(shí),就可以調(diào)用該函數(shù),并給出實(shí)參(如果是帶參數(shù)的函數(shù)),如果沒有參數(shù),則實(shí)參列表空置。調(diào)用函數(shù)的格式如下:函數(shù)名(實(shí)參列表)上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
說明:(1)實(shí)參可以是變量、常量或任何正確的表達(dá)式,各參數(shù)間用逗號(hào)分開。(2)實(shí)參與形參要一一對(duì)應(yīng)地進(jìn)行數(shù)據(jù)傳遞。也就是說,實(shí)參的個(gè)數(shù)與順序必須和形參的個(gè)數(shù)與順序相同,實(shí)參的數(shù)據(jù)類型必須和對(duì)應(yīng)的形參數(shù)據(jù)類型相同,否則將自動(dòng)進(jìn)行類型轉(zhuǎn)換將實(shí)參轉(zhuǎn)換為形參的類型。也可以在調(diào)用函數(shù)時(shí),使用強(qiáng)制類型轉(zhuǎn)換來使實(shí)參的類型與形參一致。(3)調(diào)用沒有形參的函數(shù)時(shí),不需要提供實(shí)參,小括號(hào)內(nèi)可以為空,但小括號(hào)是必須要有的。(4)實(shí)參的作用就是把參數(shù)的具體數(shù)值傳遞給被調(diào)用的函數(shù),這樣就實(shí)現(xiàn)了函數(shù)間的數(shù)據(jù)交換。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
函數(shù)調(diào)用可以出現(xiàn)在以下兩種情況:(1)無返回值的函數(shù)(即過程)通常以語句的形式出現(xiàn),
一般用于void類型的函數(shù)。例如,函數(shù)area如下:area(BC,AC,AB);其中,BC、AC、AB是float型的變量,是調(diào)用函數(shù)area的實(shí)參。(2)有返回值的函數(shù)(即非void類型的函數(shù))通常作為表達(dá)式的一部分,
通過調(diào)用函數(shù)的表達(dá)式來接收被調(diào)函數(shù)返回的數(shù)據(jù),該數(shù)據(jù)在大多數(shù)情況下會(huì)參與后續(xù)的數(shù)據(jù)處理,且是后續(xù)數(shù)據(jù)處理的重要數(shù)據(jù)。例如,函數(shù)distance如下:BC=distance(xB,yB,xC,yC);其中,xB、yB、xC、yC是已經(jīng)賦值的float型變量,是調(diào)用函數(shù)distance的實(shí)參。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
5.1.4
函數(shù)調(diào)用過程如果函數(shù)A調(diào)用了函數(shù)B,那么函數(shù)A稱為主調(diào)函數(shù),函數(shù)B稱為被調(diào)函數(shù)。當(dāng)調(diào)用函數(shù)發(fā)生時(shí),系統(tǒng)依次執(zhí)行如下過程:(1)主調(diào)函數(shù)A計(jì)算每個(gè)實(shí)參的參數(shù)值。(2)用實(shí)參初始化對(duì)應(yīng)的形參。(3)執(zhí)行被調(diào)函數(shù)B的函數(shù)體的每一條語句,
直到遇到return語句或函數(shù)體結(jié)束符。(4)計(jì)算return后面表達(dá)式的值,
將其作為函數(shù)的返回值。(5)回到主調(diào)函數(shù),
在函數(shù)調(diào)用的位置用函數(shù)的返回值代替。例如,main函數(shù)執(zhí)行調(diào)用語句:BC=distance(xB,yB,xC,yC);上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
函數(shù)調(diào)用時(shí),系統(tǒng)首先計(jì)算實(shí)參xB、yB、xC、yC的值;然后將其傳遞給形參x1、y1、x2、y2,執(zhí)行函數(shù)體,并計(jì)算兩點(diǎn)之間的距離;最后,返回main函數(shù),將函數(shù)的返回值賦值給變量BC。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
5.1.5
函數(shù)參數(shù)的值傳遞值傳遞是指主調(diào)函數(shù)把實(shí)參的值復(fù)制給形參。在C語言中,形參實(shí)際上是指定類型的變量,而實(shí)參可以是變量、常量或由運(yùn)算符連接的表達(dá)式。實(shí)參是用來提供實(shí)際數(shù)據(jù)的,
而形參將接收數(shù)據(jù)。這種調(diào)用方式一般稱為值調(diào)用。在函數(shù)被調(diào)用時(shí),編譯系統(tǒng)會(huì)為形參變量分配內(nèi)存,并將實(shí)參的值存入對(duì)應(yīng)形參的內(nèi)存單元。當(dāng)函數(shù)返回時(shí),編譯系統(tǒng)會(huì)回收形參分配的內(nèi)存空間。例5-1的函數(shù)采用的都是值傳遞。為了減少形參個(gè)數(shù),簡(jiǎn)化表達(dá),本節(jié)先分析兩個(gè)整數(shù)交換的示例?!纠担病坎捎弥祩鬟f的方式,設(shè)計(jì)兩個(gè)實(shí)數(shù)的交換函數(shù)swap?!痉治觥吭诘冢舱聦?shí)訓(xùn)3中,介紹過兩個(gè)數(shù)的交換,這里只需要把交換過程的相關(guān)語句,組成一個(gè)函數(shù)swap即可。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
程序的代碼如下:上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
運(yùn)行結(jié)果:分析程序運(yùn)行的結(jié)果可以發(fā)現(xiàn),在函數(shù)swap中交換以后,數(shù)據(jù)確實(shí)發(fā)生了變化,但在主函數(shù)中調(diào)用函數(shù)swap后,變量a和變量b中的數(shù)值依然和調(diào)用函數(shù)swap前是一樣的。也就是說,函數(shù)swap并沒有真正實(shí)現(xiàn)數(shù)據(jù)的交換,導(dǎo)致出現(xiàn)這種情況的原因就是這個(gè)函數(shù)的參數(shù)傳遞是一種值傳遞。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
下面詳細(xì)分析函數(shù)調(diào)用過程中實(shí)參和形參的變化。實(shí)參變量a、b的值被復(fù)制傳遞給被調(diào)用函數(shù)的形參變量x、y,于是在被調(diào)用函數(shù)swap中,變量x的值是300,變量y的值是400。所以,函數(shù)swap第1條printf語句的結(jié)果是“swap中交換前:x=300,y=400”。在函數(shù)swap實(shí)現(xiàn)功能的過程中,臨時(shí)變量z被賦予變量x中的數(shù)值,則變量z存儲(chǔ)的數(shù)據(jù)是300;變量x被賦予變量y中的數(shù)值,則變量x存儲(chǔ)的是數(shù)據(jù)400;變量y又被賦予變量z的數(shù)值,則變量y存儲(chǔ)的是數(shù)據(jù)300。于是,在執(zhí)行3條語句后,x=400,y=300,z=300,所以,函數(shù)swap第2條printf語句的結(jié)果是“swap中交換后:x=400,y=300”。當(dāng)函數(shù)swap執(zhí)行完,回到主函數(shù)時(shí),對(duì)實(shí)參變量a、b的值沒有影響,所以主函數(shù)中的兩條printf語句得到的結(jié)果是一樣的。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
以上過程可以描述為如下過程:(1)main函數(shù)定義變量a、
b,
并初始化,
如圖5-2所示。(2)main函數(shù)調(diào)用函數(shù)swap,
實(shí)參a、
b將值傳遞給形參x、
y,
如圖5-3所示。(3)swap函數(shù)交換x、
y的值,
如圖5-4所示。(4)返回main函數(shù),
輸出a、
b的值,
a、
b的值沒有改變,
如圖5-5所示。這種處理方式可以有效地提高函數(shù)的獨(dú)立性,函數(shù)之間只能通過參數(shù)和返回值進(jìn)行數(shù)據(jù)交換,使函數(shù)之間的關(guān)系比較簡(jiǎn)單,不會(huì)產(chǎn)生副作用。但有時(shí)也會(huì)帶來一些麻煩,假如我們確實(shí)希望通過swap函數(shù)改變main函數(shù)中變量a、b的值,采用該程序是無法實(shí)現(xiàn)的。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
但是,例5-1所需要的三個(gè)函數(shù)distance、area和isTriangle都不需要改變實(shí)參的值,只需返回值,那么,三個(gè)函數(shù)的調(diào)用都可以實(shí)現(xiàn)函數(shù)的功能。接下來,分析例5-1的代碼實(shí)現(xiàn)。通過圖5-6所示的該程序流程圖,可以看清楚程序的結(jié)構(gòu)。根據(jù)流程圖分析,
可以知道對(duì)于處理框“計(jì)算三邊的邊長(zhǎng)”
只需三次調(diào)用距離函數(shù)dis-tance即可;對(duì)于處理框“能否組成三角形?”,調(diào)用函數(shù)isTriangle即可;對(duì)于處理框“計(jì)算并輸出面積”,
可根據(jù)函數(shù)isTriangle的返回值來決定是否計(jì)算該三角形的面積:如果函數(shù)isTri-angle的返回值是0,表示不可以組成三角形,則輸出“NO”;如果函數(shù)isTriangle的返回值是1,表示可以組成三角形,則需要調(diào)用函數(shù)area來實(shí)現(xiàn)計(jì)算三角形面積的功能,然后輸出該三角形的面積。按照這樣的順序,將各函數(shù)在主函數(shù)中調(diào)用后,便可以解決例5-1的問題。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
程序的代碼如下:上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
運(yùn)行結(jié)果:上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
5.1.6
函數(shù)的聲明前面章節(jié)的程序總是把被調(diào)函數(shù)的定義放在main函數(shù)前,也就是放在函數(shù)調(diào)用出現(xiàn)之前。實(shí)際上,C程序中的函數(shù)是沒有固定順序的,可以將被調(diào)函數(shù)的定義放在函數(shù)調(diào)用之后。這時(shí),C語言要求在函數(shù)調(diào)用前對(duì)被調(diào)函數(shù)進(jìn)行聲明。函數(shù)聲明可以幫助編譯器進(jìn)行更全面、更嚴(yán)格的語法檢查,避免一些程序錯(cuò)誤。編譯器在掃描程序時(shí),首先遇到函數(shù)調(diào)用。此時(shí),它并沒有獲得有關(guān)被調(diào)函數(shù)的信息,
所以無法全面檢查函數(shù)調(diào)用是否正確。例如,調(diào)用的函數(shù)是否存在,是否提供了足夠數(shù)量的實(shí)參,
實(shí)參的類型是否和形參一致,是否正確使用了函數(shù)返回值等;另外,無法自動(dòng)進(jìn)行類型轉(zhuǎn)換來將實(shí)參的類型轉(zhuǎn)換為形參的類型。這樣編譯器只能假設(shè)函數(shù)調(diào)用是正確的,
而程序運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
函數(shù)聲明的格式:數(shù)據(jù)類型函數(shù)名(形式參數(shù)列表);函數(shù)聲明也稱為函數(shù)原型,從功能上理解,其實(shí)函數(shù)聲明就是一種函數(shù)說明語句,就像變量說明語句一樣。函數(shù)聲明一般寫在程序的開頭或者放在頭文件中。其中,形參列表可以按函數(shù)的定義順序,依次寫數(shù)據(jù)類型和形參變量名;也可以只寫數(shù)據(jù)類型,不寫參數(shù)變量名,
因?yàn)榫幾g器只需要知道形參的個(gè)數(shù)和類型,對(duì)形參的名字并不關(guān)心。例如,函數(shù)distance的函數(shù)聲明可以如下表示:floatdistance(floatx1,floaty1,floatx2,floaty2);或floatdistance(float,float,float,float);上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
可以看出,函數(shù)聲明類似于函數(shù)定義的首部,區(qū)別是在后面要帶有一個(gè)分號(hào)。使用函數(shù)聲明來實(shí)現(xiàn)例5-1功能的程序代碼如下:上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
函數(shù)聲明既可以放在函數(shù)體外,
也可以放在函數(shù)體內(nèi)。
上述程序?qū)瘮?shù)distance、
isTri-angle、area的聲明也可以放在main函數(shù)體內(nèi)。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
此時(shí),函數(shù)聲明僅對(duì)main函數(shù)有效,其他函數(shù)如需調(diào)用函數(shù)distance、isTriangle、area,也要增加類似聲明。在什么情況下,需要使用函數(shù)聲明呢?這與程序中各函數(shù)的書寫順序有關(guān)。
在多個(gè)函數(shù)的程序中,如果函數(shù)在程序清單中出現(xiàn)的順序遵守“先定義后引用”的原則,通常就不需要使用函數(shù)聲明。例如,函數(shù)distance、isTriangle、area、main在程序Exp5-1-1c中定義的順序可以簡(jiǎn)寫如下:①定義函數(shù)distance。②定義函數(shù)isTriangle。③定義函數(shù)area。④定義函數(shù)main。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
在多個(gè)函數(shù)的程序中,如果各個(gè)函數(shù)定義的順序上出現(xiàn)了
“先引用后定義”
的情況,也就是在定義一個(gè)函數(shù)時(shí),它需要用到后邊定義的函數(shù)時(shí),則應(yīng)該事先在程序開頭寫一條被引用函數(shù)的函數(shù)聲明語句。例如,函數(shù)distance、isTriangle、area、main在程序Exp5-1-2c中定義的順序可以簡(jiǎn)寫如下:①定義函數(shù)main。②定義函數(shù)distance。③定義函數(shù)isTriangle。④定義函數(shù)area。在這種順序下,函數(shù)main的定義中需要調(diào)用它后續(xù)定義的函數(shù)distance、isTriangle、area,所以在程序的開頭處需要對(duì)這三個(gè)函數(shù)的聲明語句,在這種情況下,函數(shù)之間也是可以彼此調(diào)用的。例如,在函數(shù)area中可以調(diào)用函數(shù)isTriangle。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
【練習(xí)】(1)定義一個(gè)函數(shù)sum,
求兩個(gè)整型數(shù)的和,
要求有返回值。(2)定義一個(gè)函數(shù)avg,
求三個(gè)整型數(shù)的均值,
要求有返回值。(3)定義一個(gè)函數(shù)div,
求兩個(gè)整型數(shù)據(jù)相除后的余數(shù),
要求有返回值。
當(dāng)除數(shù)是0時(shí),返回-1;否則,返回余數(shù)。提示:若一個(gè)函數(shù)有一條或多條return語句,那么程序執(zhí)行到哪一條return語句,則那條return語句就起作用。上一頁下一頁返回5.1函數(shù)的定義和調(diào)用
(4)給定一個(gè)正整數(shù)N,
如果N是另一個(gè)正整數(shù)的平方,
則N為平方數(shù)。
定義一個(gè)函數(shù),判斷一個(gè)正整數(shù)N是否為平方數(shù)。提示:第1種方法:暴力搜索法,即從1開始遍歷,既可以遍歷到sqrt(N),也可以遍歷到N。判斷i的平方是否等于N。如果相等,則N是平方數(shù);否則,N不是平方數(shù)。第2種方法:等差數(shù)列法,任何一個(gè)平方數(shù)都可以拆分成一個(gè)等差數(shù)列后求和。上一頁返回5.2局部變量和全局變量
5.2.1
代碼塊用一對(duì)大括號(hào)將多條語句包含起來,就構(gòu)成一個(gè)復(fù)合語句。形式如下:{語句1語句2?}C語言允許在復(fù)合語句內(nèi)包含變量的定義。形式如下:變量定義多條語句}下一頁返回5.2局部變量和全局變量
下面是一個(gè)復(fù)合語句的實(shí)例:if(x>y){inttemp;temp=x;x=y;y=temp;}在語法上,可以將復(fù)合語句看作一條語句。例如,if語句的語法格式如下:if(表達(dá)式)語句語法格式要求在表達(dá)式后面帶有一條語句,因此如果需要使用多條語句來完成操作,就必須將這些語句組織成一個(gè)復(fù)合語句,才能符合語法格式的要求。
這種復(fù)合語句稱為一個(gè)代碼塊,也叫語句塊或者程序塊。函數(shù)的函數(shù)體就是一個(gè)代碼塊,在函數(shù)體內(nèi)也可以含有內(nèi)部代碼塊。上一頁下一頁返回5.2局部變量和全局變量
5.2.2
局部變量在任何一個(gè)代碼塊內(nèi)定義的變量叫作局部變量,也叫作內(nèi)部變量。局部變量只能在定義它的代碼塊內(nèi)使用,即局部變量的作用域僅限于定義它的代碼塊內(nèi):從定義的位置開始,到所在的代碼結(jié)束。默認(rèn)情況下,局部變量具有以下兩個(gè)特性:(1)動(dòng)態(tài)存儲(chǔ)期限。
變量的存儲(chǔ)期限(也稱為變量的生存期)指的是程序執(zhí)行過程中變量存在的時(shí)間。函數(shù)的局部變量具有動(dòng)態(tài)存儲(chǔ)期限,調(diào)用該函數(shù)時(shí),系統(tǒng)自動(dòng)分配局部變量的存儲(chǔ)空間,函數(shù)執(zhí)行結(jié)束返回時(shí),系統(tǒng)自動(dòng)回收局部變量的存儲(chǔ)空間。所以,局部變量只在函數(shù)執(zhí)行期間是存在的,當(dāng)再次調(diào)用該函數(shù)時(shí),將重新為其分配存儲(chǔ)空間。因此,在兩次函數(shù)調(diào)用之間,局部變量不能保留原來的值。上一頁下一頁返回5.2局部變量和全局變量
(2)代碼塊作用域。
變量的作用域(也稱為變量的可見范圍)指的是可以通過變量名直接訪問變量的程序代碼范圍。局部變量的作用域僅限于函數(shù)體內(nèi),具體而言,是從變量的定義開始一直到函數(shù)體的結(jié)束,在其他函數(shù)中無法通過變量名直接訪問該變量。既然局部變量的作用域無法擴(kuò)展到其所屬函數(shù)之外,那么就可以在其他函數(shù)中定義同名的變量。main函數(shù)中定義的變量也屬于局部變量。函數(shù)的形參也是局部變量。形參和一般局部變量的區(qū)別是:在調(diào)用函數(shù)時(shí),將利用實(shí)參的值對(duì)形參進(jìn)行初始化。具體而言,在代碼塊(包括函數(shù)體)中定義的變量都屬于局部變量。
程序進(jìn)入代碼塊時(shí),為這些變量分配存儲(chǔ)空間;在退出代碼塊時(shí),回收這些變量的存儲(chǔ)空間。
代碼塊中的變量的作用域限定在定義該變量的代碼塊內(nèi)。上一頁下一頁返回5.2局部變量和全局變量
【例5-3】從鍵盤上輸入2個(gè)整型數(shù)據(jù),先輸入一個(gè)較小的整型數(shù)據(jù),然后輸入一個(gè)較大的整型數(shù)據(jù)。設(shè)計(jì)一個(gè)函數(shù)sum,該函數(shù)可以計(jì)算這兩個(gè)整型數(shù)據(jù)之間所有整數(shù)的和(包括邊界數(shù)據(jù)),最后返回求和的結(jié)果。在主函數(shù)中調(diào)用該函數(shù),并輸出?!痉治觥亢瘮?shù)sum要想得到兩個(gè)整數(shù)之間的所有整數(shù)之和,就得遍歷該區(qū)間內(nèi)的每個(gè)整數(shù),這個(gè)遍歷的過程就需要一個(gè)輔助整型變量,該變量是函數(shù)sum內(nèi)的局部變量。此外,還需要一個(gè)整型變量來存儲(chǔ)求和的結(jié)果,這個(gè)變量是在函數(shù)sum中才需要的,所以也是局部變量。當(dāng)然,函數(shù)sum還需量?jī)蓚€(gè)形參,這兩個(gè)形參用于說明求和的邊界,所以這兩個(gè)形參也是局部變量。上一頁下一頁返回5.2局部變量和全局變量
程序的代碼如下:上一頁下一頁返回5.2局部變量和全局變量
上一頁下一頁返回5.2局部變量和全局變量
運(yùn)行結(jié)果:上一頁下一頁返回5.2局部變量和全局變量
當(dāng)然,在不同的函數(shù)中可以使用相同的變量名,它們表示不同的數(shù)據(jù),分配不同的內(nèi)存,互不干擾,也不會(huì)發(fā)生混淆。所以,函數(shù)sum可以用下面的代碼實(shí)現(xiàn):上一頁下一頁返回5.2局部變量和全局變量
5.2.3
全局變量作用域從定義點(diǎn)開始直到程序文件結(jié)束的變量,稱為全局變量,也稱為外部變量。外部變量具有以下兩個(gè)不同于局部變量的特性:(1)靜態(tài)存儲(chǔ)期限。
在程序執(zhí)行過程中,
外部變量始終具有固定的存儲(chǔ)空間,
所以可以永久保留變量的值。(2)文件作用域。
外部變量的作用域從變量的定義開始,
直到程序文件的結(jié)束。
所以,在外部變量定義之后的所有函數(shù)都可以通過變量名訪問它。由于外部變量可以被多個(gè)函數(shù)共享,因此多個(gè)函數(shù)可以利用外部變量進(jìn)行數(shù)據(jù)交換。這是外部變量的一個(gè)主要用途。上一頁下一頁返回5.2局部變量和全局變量
【例5-4】從鍵盤上輸入n個(gè)整型數(shù)據(jù),存放在數(shù)組中,然后找出該數(shù)組中的最大值和最小值。設(shè)計(jì)一個(gè)函數(shù)find,實(shí)現(xiàn)同時(shí)找到最大值和最小值的功能,
在主函數(shù)中調(diào)用該函數(shù),并輸出數(shù)組的最大值和最小值?!痉治觥窟@里需要找到數(shù)組的最大值和最小值,并且把這兩個(gè)數(shù)值返回主函數(shù),由于一個(gè)函數(shù)中只能有一個(gè)起作用的return語句,所以直接用return語句返回結(jié)果是不可行的,此時(shí)可以采用全局變量來實(shí)現(xiàn)。上一頁下一頁返回5.2局部變量和全局變量
程序的代碼如下:上一頁下一頁返回5.2局部變量和全局變量
上一頁下一頁返回5.2局部變量和全局變量
上一頁下一頁返回5.2局部變量和全局變量
上一頁下一頁返回5.2局部變量和全局變量
運(yùn)行結(jié)果:在該程序中,外部變量max、min分別用于存儲(chǔ)數(shù)組中的最大值和最小值,外部變量maxIndex、minIndex分別用于存儲(chǔ)數(shù)組中的最大值和最小值的位置。函數(shù)find將求得的最大值和最小值分別存入變量max
和變量min,
并將對(duì)應(yīng)位置的信息存儲(chǔ)到變量maxIndex
和變量minIndex,然后返回main函數(shù),main函數(shù)即可從外部變量中得到這些值。上一頁下一頁返回5.2局部變量和全局變量
盡管外部變量可用于函數(shù)之間交換數(shù)據(jù),但應(yīng)該盡量減少外部變量的使用,在函數(shù)之間通過參數(shù)和返回值來實(shí)現(xiàn)數(shù)據(jù)交換。顯而易見的原因有以下三個(gè)方面:(1)如果修改了外部變量的定義(變量類型、
變量名、
初始值等),
則要檢查、
修改所有使用該變量的函數(shù)。(2)一個(gè)函數(shù)對(duì)外部變量值的修改可能影響其他函數(shù),
而且不易查找因外部變量的修改而引起的程序錯(cuò)誤。(3)破壞了函數(shù)的獨(dú)立性。
當(dāng)一個(gè)函數(shù)應(yīng)用到另一程序時(shí),
必須帶上該函數(shù)用到的外部變量。上一頁下一頁返回5.2局部變量和全局變量
5.2.4
作用域規(guī)則既然局部變量具有程序塊作用域,外部變量具有文件作用域,那么當(dāng)外部變量和局部變量同名時(shí),就需要應(yīng)用作用域規(guī)則來確定變量的含義。作用域規(guī)則:當(dāng)外部變量與局部變量同名時(shí),在局部變量的作用域內(nèi),外部變量將不起作用,也就是局部變量會(huì)屏蔽外部變量。換言之,變量的使用遵循就近原則,
如果在當(dāng)前作用域中存在同名變量,就不會(huì)向更大的作用域?qū)ふ易兞?。上一頁下一頁返回?2局部變量和全局變量
【例5-5】分析并解釋下列程序的運(yùn)行結(jié)果。上一頁下一頁返回5.2局部變量和全局變量
上一頁下一頁返回5.2局部變量和全局變量
程序運(yùn)行的結(jié)果如下:上一頁下一頁返回5.2局部變量和全局變量
【分析】示例出現(xiàn)了4次變量k的定義。第1次定義,k是外部變量;第2次定義,k是局部變量;第3次定義,k是局部變量;第4次定義,k是局部變量??梢钥闯?(1)第2次定義的局部變量k屏蔽了外部變量k,
所以第1次的輸出為“k=7”。(2)第3次定義的局部變量k屏蔽了第2次定義的局部變量k,
所以第2次的輸出為“k=12”。(3)當(dāng)離開了第3次定義的變量k所在的程序塊后,
第2次定義的變量k恢復(fù)可見性,所以第3次的輸出為“k=7”。(4)當(dāng)離開了函數(shù)func以后,
回到主函數(shù)while循環(huán)中的條件k++用的是全局變量,此時(shí)全局變量k自增1,值為31。進(jìn)入while循環(huán)體以后,第4次定義局部變量,第4次定義的局部變量k屏蔽了全局變量k,所以第4次的輸出為“k=101”。上一頁下一頁返回5.2局部變量和全局變量
(5)while的第1次循環(huán)結(jié)束后,
while循環(huán)從頭開始,
while循環(huán)中的條件k++用的是全局變量,此時(shí)全局變量k自增1,值為32。進(jìn)入while循環(huán)體以后,第4次定義局部變量,第4次定義的局部變量k屏蔽了全局變量k,所以第5次的輸出為“k=101”。(6)while的第2次循環(huán)結(jié)束后,
while循環(huán)從頭開始,
while循環(huán)中的條件k++用的是全局變量,此時(shí)全局變量k自增1,值為33。進(jìn)入while循環(huán)體以后,第4次定義局部變量,第4次定義的局部變量k屏蔽了全局變量k,所以第6次的輸出為“k=101”。(7)while的第3次循環(huán)結(jié)束后,
while循環(huán)從頭開始,
while循環(huán)中的條件k++用的是全局變量,此時(shí)全局變量k自增1,值為34。此時(shí)while的循環(huán)條件不成立,所以程序退出while循環(huán),此時(shí)使用的是外部變量k,所以第7次的輸出為“k=34”。上一頁下一頁返回5.2局部變量和全局變量
【練習(xí)】(1)從鍵盤上輸入n個(gè)整型數(shù)據(jù),
存放在數(shù)組中,
找出該數(shù)組中的最小值和次小值。設(shè)計(jì)一個(gè)函數(shù)來實(shí)現(xiàn)同時(shí)找到最小值和次小值的功能,在主函數(shù)中調(diào)用該函數(shù),并輸出數(shù)組的最小值和次小值。(2)從鍵盤上輸入兩個(gè)正整型數(shù)據(jù),
求這兩個(gè)整數(shù)的最大公約數(shù)和最小公倍數(shù)。
要求設(shè)計(jì)一個(gè)函數(shù)來同時(shí)實(shí)現(xiàn)求兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù),并在主函數(shù)中調(diào)用該函數(shù),然后輸出這兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)。上一頁下一頁返回5.2局部變量和全局變量
(3)從鍵盤上輸入兩個(gè)正整型數(shù)據(jù),
先輸入一個(gè)較小的整型數(shù)據(jù),
然后輸入一個(gè)較大的整型數(shù)據(jù)。設(shè)計(jì)一個(gè)函數(shù),該函數(shù)的功能是找出在兩個(gè)正整數(shù)之間能被5整除,但不能被3整除的數(shù),并輸出。在主函數(shù)中調(diào)用該函數(shù)。(4)從鍵盤上任意輸入一個(gè)四位數(shù)字。
設(shè)計(jì)一個(gè)函數(shù),
該函數(shù)的功能是檢驗(yàn)該四位數(shù)表示的年份是否為閏年。如果是閏年,則返回1;否則,返回0。在主函數(shù)中調(diào)用該函數(shù)進(jìn)行判斷,如果是閏年就輸出“YES”,否則輸出“NO”。上一頁返回5.3變量的存儲(chǔ)類型
為了運(yùn)行程序,系統(tǒng)在內(nèi)存中為數(shù)據(jù)的存儲(chǔ)開辟了兩塊區(qū)域:靜態(tài)數(shù)據(jù)區(qū)和動(dòng)態(tài)數(shù)據(jù)區(qū)。存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)的變量叫作靜態(tài)變量;存儲(chǔ)在動(dòng)態(tài)數(shù)據(jù)區(qū)的變量叫作動(dòng)態(tài)變量。在靜態(tài)和動(dòng)態(tài)兩種存儲(chǔ)方法中,C語言將變量的存儲(chǔ)類型分為四種,它們的存儲(chǔ)類型說明符有auto、static、extern和register。在定義變量時(shí),通用的語法格式如下:[存儲(chǔ)類別標(biāo)識(shí)符]類型說明符變量名列表下一頁返回5.3變量的存儲(chǔ)類型
定義變量時(shí),主要說明了變量的以下三種性質(zhì):(1)存儲(chǔ)期限。
變量的存儲(chǔ)期限分為動(dòng)態(tài)存儲(chǔ)期限和靜態(tài)存儲(chǔ)期限。(2)作用域。
變量的作用域分為程序塊作用域和文件作用域。(3)連接。
變量的連接性質(zhì)說明了變量可以被共享的范圍。
變量的連接分為外部連接、內(nèi)部連接和無連接。具有外部連接的變量可以被程序的多個(gè)源文件共享使用,具有內(nèi)部連接的變量只能被一個(gè)源文件使用(可以被一個(gè)源文件中的多個(gè)函數(shù)共享使用),無連接的變量只能在一個(gè)函數(shù)內(nèi)使用。定義變量時(shí),如果省略了存儲(chǔ)類別標(biāo)識(shí)符,將根據(jù)變量定義的位置來確定這三種性質(zhì)。(1)局部變量具有動(dòng)態(tài)存儲(chǔ)期限、
程序塊作用域、
無連接。(2)外部變量具有靜態(tài)存儲(chǔ)期限、
文件作用域、
外部連接。此外,還可以指定變量的存儲(chǔ)類別來改變這三種性質(zhì)。上一頁下一頁返回5.3變量的存儲(chǔ)類型
5.3.1
auto變量auto存儲(chǔ)類別只能用于局部變量的定義。定義局部變量時(shí),如果沒有特別指明其存儲(chǔ)類別,則該變量的存儲(chǔ)類別就是auto,關(guān)鍵字auto可以省略。例如:inta;等價(jià)于autointa;自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)類。在函數(shù)運(yùn)行時(shí),系統(tǒng)自動(dòng)為其動(dòng)態(tài)分配空間;離開自動(dòng)變量的作用域時(shí),系統(tǒng)將回收其存儲(chǔ)空間。自動(dòng)變量在初始化前(或未賦值前),其值是不確定的。上一頁下一頁返回5.3變量的存儲(chǔ)類型
5.3.2
register變量register存儲(chǔ)類別只能用于局部變量的定義。register存儲(chǔ)類別的變量和auto存儲(chǔ)類別的變量具有相同的動(dòng)態(tài)存儲(chǔ)期限、程序塊作用域、無連接。指定變量具有register存儲(chǔ)類別的目的是要求編譯器將變量存放在寄存器(寄存器是的內(nèi)指定變量具有register存儲(chǔ)類別的目的是要求編譯器將變量存放在寄存器(寄存器是的內(nèi)部存儲(chǔ)單元)中,而不是存放在內(nèi)存中。如果變量在程序運(yùn)行期間使用頻繁,則存取該變量的數(shù)據(jù)將消耗很長(zhǎng)時(shí)間。由于CPU訪問寄存器的速度高于訪問內(nèi)存的速度,因此將變量存放在寄存器中,可以提高程序執(zhí)行的效率。例如,可以將循環(huán)結(jié)構(gòu)中的循環(huán)變量定義為register存儲(chǔ)類別,以控制循環(huán)次數(shù)。上一頁下一頁返回5.3變量的存儲(chǔ)類型
代碼如下:register存儲(chǔ)類別目前已經(jīng)很少使用了,因?yàn)楝F(xiàn)在的編譯器可以自動(dòng)識(shí)別頻繁使用的變量,并將它們放到寄存器中,即使將變量定義為register存儲(chǔ)類別,但它能否存放到寄存器中,也通常由編譯器來決定。上一頁下一頁返回5.3變量的存儲(chǔ)類型
5.3.3
static變量static關(guān)鍵字既可以用于局部變量的定義,也可以用于外部變量的定義,但兩者的含義有所不同。1用于局部變量在程序設(shè)計(jì)過程中,有時(shí)希望局部變量的值在每次離開其作用范圍之后不消失、能保持原值,且占用的存儲(chǔ)空間也不釋放。這時(shí),可以將變量的存儲(chǔ)類型聲明為static。將局部變量定義為static存儲(chǔ)類別后,系統(tǒng)會(huì)在靜態(tài)存儲(chǔ)區(qū)為其分配存儲(chǔ)空間,使變量的存儲(chǔ)期限由動(dòng)態(tài)存儲(chǔ)期限變成靜態(tài)存儲(chǔ)期限,同時(shí)變量仍具有代碼塊作用域和無連接的性質(zhì)。對(duì)于auto類別的局部變量,在進(jìn)入代碼塊時(shí)分配存儲(chǔ)空間,在離開代碼塊時(shí)回收存儲(chǔ)空間;而static類別的局部變量會(huì)在程序運(yùn)行期間一直占用固定的存儲(chǔ)空間,且變量值可以持久保存。上一頁下一頁返回5.3變量的存儲(chǔ)類型
static類別的局部變量只在程序開始執(zhí)行前進(jìn)行一次初始化(如果沒有提供初始值,編譯器會(huì)將其自動(dòng)初始化為0),
而auto類別的局部變量在每次進(jìn)入代碼塊時(shí),
都要重新分配存儲(chǔ)空間,重新進(jìn)行初始化(如果沒有提供初始值,其值是不確定的)。雖然靜態(tài)局部變量的存儲(chǔ)空間在整個(gè)程序中都保存著,但是,在它的作用域之外,仍然是不能被引用的。上一頁下一頁返回5.3變量的存儲(chǔ)類型
【例5-6】使用static修飾局部變量的數(shù)據(jù)類型。分析下列程序的執(zhí)行結(jié)果。程序的代碼如下:上一頁下一頁返回5.3變量的存儲(chǔ)類型
運(yùn)行結(jié)果:上一頁下一頁返回5.3變量的存儲(chǔ)類型
【分析】為了區(qū)別局部變量和添加了static修飾的局部變量,在函數(shù)中分別定義了兩種類型的變量??梢钥闯?,main函數(shù)連續(xù)3次調(diào)用fun函數(shù),返回值均不一樣。該程序的執(zhí)行過程如下:(1)程序開始執(zhí)行前,
為static類別的局部變量t分配存儲(chǔ)空間,
并將其初始化為0。(2)第1次調(diào)用fun函數(shù):此時(shí)為auto類別的局部變量x分配存儲(chǔ)空間,
并將其初始化為0。fun函數(shù)執(zhí)行結(jié)束后,返回值為2,變量x的存儲(chǔ)空間被回收,其值丟失。變量t的存儲(chǔ)空間不被回收,其值保留。(3)第2次調(diào)用fun函數(shù):此時(shí)重新為變量x分配存儲(chǔ)空間,
并將其初始化為0,
變量t維持上次函數(shù)調(diào)用結(jié)束時(shí)的值。fun函數(shù)執(zhí)行結(jié)束后,返回值為3,變量x的存儲(chǔ)空間被回收,其值丟失。變量t的存儲(chǔ)空間不被回收,其值保留。上一頁下一頁返回5.3變量的存儲(chǔ)類型
(4)第3次調(diào)用fun函數(shù)的情況與第2次調(diào)用類似。局部變量x和靜態(tài)局部變量t的具體數(shù)值如表5-1所示。有時(shí),利用static存儲(chǔ)類別可以避免每次調(diào)用函數(shù)都要進(jìn)行空間分配、回收和初始化,從而提高程序的執(zhí)行效率。上一頁下一頁返回5.3變量的存儲(chǔ)類型
2用于外部變量靜態(tài)局部變量只限于它所在的程序文件中的函數(shù)引用,
而不能被其他源程序文件中的函數(shù)引用。如果在其他源程序文件中需要引用該程序文件中的變量,那么此時(shí)這個(gè)變量相對(duì)其他源程序是一個(gè)外部變量,就可以將該外部變量改為靜態(tài)全局變量,將外部變量定義為static存儲(chǔ)類別,從而使變量具有內(nèi)部連接的性質(zhì),同時(shí)變量仍具有靜態(tài)存儲(chǔ)期限和文件作用域的性質(zhì)。定義靜態(tài)全局變量的形式如下:static數(shù)據(jù)類型變量;靜態(tài)全局變量分配在靜態(tài)數(shù)據(jù)區(qū),生存期是程序運(yùn)行期。上一頁下一頁返回5.3變量的存儲(chǔ)類型
【例5-7】使用static修飾局部變量的數(shù)據(jù)類型。分析下列程序的運(yùn)行結(jié)果。程序的代碼如下:上一頁下一頁返回5.3變量的存儲(chǔ)類型
運(yùn)行結(jié)果:上一頁下一頁返回5.3變量的存儲(chǔ)類型
【分析】本程序由文件file1c和文件file2c構(gòu)成。在文件file1c中,有兩個(gè)靜態(tài)全局變量x、t和一個(gè)函數(shù)fun。文件file2c是主函數(shù)文件,由于文件file1c中的變量x、t是靜態(tài)全局的,所以文件file2c中的主函數(shù)不能直接使用文件file1c中的變量x、t,因此通過函數(shù)參數(shù)的方式訪問變量x、t。從運(yùn)行結(jié)果可以看出,main函數(shù)連續(xù)3次調(diào)用fun函數(shù),返回值均不相同。上一頁下一頁返回5.3變量的存儲(chǔ)類型
該程序的執(zhí)行過程如下:(1)程序開始執(zhí)行前,
為static類別的全局變量x、
t分別分配存儲(chǔ)空間,
并將其均初始化為0。(2)第1次調(diào)用fun函數(shù):在執(zhí)行語句“x=x+a;”
后,
靜態(tài)全局變量x的數(shù)值是2;執(zhí)行語句“t=t+b;”后,靜態(tài)全局變量t的數(shù)值是6。fun函數(shù)執(zhí)行結(jié)束后,靜態(tài)全局變量x、t的存儲(chǔ)空間不被回收,其值保留,即變量x中的數(shù)值是2,變量t中的數(shù)值是6。返回主函數(shù)的數(shù)值是8。(3)第2次調(diào)用fun函數(shù):在執(zhí)行語句“x=x+a;”
后,
靜態(tài)全局變量x的數(shù)值是4;執(zhí)行語句“t=t+b;”后,靜態(tài)全局變量t的數(shù)值是12。fun函數(shù)執(zhí)行結(jié)束后,靜態(tài)全局變量x、t的存儲(chǔ)空間不被回收,其值保留,即變量x中的數(shù)值是4,變量t中的數(shù)值是12。返回主函數(shù)的數(shù)值是16。上一頁下一頁返回5.3變量的存儲(chǔ)類型
(4)第3次調(diào)用fun函數(shù)的情況與第2次調(diào)用類似。靜態(tài)全局變量x、t的具體數(shù)值如表5-2所示。只要將外部變量指定為static存儲(chǔ)類別,就可以在程序的多個(gè)文件中定義同名的外部變量,這些外部變量代表不同的變量,它們相互獨(dú)立,互不影響。對(duì)于那些沒有指定為static存儲(chǔ)類別的外部變量,在一個(gè)程序中(即使該程序由多個(gè)文件組成)只能定義一次。上一頁下一頁返回5.3變量的存儲(chǔ)類型
5.3.4
extern變量extern存儲(chǔ)類別用于對(duì)已定義的外部變量進(jìn)行聲明,以便多個(gè)源文件共享同一個(gè)外部變量。在此,把變量的定義和聲明區(qū)分開(說明:變量的定義和聲明還可以表示同樣的含義)。在一個(gè)程序中,一個(gè)外部變量只能定義一次。例如:inta=1;該語句定義了一個(gè)外部變量a,編譯器會(huì)為變量a分配存儲(chǔ)空間,并將其初始化為1。然而,在一個(gè)程序中,可以出現(xiàn)多次對(duì)該變量的聲明。例如:externinta;該語句對(duì)外部變量a進(jìn)行聲明,目的是告訴編譯器這里用到在其他位置(可能在同一文件中的后續(xù)位置,也可能在其他文件中)定義的外部變量a,類型為int,但編譯器不會(huì)再次為變量a分配存儲(chǔ)空間。上一頁下一頁返回5.3變量的存儲(chǔ)類型
注意:對(duì)外部變量的多次聲明應(yīng)與定義保持一致。利用extern對(duì)外部變量進(jìn)行聲明后,就可以在外部變量作用域之外的位置使用它。上一頁下一頁返回5.3變量的存儲(chǔ)類型
【例5-8】使用extern對(duì)同一文件中的外部變量進(jìn)行聲明。分析下列程序的執(zhí)行結(jié)果。程序的代碼如下:上一頁下一頁返回5.3變量的存儲(chǔ)類型
上一頁下一頁返回5.3變量的存儲(chǔ)類型
運(yùn)行結(jié)果:上一頁下一頁返回5.3變量的存儲(chǔ)類型
【分析】為了區(qū)別在同一個(gè)文件中的不同位置引用外部變量,在程序的函數(shù)內(nèi)以及函數(shù)外分別引用外部變量。外部變量A、B的作用域是從變量定義處直到源文件的結(jié)尾。所以無須在main函數(shù)中聲明,即可直接訪問變量A、B,但函數(shù)fun1和fun2不在作用域內(nèi)。為了在函數(shù)fun1和fun2中使用變量A、B,需要使用extern進(jìn)行聲明。對(duì)變量B的聲明出現(xiàn)在函數(shù)之外(在函數(shù)fun1之前),這使函數(shù)fun1和fun2都可以訪問變量B。對(duì)變量A的聲明出現(xiàn)在函數(shù)體內(nèi)(在函數(shù)fun1中),這使函數(shù)fun1可以訪問變量A,但函數(shù)fun2不能訪問變量A。通常,需要訪問在另外一個(gè)源文件中定義的外部變量。這可以通過對(duì)外部變量進(jìn)行聲明來實(shí)現(xiàn)。上一頁下一頁返回5.3變量的存儲(chǔ)類型
【例5-9】使用extern對(duì)不同文件中的外部變量進(jìn)行聲明。分析下列程序的執(zhí)行結(jié)果。程序的代碼如下:上一頁下一頁返回5.3變量的存儲(chǔ)類型
運(yùn)行結(jié)果:上一頁下一頁返回5.3變量的存儲(chǔ)類型
【分析】本程序由文件file1c和文件file2c構(gòu)成。文件file1c是主函數(shù)文件,包括全局變量A的定義,以及函數(shù)fun的聲明和調(diào)用。在文件file2c中,用extern應(yīng)用源文件file1c中的變量。注意:具有static存儲(chǔ)類別的外部變量只能被同一個(gè)文件中的函數(shù)使用,不能通過聲明來使其他文件中的函數(shù)使用該變量。上一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
實(shí)訓(xùn)1
直角三角形任意輸入三條邊的邊長(zhǎng)(實(shí)數(shù)類型),判斷其能否組成三角形。如果不能組成三角形,程序就輸出“Itisnotatriangle”;如果能組成三角形,就判斷該三角形是否為直角三角形;如果能組成直角三角形,就輸出“Itisarighttriangle”,否則輸出“Itisnotarighttriangle”。1實(shí)訓(xùn)分析首先,設(shè)計(jì)函數(shù)來判斷三條邊能否組成三角形。如果可以,就返回1;否則,返回0。然后,根據(jù)返回結(jié)果進(jìn)行判斷。如果返回結(jié)果是0,
則輸出不能組成三角形的信息;如果返回結(jié)果是1,則根據(jù)勾股定理來判斷能否組成直角三角形。下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
算法的偽代碼如下:(1)根據(jù)三條邊的關(guān)系,
判斷能否組成三角形。
如果可以,
就返回1;
否則,
返回0;(2)如果(1)中的結(jié)果是0,
則輸出“Itisnotatriangle”,
否則執(zhí)行(3);(3)根據(jù)勾股定理來判斷該三角形是否為直角三角形。
如果滿足勾股定理,
就輸出“Itisarighttriangle”,否則輸出Itisnotarighttriangle”。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
程序的代碼如下:上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
2實(shí)訓(xùn)練習(xí)任意輸入三條邊的邊長(zhǎng)(實(shí)數(shù)類型),判斷能否組成三角形。如果不能組成三角形,程序就輸出“Itisnotatriangle”;如果能組成三角形,就進(jìn)而判斷該三角形是否為直角三角形。如果不是直角三角形,程序就輸出“Itisnotarighttriangle”;否則,輸出最小余弦值的最簡(jiǎn)分式。例如,三條邊的邊長(zhǎng)分別是6、8、10,最小的余弦值是6/10,那么輸出的結(jié)果應(yīng)該是3/5。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
實(shí)訓(xùn)2
一元二次方程的根在實(shí)數(shù)范圍內(nèi)求方程ax2+bx+c=0的根。方程的系數(shù)a、b、c從鍵盤上輸入。1實(shí)訓(xùn)分析在實(shí)數(shù)范圍內(nèi),一元二次方程根的情況由判別式d=b2-4ac決定。當(dāng)d<0時(shí),在實(shí)數(shù)范圍內(nèi)一元二次方程無解;當(dāng)d=0時(shí),在實(shí)數(shù)范圍內(nèi)一元二次方程有兩個(gè)相等的實(shí)根,其解是-b/2a;當(dāng)d>0時(shí),在實(shí)數(shù)范圍內(nèi)一元二次方程有兩個(gè)不等的實(shí)數(shù)根,分別是上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
算法的偽代碼如下:(1)輸入方程的系數(shù);(2)設(shè)計(jì)判別式d=b2
-4ac。
如果d大于零,
表示有兩個(gè)不同的實(shí)根;
如果d等于零,表示有一個(gè)實(shí)根;否則,
表示沒有實(shí)根。(3)根據(jù)(2)中的返回值,
計(jì)算相對(duì)應(yīng)情況下的實(shí)根。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
程序的代碼如下:上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
2實(shí)訓(xùn)練習(xí)在復(fù)數(shù)范圍內(nèi)求方程ax2+bx+c=0的根(考慮實(shí)數(shù)根和復(fù)數(shù)根)。方程的系數(shù)a、b、c是實(shí)數(shù),從鍵盤上輸入。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
實(shí)訓(xùn)3
完美數(shù)所有真約數(shù)(除本身之外的正約數(shù))的和小于它本身的正整數(shù)稱為虧數(shù);相反情況時(shí),稱為盈數(shù)。例如,4的真約數(shù)有1、2,其和是3,3比4小,這樣的自然數(shù)就稱為虧數(shù)(又叫做缺數(shù)),類似的數(shù)還有5、7、8等。例如,12的真約數(shù)有1、2、3、4、6,其和是16,16比12大,這樣的自然數(shù)就稱為盈數(shù)(又稱為豐數(shù),或過剩數(shù)、富裕數(shù)),類似的數(shù)還有18、20等。所有真約數(shù)(除本身之外的正約數(shù))的和等于它本身的正整數(shù)稱為完美數(shù),
又稱為完全數(shù)或完備數(shù)。完美數(shù)就是既不盈余,又不虧欠的自然數(shù)。例如,6的真約數(shù)有1、2、3,其和是1+2+3=6,剛好等于6本身,所以6是完美數(shù)。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
編寫程序,從鍵盤上輸入任意一個(gè)自然數(shù),判斷該數(shù)是盈數(shù)、虧數(shù)還是完美數(shù)。如果該數(shù)是盈數(shù),就輸出“盈數(shù)”;如果該數(shù)是虧數(shù),就輸出“虧數(shù)”;如果該數(shù)是完美數(shù),則輸出該數(shù)后續(xù)的三個(gè)完美數(shù)。1實(shí)訓(xùn)分析設(shè)計(jì)函數(shù)判斷一個(gè)數(shù)是盈數(shù)、
虧數(shù)還是完美數(shù)時(shí),
只需將該數(shù)所有的真約數(shù)相加后與該數(shù)本身對(duì)比大小即可。如果小于該數(shù)本身,則是虧數(shù),返回-1;如果大于該數(shù)本身,
則是盈數(shù),返回1;如果等于該數(shù)本身,則是完美數(shù),返回0。如果返回結(jié)果是0,則尋找緊隨其后的三個(gè)完美數(shù)。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
算法的偽代碼如下:(1)編寫函數(shù)判斷一個(gè)數(shù)是盈數(shù)、
虧數(shù),
還是完美數(shù)。
如果是虧數(shù),
就返回-1;
如果是盈數(shù),就返回1;如果是完美數(shù),就返回0。(2)根據(jù)(1)中的返回結(jié)果,
選擇不同的操作:(2.1)如果返回值是-1,
就輸出“虧數(shù)”;
(2.2)如果返回值是1,
就輸出“盈數(shù)”;(2.3)如果返回值是0,
就尋找緊隨其后的三個(gè)完美數(shù),
然后輸出。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
程序的代碼如下:上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
2實(shí)訓(xùn)練習(xí)設(shè)計(jì)程序,輸出1000以內(nèi)的所有平方回?cái)?shù)。提示:設(shè)n是一個(gè)任意自然數(shù)。若將n的各位數(shù)字反向排列所得的自然數(shù)n1與n相等,則稱n為回文數(shù)。例如,若n=1234321,則稱n為回文數(shù);若n=1234567,則n不是回文數(shù)。如果一個(gè)數(shù)既是回文數(shù),又是某個(gè)數(shù)的平方,則這樣的數(shù)字稱為平方回?cái)?shù)。例如:121。上一頁下一頁返回5.4實(shí)訓(xùn)與實(shí)訓(xùn)指導(dǎo)
實(shí)訓(xùn)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026中鐵西北科學(xué)研究院有限公司工程管理招聘評(píng)估助理監(jiān)督工程師備考考試試題及答案解析
- 2026年上半年黑龍江事業(yè)單位聯(lián)考省地震局招聘2人考試參考試題及答案解析
- 城市生活垃圾分類收集設(shè)施采購及安裝方案投標(biāo)文件(技術(shù)方案)
- 獎(jiǎng)品投票活動(dòng)策劃方案(3篇)
- 城管執(zhí)法車輛管理制度天津(3篇)
- 2026年上海市嘉定區(qū)嘉一實(shí)驗(yàn)高級(jí)中學(xué)春季教師招聘筆試備考試題及答案解析
- 2026年度青島市李滄區(qū)所屬事業(yè)單位公開招聘工作人員(32名)參考考試題庫及答案解析
- 2025年合肥大學(xué)引進(jìn)海內(nèi)外高層次人才參考考試題庫及答案解析
- 2026福建福州市城市排水有限公司項(xiàng)目經(jīng)理招聘3人參考考試題庫及答案解析
- 單位團(tuán)日活動(dòng)策劃方案(3篇)
- 【地理】期末重點(diǎn)復(fù)習(xí)課件-2025-2026學(xué)年八年級(jí)地理上學(xué)期(人教版2024)
- 2026年鄉(xiāng)村治理體系現(xiàn)代化試題含答案
- 通風(fēng)設(shè)備采購與安裝合同范本
- 化工設(shè)備清洗安全課件
- 2026元旦主題班會(huì):馬年猜猜樂新春祝福版 教學(xué)課件
- T∕ZZB 1815-2020 塑料 汽車配件用再生聚碳酸酯(PC)專用料
- 2025~2026學(xué)年吉林省吉林市一中高一10月月考語文試卷
- 天津市南開中學(xué)2025-2026學(xué)年高一上數(shù)學(xué)期末調(diào)研模擬試題含解析
- 麻辣燙創(chuàng)業(yè)商業(yè)計(jì)劃書范文
- 東呈集團(tuán)內(nèi)部控制中存在的問題及對(duì)策研究
- 高科技產(chǎn)業(yè)園區(qū)運(yùn)營管理手冊(cè)
評(píng)論
0/150
提交評(píng)論