版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 整理整理ppt1第五章第五章 函數(shù)函數(shù) 整理整理ppt25.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.3 頭文件頭文件5.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt3 編寫(xiě)程序,求所有四位可逆素?cái)?shù)編寫(xiě)程序,求所有四位可逆素?cái)?shù) ,所謂可逆素所謂可逆素?cái)?shù)是這么一種素?cái)?shù),它的逆數(shù)也是素?cái)?shù)。數(shù)是這么一種素?cái)?shù),它的逆數(shù)也是素?cái)?shù)。 包含的主要功能:包含的主要功能: 判斷一個(gè)數(shù)是否素?cái)?shù)。判斷一個(gè)數(shù)是否素?cái)?shù)。 求一個(gè)整數(shù)的逆數(shù)。如求一個(gè)整數(shù)的逆數(shù)。如1234的逆數(shù)是的逆數(shù)是4321。 5.
2、1 子程序設(shè)計(jì)子程序設(shè)計(jì) 整理整理ppt45.1 子程序設(shè)計(jì)子程序設(shè)計(jì)求可逆素?cái)?shù)求可逆素?cái)?shù) 本程序中判斷素?cái)?shù)的代碼本程序中判斷素?cái)?shù)的代碼會(huì)出現(xiàn)兩次;會(huì)出現(xiàn)兩次; 判斷素?cái)?shù)、求整數(shù)逆數(shù)這判斷素?cái)?shù)、求整數(shù)逆數(shù)這兩個(gè)功能是獨(dú)立的功能,兩個(gè)功能是獨(dú)立的功能,且在多個(gè)程序中都有可能且在多個(gè)程序中都有可能用到:用到: 求一個(gè)整數(shù)的逆數(shù):該求一個(gè)整數(shù)的逆數(shù):該功能在判斷一個(gè)整數(shù)是功能在判斷一個(gè)整數(shù)是否回文數(shù)中也被用到;否回文數(shù)中也被用到; 判斷一個(gè)數(shù)是否素?cái)?shù):判斷一個(gè)數(shù)是否素?cái)?shù):該功能在對(duì)整數(shù)進(jìn)行素該功能在對(duì)整數(shù)進(jìn)行素?cái)?shù)分解中用到。數(shù)分解中用到。 整理整理ppt55.1 子程序設(shè)計(jì)子程序設(shè)計(jì) 能否將完成上述
3、獨(dú)立功能的代碼包裝成一個(gè)單能否將完成上述獨(dú)立功能的代碼包裝成一個(gè)單元,并且可以供其他代碼來(lái)調(diào)用?元,并且可以供其他代碼來(lái)調(diào)用?-答案是可答案是可以使用以使用子程序子程序一一. 子程序的定義子程序的定義 子程序是子程序是封裝封裝并給以并給以命名命名的一段程序代碼的一段程序代碼,這,這段程序代碼完成子程序所定義的功能,可供調(diào)段程序代碼完成子程序所定義的功能,可供調(diào)用。用。 封裝封裝:調(diào)用者只需要關(guān)心代碼能完成什么功能,:調(diào)用者只需要關(guān)心代碼能完成什么功能,如何調(diào)用代碼(即子程序接口),而不需要關(guān)如何調(diào)用代碼(即子程序接口),而不需要關(guān)心代碼的內(nèi)部實(shí)現(xiàn)。心代碼的內(nèi)部實(shí)現(xiàn)。 整理整理ppt6判斷素?cái)?shù)的
4、判斷素?cái)?shù)的子程序子程序調(diào)用調(diào)用判斷素?cái)?shù)的判斷素?cái)?shù)的子程序子程序調(diào)用調(diào)用計(jì)算逆數(shù)的計(jì)算逆數(shù)的子程序子程序調(diào)用調(diào)用5.1 子程序設(shè)計(jì)子程序設(shè)計(jì)子程序很重要的特點(diǎn):子程序很重要的特點(diǎn):調(diào)用者只需要關(guān)心子調(diào)用者只需要關(guān)心子程序接口,不必了解程序接口,不必了解子程序內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。子程序內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。isPrimreverse可以設(shè)計(jì)子程序可以設(shè)計(jì)子程序isPrim,用于判斷一個(gè)整數(shù)是否是素,用于判斷一個(gè)整數(shù)是否是素?cái)?shù);子程序數(shù);子程序reverse ,用于計(jì)算一個(gè)整數(shù)的逆數(shù);,用于計(jì)算一個(gè)整數(shù)的逆數(shù); 整理整理ppt75.1 子程序設(shè)計(jì)子程序設(shè)計(jì)二.子程序的控制和調(diào)用機(jī)制子程序的控制和調(diào)用機(jī)制u通過(guò)子程
5、序名進(jìn)行調(diào)通過(guò)子程序名進(jìn)行調(diào)用;用;u調(diào)用時(shí)需要傳遞一些調(diào)用時(shí)需要傳遞一些供子程序計(jì)算和處理供子程序計(jì)算和處理的數(shù)據(jù)(參數(shù));的數(shù)據(jù)(參數(shù));u子程序執(zhí)行完成后需子程序執(zhí)行完成后需要返回處理結(jié)果。要返回處理結(jié)果。 整理整理ppt8判斷素?cái)?shù)的判斷素?cái)?shù)的子程序子程序調(diào)用調(diào)用5.1 子程序設(shè)計(jì)子程序設(shè)計(jì)flag=isPrim(num)判斷素?cái)?shù)的判斷素?cái)?shù)的子程序子程序調(diào)用調(diào)用flag=isPrim(reverseNum)子程序名子程序名參數(shù)參數(shù)返回值返回值 整理整理ppt95.1 子程序設(shè)計(jì)子程序設(shè)計(jì)三三. 引入子程序的目的引入子程序的目的 1. 程序程序“復(fù)用復(fù)用”,避免在程序中使用重復(fù)代碼;,避免
6、在程序中使用重復(fù)代碼;2. 結(jié)構(gòu)化程序設(shè)計(jì)的需要:結(jié)構(gòu)化程序設(shè)計(jì)的需要: 自頂向下、逐步細(xì)化,將復(fù)雜問(wèn)題分解為相對(duì)自頂向下、逐步細(xì)化,將復(fù)雜問(wèn)題分解為相對(duì)簡(jiǎn)單的子問(wèn)題,這些子問(wèn)題用子程序?qū)崿F(xiàn),從簡(jiǎn)單的子問(wèn)題,這些子問(wèn)題用子程序?qū)崿F(xiàn),從而提高主程序結(jié)構(gòu)的清晰性和易讀性。而提高主程序結(jié)構(gòu)的清晰性和易讀性。3.使程序的調(diào)試和使程序的調(diào)試和 維護(hù)變得更加容易。維護(hù)變得更加容易。 整理整理ppt10四四. 子程序設(shè)計(jì)原則子程序設(shè)計(jì)原則 高內(nèi)聚高內(nèi)聚:功能相對(duì)獨(dú)立和完整;:功能相對(duì)獨(dú)立和完整; 低耦合低耦合:與外界的關(guān)系盡量松散,:與外界的關(guān)系盡量松散, 不要太緊密,使其能方便地被重用;不要太緊密,使其能
7、方便地被重用; 需要合理地設(shè)計(jì)子程序參數(shù)和子程序執(zhí)行的局需要合理地設(shè)計(jì)子程序參數(shù)和子程序執(zhí)行的局部環(huán)境部環(huán)境 來(lái)達(dá)到以上目標(biāo)。來(lái)達(dá)到以上目標(biāo)。5.1 子程序設(shè)計(jì)子程序設(shè)計(jì)五五. 子程序在子程序在C語(yǔ)言中的實(shí)現(xiàn)機(jī)制語(yǔ)言中的實(shí)現(xiàn)機(jī)制C語(yǔ)言中的語(yǔ)言中的函數(shù)函數(shù)機(jī)制機(jī)制 整理整理ppt115.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.2.1 5.2.1 函數(shù)函數(shù)5.2.2 5.2.2 函數(shù)的定義函數(shù)的定義5.2.5.2.3 3 函數(shù)的調(diào)用函數(shù)的調(diào)用5.2.4 5.2.4 函數(shù)原型函數(shù)原型5.3 頭文件頭文件5.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)
8、別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt12u C語(yǔ)言中用函數(shù)實(shí)現(xiàn)子程序設(shè)計(jì)思想。較大的語(yǔ)言中用函數(shù)實(shí)現(xiàn)子程序設(shè)計(jì)思想。較大的C語(yǔ)語(yǔ)言應(yīng)用程序,往往是由多個(gè)函數(shù)組成的(用戶(hù)自定義言應(yīng)用程序,往往是由多個(gè)函數(shù)組成的(用戶(hù)自定義函數(shù)或標(biāo)準(zhǔn)庫(kù)函數(shù)),每個(gè)函數(shù)完成明確的功能;函數(shù)或標(biāo)準(zhǔn)庫(kù)函數(shù)),每個(gè)函數(shù)完成明確的功能;u每一個(gè)函數(shù)應(yīng)該只完成單一的預(yù)定好的任務(wù),并且每一個(gè)函數(shù)應(yīng)該只完成單一的預(yù)定好的任務(wù),并且函數(shù)名能有效地反映函數(shù)完成的任務(wù);如果不能選擇函數(shù)名能有效地反映函數(shù)完成的任務(wù);如果不能選擇簡(jiǎn)潔的函數(shù)名,那可能函數(shù)完成的功能太多,建議拆簡(jiǎn)潔的函數(shù)名,那可能函數(shù)完成的
9、功能太多,建議拆分成幾個(gè)較小的函數(shù)。分成幾個(gè)較小的函數(shù)。uC標(biāo)準(zhǔn)庫(kù)提供了豐富的函數(shù)集,能夠完成常用的數(shù)標(biāo)準(zhǔn)庫(kù)提供了豐富的函數(shù)集,能夠完成常用的數(shù)學(xué)計(jì)算、字符串操作、輸入學(xué)計(jì)算、字符串操作、輸入/輸出等有用操作,程序員輸出等有用操作,程序員可以直接使用、從而減少工作量;可以直接使用、從而減少工作量;5.2.1 函數(shù)函數(shù) 整理整理ppt135.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.2.1 函數(shù)函數(shù)5.2.2 函數(shù)的定義函數(shù)的定義5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用5.2.4 函數(shù)原型函數(shù)原型5.3 頭文件頭文件5.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量
10、的存儲(chǔ)類(lèi)別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt145.2.2 函數(shù)的定義函數(shù)的定義 函數(shù)設(shè)計(jì)的要求:函數(shù)設(shè)計(jì)的要求: 明確該函數(shù)的功能;明確該函數(shù)的功能; 定義該函數(shù)的接口(即函數(shù)頭,包括函數(shù)名、定義該函數(shù)的接口(即函數(shù)頭,包括函數(shù)名、參數(shù)和返回值)參數(shù)和返回值) 定義該函數(shù)的功能實(shí)現(xiàn)部分定義該函數(shù)的功能實(shí)現(xiàn)部分 整理整理ppt155.2.2 函數(shù)的定義函數(shù)的定義函數(shù)定義的格式:函數(shù)定義的格式: 返回值類(lèi)型返回值類(lèi)型 函數(shù)名函數(shù)名( 參數(shù)列表參數(shù)列表 ) /*接口定義部分接口定義部分*/ 聲明聲明 語(yǔ)句語(yǔ)句 /*功能實(shí)現(xiàn)部分功能實(shí)現(xiàn)部分*/函數(shù)定義函數(shù)定義:求求
11、x的的y次方次方int power(int x,int y) int i, p=1; p=1; for (i=1;i=y;i+) p = p * x; return p; 1、函數(shù)名、函數(shù)名簡(jiǎn)潔、能反映出函數(shù)的功能。簡(jiǎn)潔、能反映出函數(shù)的功能。如:如:square、printf等。等。3、返回值類(lèi)型、返回值類(lèi)型(1)指返回給函數(shù)調(diào)用者的結(jié)果的類(lèi))指返回給函數(shù)調(diào)用者的結(jié)果的類(lèi)型;型;(2)如果不指明返回值類(lèi)型,編譯器)如果不指明返回值類(lèi)型,編譯器將假定返回值是將假定返回值是int型(最好明確指型(最好明確指定);定);(3)如果函數(shù)不返回任何值(即函數(shù)功)如果函數(shù)不返回任何值(即函數(shù)功能實(shí)現(xiàn)部分無(wú)
12、能實(shí)現(xiàn)部分無(wú)return語(yǔ)句),則返回值類(lèi)語(yǔ)句),則返回值類(lèi)型定義成型定義成void。若返回值類(lèi)型不是。若返回值類(lèi)型不是void,但又無(wú)但又無(wú)return語(yǔ)句,則函數(shù)將返回一個(gè)不語(yǔ)句,則函數(shù)將返回一個(gè)不確定的值;確定的值;4、返回值與、返回值與return語(yǔ)句語(yǔ)句(1)return語(yǔ)句的一般格式:語(yǔ)句的一般格式: return ( 返回值表達(dá)式返回值表達(dá)式 ); 或或 return 返回值表達(dá)式返回值表達(dá)式 ;(2)return語(yǔ)句的功能:返回調(diào)用函語(yǔ)句的功能:返回調(diào)用函數(shù),并將數(shù),并將“返回值表達(dá)式返回值表達(dá)式”的值帶給的值帶給調(diào)用函數(shù);調(diào)用函數(shù);(3) return語(yǔ)句中返回值表達(dá)式的類(lèi)語(yǔ)
13、句中返回值表達(dá)式的類(lèi)型要和返回值的類(lèi)型說(shuō)明一致。如果型要和返回值的類(lèi)型說(shuō)明一致。如果不一致,則以返回值類(lèi)型為準(zhǔn)不一致,則以返回值類(lèi)型為準(zhǔn)(進(jìn)行類(lèi)進(jìn)行類(lèi)型轉(zhuǎn)換型轉(zhuǎn)換)。2、參數(shù)列表、參數(shù)列表(1)參數(shù)列表聲明了在調(diào)用函數(shù)時(shí)函數(shù))參數(shù)列表聲明了在調(diào)用函數(shù)時(shí)函數(shù)所接收的參數(shù),形式為:所接收的參數(shù),形式為:數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 參數(shù)參數(shù)1,數(shù)據(jù)類(lèi)型,數(shù)據(jù)類(lèi)型 參數(shù)參數(shù)2 (2)如果函數(shù)不接收任何參數(shù),則參數(shù))如果函數(shù)不接收任何參數(shù),則參數(shù)列表定義為列表定義為void ;如;如 int print(void)(3)如果不列出參數(shù)的類(lèi)型,編譯器就)如果不列出參數(shù)的類(lèi)型,編譯器就假定其為假定其為int類(lèi)型。但最
14、好明確指定參數(shù)類(lèi)型。但最好明確指定參數(shù)的類(lèi)型,即使是的類(lèi)型,即使是int型,最好也明確定義。型,最好也明確定義。 整理整理ppt165.2.2 函數(shù)的定義函數(shù)的定義練習(xí)練習(xí)1:設(shè)計(jì)一個(gè)函數(shù):設(shè)計(jì)一個(gè)函數(shù)IsLeapYear(n),用于判斷,用于判斷n年年是否是閏年。如果是,則返回是否是閏年。如果是,則返回1;否則返回;否則返回0。 n年是否是閏年的判斷條件為:年是否是閏年的判斷條件為:a)n能被能被4整除但整除但不能被不能被100整除;或整除;或b)n能被能被400整除。整除。 【程序程序演示演示】 整理整理ppt175.2.2 函數(shù)的定義函數(shù)的定義/*函數(shù)功能:判斷函數(shù)功能:判斷n是否是閏年
15、是否是閏年 參數(shù):參數(shù): year :要判斷的年份:要判斷的年份 返回值:若是閏年,返回返回值:若是閏年,返回1,否則返回,否則返回0*/int isLeapYear(int year) if ( (year % 4 = 0 & year % 100 != 0 ) | year % 400 = 0) return 1; else return 0; 整理整理ppt18常見(jiàn)的程序設(shè)計(jì)錯(cuò)誤:常見(jiàn)的程序設(shè)計(jì)錯(cuò)誤:(1)把同一種類(lèi)型的參數(shù)聲明為類(lèi)似于形式)把同一種類(lèi)型的參數(shù)聲明為類(lèi)似于形式float x,y,而不是而不是float x,float y;(2)在函數(shù)內(nèi)部把函數(shù)參數(shù)再次定義成局部變
16、在函數(shù)內(nèi)部把函數(shù)參數(shù)再次定義成局部變量是一種語(yǔ)法錯(cuò)誤;如:量是一種語(yǔ)法錯(cuò)誤;如: int sum(int x, int y) int x, y;/錯(cuò)誤!錯(cuò)誤! return (x+y); 5.2.2 函數(shù)的定義函數(shù)的定義 整理整理ppt195.2.2 函數(shù)的定義函數(shù)的定義(3)不能在一個(gè))不能在一個(gè)C函數(shù)的內(nèi)部定義另一個(gè)函數(shù);函數(shù)的內(nèi)部定義另一個(gè)函數(shù); main() int sum(int x,int y) return(x+y); 不允許!不允許! 整理整理ppt205.2.2 函數(shù)的定義函數(shù)的定義 練習(xí)練習(xí)2:定義以下問(wèn)題的函數(shù)頭:定義以下問(wèn)題的函數(shù)頭 設(shè)計(jì)一函數(shù),求一個(gè)正整數(shù)的長(zhǎng)度;設(shè)計(jì)
17、一函數(shù),求一個(gè)正整數(shù)的長(zhǎng)度; int length(int n) 設(shè)計(jì)一函數(shù),求三個(gè)整數(shù)中的最大值;設(shè)計(jì)一函數(shù),求三個(gè)整數(shù)中的最大值; int max(int n1, int n2, int n3) 整理整理ppt215.2.2 函數(shù)的定義函數(shù)的定義練習(xí)練習(xí)3 3:要求設(shè)計(jì)一個(gè)函數(shù):要求設(shè)計(jì)一個(gè)函數(shù):isPrim(x) 函數(shù)定義:函數(shù)定義:isPrim(x)=1 當(dāng)當(dāng)x 是素?cái)?shù);是素?cái)?shù); =0 當(dāng)當(dāng)x 不是素?cái)?shù)不是素?cái)?shù) ; 整理整理ppt225.2.2 函數(shù)的定義函數(shù)的定義要判斷的數(shù)通過(guò)參要判斷的數(shù)通過(guò)參數(shù)傳入數(shù)傳入判斷結(jié)果通過(guò)判斷結(jié)果通過(guò)return語(yǔ)句返語(yǔ)句返回回 整理整理ppt23/*
18、函數(shù)功能:判斷一個(gè)正整數(shù)是否為素?cái)?shù)函數(shù)功能:判斷一個(gè)正整數(shù)是否為素?cái)?shù).若是若是,則返回則返回1;否則返回否則返回0。 輸入?yún)?shù):輸入?yún)?shù):n:要判斷的整數(shù)。:要判斷的整數(shù)。 返回值:若返回值:若n是素?cái)?shù),則返回值為是素?cái)?shù),則返回值為1;否則返回值為否則返回值為0。*/int isPrim(int n) int i; /*不斷判斷不斷判斷n能否被能否被i整除。整除。i的取值范圍是的取值范圍是2sqrt(n)*/int isPrim; /*isPrim=1:表示表示n是質(zhì)數(shù);是質(zhì)數(shù);isPrim=0:表示:表示n不是質(zhì)數(shù)不是質(zhì)數(shù)*/i = 2; isPrim = 1; /*初始設(shè)定初始設(shè)定n是素?cái)?shù)
19、。在判斷中一旦發(fā)現(xiàn)不是素?cái)?shù),則是素?cái)?shù)。在判斷中一旦發(fā)現(xiàn)不是素?cái)?shù),則isPrim被修改成被修改成0。*/while (i = sqrt(n) & isPrim = 1) if (n % i = 0) isPrim = 0; else i+; ; return isPrim; /*返回返回*/ 整理整理ppt245.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.2.1 函數(shù)函數(shù)5.2.2 函數(shù)的定義函數(shù)的定義5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用5.2.4 函數(shù)原型函數(shù)原型5.3 頭文件頭文件5.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別5.7 內(nèi)
20、部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt255.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 函數(shù)是一段封裝的代碼,能完成預(yù)定好的、獨(dú)函數(shù)是一段封裝的代碼,能完成預(yù)定好的、獨(dú)立的任務(wù),能被其他函數(shù)所調(diào)用。那么,如何立的任務(wù),能被其他函數(shù)所調(diào)用。那么,如何調(diào)用一個(gè)函數(shù)?調(diào)用一個(gè)函數(shù)? 函數(shù)的調(diào)用和執(zhí)行的實(shí)質(zhì)是控制轉(zhuǎn)移,調(diào)用函函數(shù)的調(diào)用和執(zhí)行的實(shí)質(zhì)是控制轉(zhuǎn)移,調(diào)用函數(shù)時(shí),將控制轉(zhuǎn)到被調(diào)用的函數(shù),被調(diào)函數(shù)執(zhí)數(shù)時(shí),將控制轉(zhuǎn)到被調(diào)用的函數(shù),被調(diào)函數(shù)執(zhí)行結(jié)束時(shí),則將控制轉(zhuǎn)回主調(diào)函數(shù),繼續(xù)執(zhí)行行結(jié)束時(shí),則將控制轉(zhuǎn)回主調(diào)函數(shù),繼續(xù)執(zhí)行后續(xù)的操作后續(xù)的操作 。子函數(shù)子函數(shù)1子函數(shù)子函數(shù)2主函數(shù)主函數(shù) 整理整理
21、ppt26int square(int); /*函數(shù)原型函數(shù)原型*/main() int x; for (x = 1; x = 10; x+) printf(“%4d”,square(2 * x); int square(int y) /*函數(shù)定義函數(shù)定義*/ return (y * y);實(shí)參實(shí)參形參形參函數(shù)調(diào)用過(guò)程:函數(shù)調(diào)用過(guò)程:給被調(diào)用函數(shù)分配存儲(chǔ)空間;給被調(diào)用函數(shù)分配存儲(chǔ)空間;計(jì)算實(shí)際參數(shù)表達(dá)式的值;計(jì)算實(shí)際參數(shù)表達(dá)式的值;把實(shí)際參數(shù)的值按賦值轉(zhuǎn)換規(guī)則把實(shí)際參數(shù)的值按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成形式參數(shù)的類(lèi)型。轉(zhuǎn)換成形式參數(shù)的類(lèi)型。把轉(zhuǎn)換后的實(shí)際參數(shù)(實(shí)參)的把轉(zhuǎn)換后的實(shí)際參數(shù)(實(shí)參)的值送入形
22、式參數(shù)(形參)中。值送入形式參數(shù)(形參)中。運(yùn)行調(diào)用函數(shù)中的語(yǔ)句;運(yùn)行調(diào)用函數(shù)中的語(yǔ)句;計(jì)算返回值表達(dá)式的值,并轉(zhuǎn)換計(jì)算返回值表達(dá)式的值,并轉(zhuǎn)換成函數(shù)的結(jié)果類(lèi)型;成函數(shù)的結(jié)果類(lèi)型;釋放被調(diào)用函數(shù)占用的存儲(chǔ)空間;釋放被調(diào)用函數(shù)占用的存儲(chǔ)空間;1.帶著轉(zhuǎn)換后的值返回調(diào)用函數(shù)。帶著轉(zhuǎn)換后的值返回調(diào)用函數(shù)。函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)原型的作用:是對(duì)被調(diào)函數(shù)原型的作用:是對(duì)被調(diào)用函數(shù)的用函數(shù)的接口聲明,接口聲明,它告它告訴編譯器函數(shù)返回的數(shù)據(jù)訴編譯器函數(shù)返回的數(shù)據(jù)類(lèi)型、函數(shù)所要接收的參類(lèi)型、函數(shù)所要接收的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和參數(shù)數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和參數(shù)順序,編譯器用函數(shù)原型順序,編譯器用函數(shù)原型校驗(yàn)函數(shù)調(diào)用是否
23、正確。校驗(yàn)函數(shù)調(diào)用是否正確。函數(shù)調(diào)用:函數(shù)調(diào)用: 函數(shù)名函數(shù)名(實(shí)參實(shí)參1,實(shí)參,實(shí)參2, ) 整理整理ppt275.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用int square(int); /*函數(shù)原型函數(shù)原型*/main() int x; for (x = 1; x = 10; x+) printf(“%4d”,square(2 * x); int square(int y) /*函數(shù)定義函數(shù)定義*/ return(y * y);2000H2002H2005H2007H2006H2003H2001Hx存儲(chǔ)空間存儲(chǔ)空間y12 4函數(shù)調(diào)用函數(shù)調(diào)用 整理整理ppt285.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用#inc
24、ludemain() int i;for(i = 1000;i = 9999;i+) if (isPrim(i) = 1) printf(%dt, i); return 0; int isPrim(int n) /略略 輸出輸出4位正整數(shù)中的素?cái)?shù)位正整數(shù)中的素?cái)?shù)等價(jià)于:等價(jià)于:for(i = 1000;i = 9999;i+) if(isPrim(i) printf(%dt,i);此種寫(xiě)法更接近于人慣用的此種寫(xiě)法更接近于人慣用的表達(dá)方式表達(dá)方式 整理整理ppt29在語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù):在語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù):對(duì)于有返回值的函數(shù):對(duì)于有返回值的函數(shù):(1)函數(shù)表達(dá)式
25、函數(shù)表達(dá)式。函數(shù)作為表達(dá)式的一個(gè)操作數(shù),出現(xiàn)在。函數(shù)作為表達(dá)式的一個(gè)操作數(shù),出現(xiàn)在表達(dá)式中,函數(shù)返回值參與表達(dá)式的運(yùn)算。表達(dá)式中,函數(shù)返回值參與表達(dá)式的運(yùn)算。 如:如:i = 2*max(x, y); if (isPrim(n)(2)函數(shù)實(shí)參函數(shù)實(shí)參。函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)。這。函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送。如:種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送。如: printf(”the large number is %d”, max(x, y);對(duì)于無(wú)返回值的函數(shù):對(duì)于無(wú)返回值的函數(shù):(3)函數(shù)語(yǔ)句函數(shù)語(yǔ)句。C語(yǔ)言中的函數(shù)可以只進(jìn)行某些操
26、作而不語(yǔ)言中的函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時(shí)的函數(shù)調(diào)用可作為一條獨(dú)立的語(yǔ)句。返回函數(shù)值,這時(shí)的函數(shù)調(diào)用可作為一條獨(dú)立的語(yǔ)句。如:如:printf(”hellon”);5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 整理整理ppt305.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用切記切記:實(shí)參的個(gè)數(shù)、類(lèi)型和順序,應(yīng)該與形參:實(shí)參的個(gè)數(shù)、類(lèi)型和順序,應(yīng)該與形參個(gè)數(shù)、類(lèi)型和順序一致,才能正確地進(jìn)行數(shù)據(jù)個(gè)數(shù)、類(lèi)型和順序一致,才能正確地進(jìn)行數(shù)據(jù)傳遞。傳遞。 實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等。無(wú)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等。無(wú)論實(shí)參是何種類(lèi)型的量,在進(jìn)行函數(shù)調(diào)用時(shí),論實(shí)參是何種類(lèi)型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們
27、都必須具有確定的值,以便把這些值傳送它們都必須具有確定的值,以便把這些值傳送給形參。給形參。 形參變量只有在被調(diào)用時(shí),才分配內(nèi)存單元;形參變量只有在被調(diào)用時(shí),才分配內(nèi)存單元;調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元(有調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元(有例外,以后會(huì)講到)。例外,以后會(huì)講到)。 整理整理ppt315.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 實(shí)參和形參占用不同的內(nèi)存單元,即使同名也實(shí)參和形參占用不同的內(nèi)存單元,即使同名也互不影響。互不影響。 實(shí)參對(duì)形參的數(shù)據(jù)傳送是單向的,即只能把實(shí)實(shí)參對(duì)形參的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向傳參的值傳送給形參,而不能把形參
28、的值反向傳送給實(shí)參。送給實(shí)參。 不同函數(shù)中可以使用相同名稱(chēng)和類(lèi)型的變量,不同函數(shù)中可以使用相同名稱(chēng)和類(lèi)型的變量,它們占用不同的內(nèi)存單元,互不影響。它們占用不同的內(nèi)存單元,互不影響。 整理整理ppt325.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 如何確保能夠逐層返回到上一級(jí)調(diào)用?如何確保能夠逐層返回到上一級(jí)調(diào)用? 為何不同的函數(shù)可以使用同名的參數(shù)和變量?為何不同的函數(shù)可以使用同名的參數(shù)和變量? 進(jìn)一步剖析函數(shù)的調(diào)用過(guò)程。進(jìn)一步剖析函數(shù)的調(diào)用過(guò)程。 整理整理ppt33數(shù)據(jù)在內(nèi)存中的存儲(chǔ)數(shù)據(jù)在內(nèi)存中的存儲(chǔ)系統(tǒng)區(qū):用于存放系統(tǒng)軟件和運(yùn)行系統(tǒng)區(qū):用于存放系統(tǒng)軟件和運(yùn)行需要的數(shù)據(jù),如操作系統(tǒng)。只要需要的數(shù)據(jù),如操作
29、系統(tǒng)。只要機(jī)器一運(yùn)行,這部分空間就必須機(jī)器一運(yùn)行,這部分空間就必須保留給系統(tǒng)軟件使用。保留給系統(tǒng)軟件使用。用戶(hù)程序代碼區(qū):存放用戶(hù)程序的用戶(hù)程序代碼區(qū):存放用戶(hù)程序的代碼。代碼。靜態(tài)存儲(chǔ)區(qū):存放程序運(yùn)行期間不靜態(tài)存儲(chǔ)區(qū):存放程序運(yùn)行期間不釋放的數(shù)據(jù)(靜態(tài)局部變量,全釋放的數(shù)據(jù)(靜態(tài)局部變量,全局變量);局變量);棧區(qū):存放程序運(yùn)行期間會(huì)被釋放棧區(qū):存放程序運(yùn)行期間會(huì)被釋放的數(shù)據(jù)(非靜態(tài)局部變量)以及的數(shù)據(jù)(非靜態(tài)局部變量)以及活動(dòng)的控制信息;活動(dòng)的控制信息;堆區(qū):用戶(hù)可以在程序運(yùn)行過(guò)程中堆區(qū):用戶(hù)可以在程序運(yùn)行過(guò)程中根據(jù)需要?jiǎng)討B(tài)地進(jìn)行存儲(chǔ)空間的根據(jù)需要?jiǎng)討B(tài)地進(jìn)行存儲(chǔ)空間的分配,這樣的分配在堆區(qū)
30、進(jìn)行;分配,這樣的分配在堆區(qū)進(jìn)行;5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 用用戶(hù)戶(hù)數(shù)數(shù)據(jù)據(jù)區(qū)區(qū)int num; /全局變量全局變量void func(int n) static int m;/靜態(tài)局部變量靜態(tài)局部變量 整理整理ppt34 一個(gè)類(lèi)比:裝東西的籮筐一個(gè)類(lèi)比:裝東西的籮筐籮筐:一個(gè)存放東西的容器,框底封了口?;j筐:一個(gè)存放東西的容器,框底封了口。 裝東西:東西從籮筐口入;裝東西:東西從籮筐口入; 取東西:東西從籮筐口出,框頂?shù)臇|西先被取取東西:東西從籮筐口出,框頂?shù)臇|西先被取出。即最先放入的東西最后才能取出;最后放出。即最先放入的東西最后才能取出;最后放入的東西最先取出(先進(jìn)后出)。入的東
31、西最先取出(先進(jìn)后出)。5.2.3 函數(shù)的調(diào)用棧區(qū)簡(jiǎn)介函數(shù)的調(diào)用棧區(qū)簡(jiǎn)介重點(diǎn)介紹和函數(shù)調(diào)用相關(guān)的棧區(qū):重點(diǎn)介紹和函數(shù)調(diào)用相關(guān)的棧區(qū): 整理整理ppt35 棧區(qū)棧區(qū) 一片存放用戶(hù)數(shù)據(jù)的內(nèi)存空間;一端一片存放用戶(hù)數(shù)據(jù)的內(nèi)存空間;一端“封封”了口(棧底),一端了口(棧底),一端“開(kāi)開(kāi)”著口著口(棧頂棧頂); 保存數(shù)據(jù)保存數(shù)據(jù):數(shù)據(jù)只能從頂部(:數(shù)據(jù)只能從頂部(棧頂棧頂)進(jìn)入;)進(jìn)入; 取數(shù)據(jù)取數(shù)據(jù):棧頂?shù)臄?shù)據(jù)先被取出,:棧頂?shù)臄?shù)據(jù)先被取出,棧底棧底的數(shù)據(jù)的數(shù)據(jù)最后被取出。即數(shù)據(jù)是最后被取出。即數(shù)據(jù)是“先進(jìn)后出先進(jìn)后出”。數(shù)據(jù)。數(shù)據(jù)的進(jìn)入和退出均在棧頂進(jìn)行。的進(jìn)入和退出均在棧頂進(jìn)行。 讀數(shù)據(jù)讀數(shù)據(jù):只
32、能讀?。褐荒茏x取 棧頂?shù)臄?shù)據(jù)棧頂?shù)臄?shù)據(jù)5.2.3 函數(shù)的調(diào)用棧區(qū)簡(jiǎn)介函數(shù)的調(diào)用棧區(qū)簡(jiǎn)介棧底棧底棧頂棧頂 整理整理ppt365.2.3 函數(shù)的調(diào)用棧區(qū)簡(jiǎn)介函數(shù)的調(diào)用棧區(qū)簡(jiǎn)介設(shè)計(jì)了一個(gè)位置指示設(shè)計(jì)了一個(gè)位置指示top,用來(lái)指示當(dāng)前的棧頂位置。,用來(lái)指示當(dāng)前的棧頂位置。通過(guò)通過(guò)top可以訪問(wèn)當(dāng)前棧頂數(shù)據(jù)。數(shù)據(jù)的進(jìn)入和退可以訪問(wèn)當(dāng)前棧頂數(shù)據(jù)。數(shù)據(jù)的進(jìn)入和退出通過(guò)修改出通過(guò)修改top的值來(lái)實(shí)現(xiàn)。的值來(lái)實(shí)現(xiàn)。數(shù)據(jù)退出數(shù)據(jù)退出數(shù)據(jù)進(jìn)入數(shù)據(jù)進(jìn)入 整理整理ppt37函數(shù)調(diào)用過(guò)程函數(shù)調(diào)用過(guò)程-開(kāi)辟新的運(yùn)行環(huán)境開(kāi)辟新的運(yùn)行環(huán)境int square(int); /*函數(shù)原型函數(shù)原型*/main() int x; fo
33、r (x=1; x=10; x+) printf(“%4d”,square(x); int square(int y) /*函數(shù)定義函數(shù)定義*/ return(y*y);運(yùn)行環(huán)境即指函數(shù)執(zhí)行時(shí)需要的數(shù)運(yùn)行環(huán)境即指函數(shù)執(zhí)行時(shí)需要的數(shù)據(jù)空間。需要哪些數(shù)據(jù)空間?據(jù)空間。需要哪些數(shù)據(jù)空間?函數(shù)執(zhí)行時(shí)需要的數(shù)據(jù)空間函數(shù)執(zhí)行時(shí)需要的數(shù)據(jù)空間 1. 生存期在本次函數(shù)執(zhí)行過(guò)程中生存期在本次函數(shù)執(zhí)行過(guò)程中的的數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象,如,如形參、局部變量形參、局部變量等;等; 2.用以用以管理函數(shù)調(diào)用過(guò)程管理函數(shù)調(diào)用過(guò)程的信息。的信息。當(dāng)函數(shù)當(dāng)函數(shù)A調(diào)用函數(shù)函數(shù)調(diào)用函數(shù)函數(shù)B時(shí),函數(shù)時(shí),函數(shù)A的運(yùn)行被中斷,的運(yùn)行被中斷
34、,當(dāng)前機(jī)器的狀態(tài)當(dāng)前機(jī)器的狀態(tài)信息信息,如,如程序計(jì)數(shù)器程序計(jì)數(shù)器(返回地(返回地址)、址)、寄存器寄存器的值等都必須保存,的值等都必須保存,以便調(diào)用結(jié)束后,能準(zhǔn)確返回到以便調(diào)用結(jié)束后,能準(zhǔn)確返回到函數(shù)函數(shù)A并繼續(xù)正確執(zhí)行。并繼續(xù)正確執(zhí)行。 整理整理ppt385.2.3 函數(shù)調(diào)用過(guò)程函數(shù)調(diào)用過(guò)程-開(kāi)辟新的運(yùn)行環(huán)境開(kāi)辟新的運(yùn)行環(huán)境 為方便,引入一個(gè)術(shù)語(yǔ):為方便,引入一個(gè)術(shù)語(yǔ):“函數(shù)的活動(dòng)記錄函數(shù)的活動(dòng)記錄”。函數(shù)的活。函數(shù)的活動(dòng)記錄是一段在動(dòng)記錄是一段在棧區(qū)棧區(qū)分配的連續(xù)的內(nèi)存存儲(chǔ)區(qū),用以存放分配的連續(xù)的內(nèi)存存儲(chǔ)區(qū),用以存放函數(shù)一次執(zhí)行所需的數(shù)據(jù)。函數(shù)一次執(zhí)行所需的數(shù)據(jù)。 開(kāi)辟新的運(yùn)行環(huán)境即指在
35、開(kāi)辟新的運(yùn)行環(huán)境即指在棧區(qū)的棧頂棧區(qū)的棧頂創(chuàng)建一個(gè)函數(shù)活動(dòng)記創(chuàng)建一個(gè)函數(shù)活動(dòng)記錄。釋放本函數(shù)的運(yùn)行環(huán)境即指從棧頂將活動(dòng)記錄釋放。錄。釋放本函數(shù)的運(yùn)行環(huán)境即指從棧頂將活動(dòng)記錄釋放。 被調(diào)用函數(shù)中被調(diào)用函數(shù)中的數(shù)據(jù)的數(shù)據(jù) 現(xiàn)場(chǎng)信息,用現(xiàn)場(chǎng)信息,用于調(diào)用結(jié)束能于調(diào)用結(jié)束能正確返回正確返回 整理整理ppt395.2.3 函數(shù)調(diào)用過(guò)程函數(shù)調(diào)用過(guò)程-開(kāi)辟新的運(yùn)行環(huán)境開(kāi)辟新的運(yùn)行環(huán)境int square(int); /*main() int x; for (x=1; x=10; x+) printf(“%4d”,square(x); int square(int y) /*函數(shù)定義函數(shù)定義*/ return
36、(y*y); 為簡(jiǎn)化起見(jiàn),假設(shè)為簡(jiǎn)化起見(jiàn),假設(shè)square函數(shù)的活動(dòng)函數(shù)的活動(dòng)記錄只包含分配給記錄只包含分配給形參形參y和返回地址的和返回地址的存儲(chǔ)空間存儲(chǔ)空間 整理整理ppt40 int square(int); /*main() int x; for (x=1; x=3; x+) printf(“%4d”,square(x); int square(int y) /*函數(shù)定義函數(shù)定義*/ return(y*y);棧底棧底棧底棧底 整理整理ppt41函數(shù)活動(dòng)記錄使用示例函數(shù)活動(dòng)記錄使用示例main() A(); B(); void A() C(); 整理整理ppt42函數(shù)調(diào)用過(guò)程函數(shù)調(diào)用過(guò)程
37、總結(jié)總結(jié) 如何確保能夠逐層返回到上一級(jí)調(diào)用?如何確保能夠逐層返回到上一級(jí)調(diào)用?函數(shù)函數(shù)A調(diào)用函數(shù)調(diào)用函數(shù)B,則在函數(shù),則在函數(shù)B的活動(dòng)記錄中記的活動(dòng)記錄中記錄了錄了A的返回地址。返回前取出該地址,即能的返回地址。返回前取出該地址,即能正確返回。正確返回。 為何不同的函數(shù)可以使用同名的參數(shù)和變量?為何不同的函數(shù)可以使用同名的參數(shù)和變量? 因?yàn)椴煌瘮?shù)的活動(dòng)記錄占用不同的內(nèi)存單元,因?yàn)椴煌瘮?shù)的活動(dòng)記錄占用不同的內(nèi)存單元,程序運(yùn)行時(shí)始終是從位于棧頂?shù)幕顒?dòng)記錄中取程序運(yùn)行時(shí)始終是從位于棧頂?shù)幕顒?dòng)記錄中取形參和變量的值。形參和變量的值。 整理整理ppt43子程序參數(shù)傳遞兩種方式:子程序參數(shù)傳遞兩種方式
38、:按值傳遞按值傳遞和和按引用傳遞按引用傳遞。按值傳遞按值傳遞:實(shí)參的值被復(fù)制并置入被調(diào)用子程序的形實(shí)參的值被復(fù)制并置入被調(diào)用子程序的形參中。此方式下不管在被調(diào)用子程序中怎樣操作并參中。此方式下不管在被調(diào)用子程序中怎樣操作并改變形參的值,在主調(diào)程序中的實(shí)參的值都是安全改變形參的值,在主調(diào)程序中的實(shí)參的值都是安全的未發(fā)生變化的。的未發(fā)生變化的。5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用按值傳遞按值傳遞按值傳遞(將實(shí)參的按值傳遞(將實(shí)參的值傳遞給形參)值傳遞給形參)實(shí)參實(shí)參實(shí)參實(shí)參形參形參形參形參 整理整理ppt445.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用按引用傳遞(函按引用傳遞(函數(shù)調(diào)用時(shí)實(shí)參數(shù)調(diào)用時(shí)實(shí)參雖然寫(xiě)的是
39、變雖然寫(xiě)的是變量量max,但實(shí),但實(shí)際傳遞的不是際傳遞的不是max的值,而的值,而是是max的地址)的地址)主調(diào)程序主調(diào)程序(實(shí)參)(實(shí)參)子程序子程序 (形參形參)如何解決函數(shù)的多返回值問(wèn)題?如何解決函數(shù)的多返回值問(wèn)題?按引用傳遞按引用傳遞:此時(shí)實(shí)參必須是變量,子程序調(diào):此時(shí)實(shí)參必須是變量,子程序調(diào)用時(shí)將用時(shí)將實(shí)參的實(shí)參的地址地址而不是實(shí)參的值置入被調(diào)子而不是實(shí)參的值置入被調(diào)子程序的形參中。被調(diào)子程序?qū)π螀⒌牟僮鲗?shí)際程序的形參中。被調(diào)子程序?qū)π螀⒌牟僮鲗?shí)際上是對(duì)主調(diào)程序中實(shí)參的操作,從而向主調(diào)程上是對(duì)主調(diào)程序中實(shí)參的操作,從而向主調(diào)程序傳回函數(shù)處理結(jié)果。序傳回函數(shù)處理結(jié)果。 整理整理ppt4
40、55.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用注意:注意:C C語(yǔ)言中所有的調(diào)用都是語(yǔ)言中所有的調(diào)用都是傳值調(diào)用傳值調(diào)用,但但是可以通過(guò)其他方式來(lái)實(shí)現(xiàn)函數(shù)的多返回值是可以通過(guò)其他方式來(lái)實(shí)現(xiàn)函數(shù)的多返回值( (即實(shí)參本身存放的就是某個(gè)變量的內(nèi)存地址即實(shí)參本身存放的就是某個(gè)變量的內(nèi)存地址,將該地址傳遞給被調(diào)用函數(shù)后,被調(diào)用函,將該地址傳遞給被調(diào)用函數(shù)后,被調(diào)用函數(shù)通過(guò)該地址來(lái)訪問(wèn)變量,將函數(shù)處理結(jié)果數(shù)通過(guò)該地址來(lái)訪問(wèn)變量,將函數(shù)處理結(jié)果寫(xiě)入變量寫(xiě)入變量) )。具體以后學(xué)習(xí)指針時(shí)講解具體以后學(xué)習(xí)指針時(shí)講解 整理整理ppt465.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.2.1 函數(shù)函數(shù)5.2.2 函數(shù)的定義函
41、數(shù)的定義5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用5.2.4 函數(shù)原型函數(shù)原型5.3 頭文件頭文件5.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt47#includefloat square(float);/形參名可寫(xiě)可不寫(xiě)形參名可寫(xiě)可不寫(xiě)main() float x=2.5; printf(%.2f,square(x); system(pause);/*函數(shù)定義函數(shù)定義*/ float square(float y) return(y*y);5.2.4 函數(shù)的原型函數(shù)的原型編譯到藍(lán)色行時(shí)
42、報(bào)錯(cuò):編譯到藍(lán)色行時(shí)報(bào)錯(cuò):conflicting types for square。錯(cuò)誤原因:當(dāng)自上而下對(duì)錯(cuò)誤原因:當(dāng)自上而下對(duì)源程序編譯時(shí),編譯到源程序編譯時(shí),編譯到紅色字體那一行,編譯紅色字體那一行,編譯器會(huì)默認(rèn)器會(huì)默認(rèn)square(x)函數(shù)函數(shù)返回值類(lèi)型是返回值類(lèi)型是int型,從型,從而和后面的而和后面的float沖突。沖突。解決方法:在函數(shù)調(diào)用前解決方法:在函數(shù)調(diào)用前使用函數(shù)原型對(duì)函數(shù)進(jìn)使用函數(shù)原型對(duì)函數(shù)進(jìn)行聲明。行聲明。在文件在文件stdio.h中已經(jīng)給出了函數(shù)原型中已經(jīng)給出了函數(shù)原型思考:編譯器為何不會(huì)提示思考:編譯器為何不會(huì)提示printf未定義呢?未定義呢? 整理整理ppt48
43、(1) C語(yǔ)言的原則(先聲明、后使用);語(yǔ)言的原則(先聲明、后使用);(2)函數(shù)原型的作用:函數(shù)原型是對(duì)被調(diào)用函數(shù))函數(shù)原型的作用:函數(shù)原型是對(duì)被調(diào)用函數(shù)的的接口聲明,接口聲明,它告訴編譯器函數(shù)返回的數(shù)據(jù)類(lèi)型、它告訴編譯器函數(shù)返回的數(shù)據(jù)類(lèi)型、函數(shù)所要接收的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和參數(shù)順序,函數(shù)所要接收的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和參數(shù)順序,編譯器用函數(shù)原型校驗(yàn)函數(shù)調(diào)用是否正確。編譯器用函數(shù)原型校驗(yàn)函數(shù)調(diào)用是否正確。(3)函數(shù)原型一般格式:)函數(shù)原型一般格式: 返回值類(lèi)型返回值類(lèi)型 函數(shù)名函數(shù)名(數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 參數(shù)名參數(shù)名1, 數(shù)據(jù)數(shù)據(jù)類(lèi)型類(lèi)型 參數(shù)名參數(shù)名2);注意注意:參數(shù)名可寫(xiě)可不寫(xiě)。:參數(shù)名可寫(xiě)
44、可不寫(xiě)。 5.2.4 函數(shù)的原型函數(shù)的原型float square(float ); /*函數(shù)原型函數(shù)原型*/ 整理整理ppt49(4)函數(shù)原型可以放置在任何函數(shù)之外,出現(xiàn)在該函數(shù)原型可以放置在任何函數(shù)之外,出現(xiàn)在該函數(shù)原型之后的所有函數(shù)都可以調(diào)用對(duì)應(yīng)的函數(shù);函數(shù)原型之后的所有函數(shù)都可以調(diào)用對(duì)應(yīng)的函數(shù);也可以放在某個(gè)函數(shù)中,此時(shí)只有該函數(shù)能夠調(diào)也可以放在某個(gè)函數(shù)中,此時(shí)只有該函數(shù)能夠調(diào)用它。從程序設(shè)計(jì)風(fēng)格考慮,最好是將函數(shù)原型用它。從程序設(shè)計(jì)風(fēng)格考慮,最好是將函數(shù)原型集中在一起,放在主函數(shù)之前。集中在一起,放在主函數(shù)之前。(5)當(dāng)被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在該函數(shù)調(diào)用之)當(dāng)被調(diào)用函數(shù)的函數(shù)定義出
45、現(xiàn)在該函數(shù)調(diào)用之前時(shí),可以省略函數(shù)原型。因?yàn)樵谡{(diào)用之前,編前時(shí),可以省略函數(shù)原型。因?yàn)樵谡{(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類(lèi)型、參數(shù)譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、類(lèi)型和順序。個(gè)數(shù)、類(lèi)型和順序。5.2.4 函數(shù)的原型函數(shù)的原型/*square函數(shù)在函數(shù)在main和和fun中中均可被調(diào)用均可被調(diào)用*/float square(float); main() int fun() float square(float y) return(y*y);main()/*square函數(shù)只能在函數(shù)只能在main中被調(diào)用中被調(diào)用*/ float square(float); int f
46、un()float square(float y) return(y*y);/*函數(shù)定義函數(shù)定義*/ float square(float y) return(y*y);main() 整理整理ppt50(6)函數(shù)原型、函數(shù)定義、函數(shù)調(diào)用要保持一致。)函數(shù)原型、函數(shù)定義、函數(shù)調(diào)用要保持一致。和函數(shù)原型不匹配的函數(shù)調(diào)用會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤;函和函數(shù)原型不匹配的函數(shù)調(diào)用會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤;函數(shù)原型和函數(shù)定義不一致,也會(huì)產(chǎn)生錯(cuò)誤。數(shù)原型和函數(shù)定義不一致,也會(huì)產(chǎn)生錯(cuò)誤。(7)如果程序中沒(méi)有包含函數(shù)原型,則編譯器就會(huì))如果程序中沒(méi)有包含函數(shù)原型,則編譯器就會(huì)用第一次出現(xiàn)的該函數(shù)(函數(shù)定義或函數(shù)調(diào)用)來(lái)用第一次出現(xiàn)的
47、該函數(shù)(函數(shù)定義或函數(shù)調(diào)用)來(lái)構(gòu)造函數(shù)原型。默認(rèn)情況下,編譯器假定函數(shù)的返構(gòu)造函數(shù)原型。默認(rèn)情況下,編譯器假定函數(shù)的返回類(lèi)型為回類(lèi)型為int類(lèi)型,而對(duì)參數(shù)不作任何假定。類(lèi)型,而對(duì)參數(shù)不作任何假定。5.2.4 函數(shù)的原型函數(shù)的原型#includefloat square(float y);/函數(shù)原型函數(shù)原型main() float x=2.5; printf(“%.2f”,square(x); /函數(shù)調(diào)用函數(shù)調(diào)用 system(pause);/*函數(shù)定義函數(shù)定義*/ float square(float y) return(y*y); 整理整理ppt51(8)函數(shù)原型可以用來(lái)強(qiáng)制轉(zhuǎn)換參數(shù)類(lèi)型。)
48、函數(shù)原型可以用來(lái)強(qiáng)制轉(zhuǎn)換參數(shù)類(lèi)型。在函數(shù)調(diào)用之前,和函數(shù)原型中的參數(shù)類(lèi)型不完全一致在函數(shù)調(diào)用之前,和函數(shù)原型中的參數(shù)類(lèi)型不完全一致的實(shí)參值會(huì)被轉(zhuǎn)換為合適的類(lèi)型。的實(shí)參值會(huì)被轉(zhuǎn)換為合適的類(lèi)型。如:如: sqrt 的參數(shù)類(lèi)型是的參數(shù)類(lèi)型是double,進(jìn)行如下調(diào)用進(jìn)行如下調(diào)用printf(“%.3fn”,sqrt(4)時(shí),在將時(shí),在將4傳遞給傳遞給sqrt之前先轉(zhuǎn)換之前先轉(zhuǎn)換為為double類(lèi)型的值類(lèi)型的值4.0;參數(shù)類(lèi)型的轉(zhuǎn)換有可能是低類(lèi)型向高類(lèi)型轉(zhuǎn)換,也可能參數(shù)類(lèi)型的轉(zhuǎn)換有可能是低類(lèi)型向高類(lèi)型轉(zhuǎn)換,也可能是高類(lèi)型向低類(lèi)型轉(zhuǎn)換。高類(lèi)型向低類(lèi)型轉(zhuǎn)換可能會(huì)導(dǎo)是高類(lèi)型向低類(lèi)型轉(zhuǎn)換。高類(lèi)型向低類(lèi)型轉(zhuǎn)換可
49、能會(huì)導(dǎo)致不正確的結(jié)果(如致不正確的結(jié)果(如long類(lèi)型向類(lèi)型向short類(lèi)型的轉(zhuǎn)換)。類(lèi)型的轉(zhuǎn)換)。5.2.4 函數(shù)的原型函數(shù)的原型 整理整理ppt525.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.3 頭文件頭文件5.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt535.3 頭文件頭文件 對(duì)于一些通用的函數(shù)(如輸入輸出函數(shù)、數(shù)學(xué)對(duì)于一些通用的函數(shù)(如輸入輸出函數(shù)、數(shù)學(xué)函數(shù)等),可能在不同的程序中都會(huì)用到。函數(shù)等),可能在不同的程序中都會(huì)用到。 為了使用這些函數(shù),需要在程序中說(shuō)明其
50、函數(shù)為了使用這些函數(shù),需要在程序中說(shuō)明其函數(shù)原型。原型。n一種方式是在程序中逐個(gè)寫(xiě)出函數(shù)原型;一種方式是在程序中逐個(gè)寫(xiě)出函數(shù)原型;double sqrt(double x) ;double fabs(double x) ;n另一種方式是將這些函數(shù)原型集中在一起,另一種方式是將這些函數(shù)原型集中在一起,形成形成.h頭文件頭文件,然后在程序中直接包含這些然后在程序中直接包含這些頭文件。頭文件。#include 整理整理ppt54每一個(gè)標(biāo)準(zhǔn)庫(kù)都有一個(gè)相應(yīng)的頭文件每一個(gè)標(biāo)準(zhǔn)庫(kù)都有一個(gè)相應(yīng)的頭文件,文件擴(kuò)展名為文件擴(kuò)展名為.h(如如stdio.h,示例示例)。該頭文件包含了該庫(kù)中所有函數(shù)該頭文件包含了該庫(kù)
51、中所有函數(shù)的原型以及這些函數(shù)所需的所有常量和數(shù)據(jù)類(lèi)型的定的原型以及這些函數(shù)所需的所有常量和數(shù)據(jù)類(lèi)型的定義。義。程序員可以根據(jù)需要自己建立頭文件,使用程序員可以根據(jù)需要自己建立頭文件,使用include命命令可以把程序員定義的頭文件包含到程序中,如:令可以把程序員定義的頭文件包含到程序中,如:#include “square.h”注意注意:#include包含標(biāo)準(zhǔn)庫(kù)的頭文件包含標(biāo)準(zhǔn)庫(kù)的頭文件#include “square.h” 包含程序員自定義的頭文件包含程序員自定義的頭文件5.3 頭文件頭文件 整理整理ppt555.1 子程序設(shè)計(jì)子程序設(shè)計(jì)5.2 函數(shù)函數(shù)5.3 頭文件頭文件5.4 函數(shù)應(yīng)用
52、舉例函數(shù)應(yīng)用舉例5.5 變量作用域變量作用域5.6 變量的存儲(chǔ)類(lèi)別變量的存儲(chǔ)類(lèi)別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt56例例1 1、驗(yàn)證歌德巴赫猜想、驗(yàn)證歌德巴赫猜想 任一充分大的偶數(shù),可以用兩個(gè)素?cái)?shù)之和表示,任一充分大的偶數(shù),可以用兩個(gè)素?cái)?shù)之和表示,例如:例如:4 = 2 + 24 = 2 + 26 = 3 + 36 = 3 + 3 10 = 3 + 710 = 3 + 7 10 = 5 + 510 = 5 + 5.9 8 = 1 9 + 7 99 8 = 1 9 + 7 9輸入一個(gè)偶數(shù),將其表示為兩素?cái)?shù)之和,并輸出輸入一個(gè)偶數(shù),將其表示為兩素?cái)?shù)之和,并輸出5
53、.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例 整理整理ppt57例例1 1、驗(yàn)證歌德巴赫猜想、驗(yàn)證歌德巴赫猜想 思路:偶數(shù)思路:偶數(shù)num是要分解的數(shù),則是要分解的數(shù),則 num = i + (num - i) 其中其中i和和(num - i)都得是素?cái)?shù)都得是素?cái)?shù) 因此可以對(duì)因此可以對(duì)i可能的取值進(jìn)行窮舉??赡艿娜≈颠M(jìn)行窮舉。 整理整理ppt58例例1 1、驗(yàn)證歌德巴赫猜想、驗(yàn)證歌德巴赫猜想main()int num;/*num:要判斷的一個(gè)偶數(shù)要判斷的一個(gè)偶數(shù)*/ int num1; /*num表示為兩個(gè)素?cái)?shù)表示為兩個(gè)素?cái)?shù)num1和和num-num1之和之和*/ int count;/*計(jì)數(shù)輸出個(gè)數(shù),用于
54、換行。計(jì)數(shù)輸出個(gè)數(shù),用于換行。*/ printf(輸入要驗(yàn)證的偶數(shù):輸入要驗(yàn)證的偶數(shù):); scanf(%d,&num);if (num%2!=0) printf(輸入的數(shù)不是偶數(shù),程序終止輸入的數(shù)不是偶數(shù),程序終止n); 整理整理ppt59例例1 1、驗(yàn)證歌德巴赫猜想、驗(yàn)證歌德巴赫猜想 else/采用窮舉法,將采用窮舉法,將num分解為兩個(gè)素?cái)?shù)之和分解為兩個(gè)素?cái)?shù)之和 count=0; for(num1=2;num1=num/2;num1+) if (isPrim(num1) & isPrim(num-num1) printf(%d = %d + %dt,num,num1,nu
55、m-num1); count+; if(count%3=0) printf(n);/每輸出每輸出3個(gè)數(shù)換一行個(gè)數(shù)換一行 /end of if /end of for /end of else system(pause); return 0; 整理整理ppt605.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例 例例2:設(shè)計(jì)一個(gè)函數(shù),將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn):設(shè)計(jì)一個(gè)函數(shù),將十進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制、八進(jìn)制和十六進(jìn)制。然后在主函數(shù)中讀入制、八進(jìn)制和十六進(jìn)制。然后在主函數(shù)中讀入一個(gè)整數(shù),調(diào)用函數(shù),輸出轉(zhuǎn)換結(jié)果。一個(gè)整數(shù),調(diào)用函數(shù),輸出轉(zhuǎn)換結(jié)果。 算法思路:見(jiàn)算法思路:見(jiàn)C程序設(shè)計(jì)教程程序設(shè)計(jì)教程489490頁(yè)頁(yè) 整理整理p
56、pt61例例2.進(jìn)制轉(zhuǎn)換進(jìn)制轉(zhuǎn)換 假設(shè)將十進(jìn)制數(shù)假設(shè)將十進(jìn)制數(shù)57轉(zhuǎn)換為二進(jìn)制轉(zhuǎn)換為二進(jìn)制 從右到左寫(xiě)出每列的位值,直到發(fā)現(xiàn)位值大于該從右到左寫(xiě)出每列的位值,直到發(fā)現(xiàn)位值大于該十進(jìn)制數(shù)的列。這樣就先得到十進(jìn)制數(shù)的列。這樣就先得到 位值:位值:64 32 16 8 4 2 1 然后去掉位值為然后去掉位值為64的列,得到:的列,得到: 位值:位值:32 16 8 4 2 1 然后,從左至右進(jìn)行。然后,從左至右進(jìn)行。57除以除以32得商為得商為1,余數(shù),余數(shù)為為25,所以在,所以在32這列寫(xiě)下這列寫(xiě)下1,然后,然后25除以除以16商為商為1,余數(shù)為余數(shù)為9,所以在,所以在16這列寫(xiě)下這列寫(xiě)下1, 位
57、值:位值: 32 16 8 4 2 1 符號(hào)值:符號(hào)值: 1 1 1 0 0 1 所以所以(57)10=(111001)2 整理整理ppt62例例2.進(jìn)制轉(zhuǎn)換進(jìn)制轉(zhuǎn)換 假設(shè)將十進(jìn)制數(shù)假設(shè)將十進(jìn)制數(shù)57轉(zhuǎn)換為八進(jìn)制轉(zhuǎn)換為八進(jìn)制 從右到左寫(xiě)出每列的位值,直到發(fā)現(xiàn)位值大于該十進(jìn)從右到左寫(xiě)出每列的位值,直到發(fā)現(xiàn)位值大于該十進(jìn)制數(shù)的列。這樣就先得到制數(shù)的列。這樣就先得到 位值:位值:64 8 1 然后去掉位值為然后去掉位值為64的列,得到:的列,得到: 位值:位值:8 1 然后,從左至右進(jìn)行。然后,從左至右進(jìn)行。57除以除以8得商為得商為7,余數(shù)為,余數(shù)為1,所,所以在以在8這列寫(xiě)下這列寫(xiě)下1,然后,然
58、后1除以除以1商為商為1,余數(shù)為,余數(shù)為0,所以,所以在在1這列寫(xiě)下這列寫(xiě)下1. 位值:位值: 8 1 符號(hào)值:符號(hào)值: 7 1 所以所以(57)10=(71)8 整理整理ppt63例例2.進(jìn)制轉(zhuǎn)換進(jìn)制轉(zhuǎn)換/*將將num轉(zhuǎn)換為轉(zhuǎn)換為base進(jìn)制并輸出進(jìn)制并輸出*/ void transfer(int num,int base) int p,k; p = 1; while (p = num) /求求p:p是是base的的x次冪,且次冪,且p大于大于num p = p * base; p = p / base; /*循環(huán)求循環(huán)求base進(jìn)制數(shù)的各位進(jìn)制數(shù)的各位*/ while( p != 0) k
59、 = num /p; /*計(jì)算當(dāng)前要輸出的那個(gè)十進(jìn)制數(shù)計(jì)算當(dāng)前要輸出的那個(gè)十進(jìn)制數(shù)*/ if (k = 9) printf(%d,k); else printf(%c,k 10 + A); num = num % p; p = p / base; 整理整理ppt64例例3:擲骰子游戲:擲骰子游戲(見(jiàn)見(jiàn)C程序設(shè)計(jì)教程程序設(shè)計(jì)教程119頁(yè)頁(yè))1、rand()函數(shù):函數(shù):產(chǎn)生一個(gè)產(chǎn)生一個(gè)0到到RAND_MAX之間的整數(shù),使用時(shí)之間的整數(shù),使用時(shí)需要包含頭文件需要包含頭文件 。 RAND_MAX 是在頭文件是在頭文件中定義的符中定義的符號(hào)常量,號(hào)常量,ANSI規(guī)定其不得小于規(guī)定其不得小于32767。
60、用于產(chǎn)生用于產(chǎn)生16之間的隨機(jī)數(shù):之間的隨機(jī)數(shù): 1+rand()%65.4 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例 整理整理ppt65每一次調(diào)用函數(shù)每一次調(diào)用函數(shù)rand()時(shí),時(shí),0到到RAND_MAX之之間的每一個(gè)數(shù)字被選中的機(jī)會(huì)幾乎均等(見(jiàn)書(shū)間的每一個(gè)數(shù)字被選中的機(jī)會(huì)幾乎均等(見(jiàn)書(shū)上上120頁(yè)圖頁(yè)圖5-5)rand()所產(chǎn)生的隨機(jī)數(shù)是偽隨機(jī)數(shù),反復(fù)調(diào)用所產(chǎn)生的隨機(jī)數(shù)是偽隨機(jī)數(shù),反復(fù)調(diào)用rand()產(chǎn)生的一系列數(shù)似乎是隨機(jī)的,但是每產(chǎn)生的一系列數(shù)似乎是隨機(jī)的,但是每次執(zhí)行程序所產(chǎn)生的序列則是重復(fù)的次執(zhí)行程序所產(chǎn)生的序列則是重復(fù)的(重復(fù)運(yùn)行重復(fù)運(yùn)行120頁(yè)圖頁(yè)圖5-4的程序得到的結(jié)果是一樣的的程序得到的結(jié)果是一樣的)。5.4 函數(shù)應(yīng)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 前臺(tái)收銀合同范例
- 空調(diào)拆除安裝維修合同范例
- 器材安裝合同范例
- 鋼管租賃合同范例百度范例
- 培訓(xùn)新員工合同范例
- 吊裝運(yùn)輸合同范例
- 勞務(wù)合同不是勞動(dòng)合同范例
- 購(gòu)貨合同與購(gòu)銷(xiāo)合同的相似之處
- 酒吧夜店宣傳單印刷服務(wù)合同
- 股東墊資協(xié)議合同模板
- 小兒全麻患者術(shù)后護(hù)理
- 黑龍江省哈爾濱市2023-2024學(xué)年八年級(jí)上學(xué)期語(yǔ)文期末模擬考試試卷(含答案)
- 理論力學(xué)(浙江大學(xué))知到智慧樹(shù)章節(jié)答案
- 云南省普通高中2023-2024學(xué)年高一上學(xué)期1月期末學(xué)業(yè)水平考試技術(shù)試卷
- 2024年百科知識(shí)競(jìng)賽題庫(kù)及答案(共三套)
- JGJ-T490-2021鋼框架內(nèi)填墻板結(jié)構(gòu)技術(shù)標(biāo)準(zhǔn)
- 2024年移動(dòng)解決方案經(jīng)理認(rèn)證考試題庫(kù)大全-中(多選題)
- 破碎錘項(xiàng)目營(yíng)銷(xiāo)計(jì)劃書(shū)
- 愚公移山英文 -中國(guó)故事英文版課件
- 國(guó)開(kāi)經(jīng)濟(jì)學(xué)(本)1-14章練習(xí)試題及答案
- 三相橋式有源逆變電路的仿真Word版
評(píng)論
0/150
提交評(píng)論