C語言完整函數(shù)教程_第1頁
C語言完整函數(shù)教程_第2頁
C語言完整函數(shù)教程_第3頁
C語言完整函數(shù)教程_第4頁
C語言完整函數(shù)教程_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 整理整理ppt1第五章第五章 函數(shù)函數(shù) 整理整理ppt25.1 子程序設計子程序設計5.2 函數(shù)函數(shù)5.3 頭文件頭文件5.4 函數(shù)應用舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量的存儲類別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt3 編寫程序,求所有四位可逆素數(shù)編寫程序,求所有四位可逆素數(shù) ,所謂可逆素所謂可逆素數(shù)是這么一種素數(shù),它的逆數(shù)也是素數(shù)。數(shù)是這么一種素數(shù),它的逆數(shù)也是素數(shù)。 包含的主要功能:包含的主要功能: 判斷一個數(shù)是否素數(shù)。判斷一個數(shù)是否素數(shù)。 求一個整數(shù)的逆數(shù)。如求一個整數(shù)的逆數(shù)。如1234的逆數(shù)是的逆數(shù)是4321。 5.

2、1 子程序設計子程序設計 整理整理ppt45.1 子程序設計子程序設計求可逆素數(shù)求可逆素數(shù) 本程序中判斷素數(shù)的代碼本程序中判斷素數(shù)的代碼會出現(xiàn)兩次;會出現(xiàn)兩次; 判斷素數(shù)、求整數(shù)逆數(shù)這判斷素數(shù)、求整數(shù)逆數(shù)這兩個功能是獨立的功能,兩個功能是獨立的功能,且在多個程序中都有可能且在多個程序中都有可能用到:用到: 求一個整數(shù)的逆數(shù):該求一個整數(shù)的逆數(shù):該功能在判斷一個整數(shù)是功能在判斷一個整數(shù)是否回文數(shù)中也被用到;否回文數(shù)中也被用到; 判斷一個數(shù)是否素數(shù):判斷一個數(shù)是否素數(shù):該功能在對整數(shù)進行素該功能在對整數(shù)進行素數(shù)分解中用到。數(shù)分解中用到。 整理整理ppt55.1 子程序設計子程序設計 能否將完成上述

3、獨立功能的代碼包裝成一個單能否將完成上述獨立功能的代碼包裝成一個單元,并且可以供其他代碼來調(diào)用?元,并且可以供其他代碼來調(diào)用?-答案是可答案是可以使用以使用子程序子程序一一. 子程序的定義子程序的定義 子程序是子程序是封裝封裝并給以并給以命名命名的一段程序代碼的一段程序代碼,這,這段程序代碼完成子程序所定義的功能,可供調(diào)段程序代碼完成子程序所定義的功能,可供調(diào)用。用。 封裝封裝:調(diào)用者只需要關心代碼能完成什么功能,:調(diào)用者只需要關心代碼能完成什么功能,如何調(diào)用代碼(即子程序接口),而不需要關如何調(diào)用代碼(即子程序接口),而不需要關心代碼的內(nèi)部實現(xiàn)。心代碼的內(nèi)部實現(xiàn)。 整理整理ppt6判斷素數(shù)的

4、判斷素數(shù)的子程序子程序調(diào)用調(diào)用判斷素數(shù)的判斷素數(shù)的子程序子程序調(diào)用調(diào)用計算逆數(shù)的計算逆數(shù)的子程序子程序調(diào)用調(diào)用5.1 子程序設計子程序設計子程序很重要的特點:子程序很重要的特點:調(diào)用者只需要關心子調(diào)用者只需要關心子程序接口,不必了解程序接口,不必了解子程序內(nèi)部實現(xiàn)細節(jié)。子程序內(nèi)部實現(xiàn)細節(jié)。isPrimreverse可以設計子程序可以設計子程序isPrim,用于判斷一個整數(shù)是否是素,用于判斷一個整數(shù)是否是素數(shù);子程序數(shù);子程序reverse ,用于計算一個整數(shù)的逆數(shù);,用于計算一個整數(shù)的逆數(shù); 整理整理ppt75.1 子程序設計子程序設計二.子程序的控制和調(diào)用機制子程序的控制和調(diào)用機制u通過子程

5、序名進行調(diào)通過子程序名進行調(diào)用;用;u調(diào)用時需要傳遞一些調(diào)用時需要傳遞一些供子程序計算和處理供子程序計算和處理的數(shù)據(jù)(參數(shù));的數(shù)據(jù)(參數(shù));u子程序執(zhí)行完成后需子程序執(zhí)行完成后需要返回處理結(jié)果。要返回處理結(jié)果。 整理整理ppt8判斷素數(shù)的判斷素數(shù)的子程序子程序調(diào)用調(diào)用5.1 子程序設計子程序設計flag=isPrim(num)判斷素數(shù)的判斷素數(shù)的子程序子程序調(diào)用調(diào)用flag=isPrim(reverseNum)子程序名子程序名參數(shù)參數(shù)返回值返回值 整理整理ppt95.1 子程序設計子程序設計三三. 引入子程序的目的引入子程序的目的 1. 程序程序“復用復用”,避免在程序中使用重復代碼;,避免

6、在程序中使用重復代碼;2. 結(jié)構(gòu)化程序設計的需要:結(jié)構(gòu)化程序設計的需要: 自頂向下、逐步細化,將復雜問題分解為相對自頂向下、逐步細化,將復雜問題分解為相對簡單的子問題,這些子問題用子程序?qū)崿F(xiàn),從簡單的子問題,這些子問題用子程序?qū)崿F(xiàn),從而提高主程序結(jié)構(gòu)的清晰性和易讀性。而提高主程序結(jié)構(gòu)的清晰性和易讀性。3.使程序的調(diào)試和使程序的調(diào)試和 維護變得更加容易。維護變得更加容易。 整理整理ppt10四四. 子程序設計原則子程序設計原則 高內(nèi)聚高內(nèi)聚:功能相對獨立和完整;:功能相對獨立和完整; 低耦合低耦合:與外界的關系盡量松散,:與外界的關系盡量松散, 不要太緊密,使其能方便地被重用;不要太緊密,使其能

7、方便地被重用; 需要合理地設計子程序參數(shù)和子程序執(zhí)行的局需要合理地設計子程序參數(shù)和子程序執(zhí)行的局部環(huán)境部環(huán)境 來達到以上目標。來達到以上目標。5.1 子程序設計子程序設計五五. 子程序在子程序在C語言中的實現(xiàn)機制語言中的實現(xiàn)機制C語言中的語言中的函數(shù)函數(shù)機制機制 整理整理ppt115.1 子程序設計子程序設計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ù)應用舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量的存儲類

8、別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt12u C語言中用函數(shù)實現(xiàn)子程序設計思想。較大的語言中用函數(shù)實現(xiàn)子程序設計思想。較大的C語語言應用程序,往往是由多個函數(shù)組成的(用戶自定義言應用程序,往往是由多個函數(shù)組成的(用戶自定義函數(shù)或標準庫函數(shù)),每個函數(shù)完成明確的功能;函數(shù)或標準庫函數(shù)),每個函數(shù)完成明確的功能;u每一個函數(shù)應該只完成單一的預定好的任務,并且每一個函數(shù)應該只完成單一的預定好的任務,并且函數(shù)名能有效地反映函數(shù)完成的任務;如果不能選擇函數(shù)名能有效地反映函數(shù)完成的任務;如果不能選擇簡潔的函數(shù)名,那可能函數(shù)完成的功能太多,建議拆簡潔的函數(shù)名,那可能函數(shù)完成的

9、功能太多,建議拆分成幾個較小的函數(shù)。分成幾個較小的函數(shù)。uC標準庫提供了豐富的函數(shù)集,能夠完成常用的數(shù)標準庫提供了豐富的函數(shù)集,能夠完成常用的數(shù)學計算、字符串操作、輸入學計算、字符串操作、輸入/輸出等有用操作,程序員輸出等有用操作,程序員可以直接使用、從而減少工作量;可以直接使用、從而減少工作量;5.2.1 函數(shù)函數(shù) 整理整理ppt135.1 子程序設計子程序設計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ù)應用舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量

10、的存儲類別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt145.2.2 函數(shù)的定義函數(shù)的定義 函數(shù)設計的要求:函數(shù)設計的要求: 明確該函數(shù)的功能;明確該函數(shù)的功能; 定義該函數(shù)的接口(即函數(shù)頭,包括函數(shù)名、定義該函數(shù)的接口(即函數(shù)頭,包括函數(shù)名、參數(shù)和返回值)參數(shù)和返回值) 定義該函數(shù)的功能實現(xiàn)部分定義該函數(shù)的功能實現(xiàn)部分 整理整理ppt155.2.2 函數(shù)的定義函數(shù)的定義函數(shù)定義的格式:函數(shù)定義的格式: 返回值類型返回值類型 函數(shù)名函數(shù)名( 參數(shù)列表參數(shù)列表 ) /*接口定義部分接口定義部分*/ 聲明聲明 語句語句 /*功能實現(xiàn)部分功能實現(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ù)名簡潔、能反映出函數(shù)的功能。簡潔、能反映出函數(shù)的功能。如:如:square、printf等。等。3、返回值類型、返回值類型(1)指返回給函數(shù)調(diào)用者的結(jié)果的類)指返回給函數(shù)調(diào)用者的結(jié)果的類型;型;(2)如果不指明返回值類型,編譯器)如果不指明返回值類型,編譯器將假定返回值是將假定返回值是int型(最好明確指型(最好明確指定);定);(3)如果函數(shù)不返回任何值(即函數(shù)功)如果函數(shù)不返回任何值(即函數(shù)功能實現(xiàn)部分無

12、能實現(xiàn)部分無return語句),則返回值類語句),則返回值類型定義成型定義成void。若返回值類型不是。若返回值類型不是void,但又無但又無return語句,則函數(shù)將返回一個不語句,則函數(shù)將返回一個不確定的值;確定的值;4、返回值與、返回值與return語句語句(1)return語句的一般格式:語句的一般格式: return ( 返回值表達式返回值表達式 ); 或或 return 返回值表達式返回值表達式 ;(2)return語句的功能:返回調(diào)用函語句的功能:返回調(diào)用函數(shù),并將數(shù),并將“返回值表達式返回值表達式”的值帶給的值帶給調(diào)用函數(shù);調(diào)用函數(shù);(3) return語句中返回值表達式的類語

13、句中返回值表達式的類型要和返回值的類型說明一致。如果型要和返回值的類型說明一致。如果不一致,則以返回值類型為準不一致,則以返回值類型為準(進行類進行類型轉(zhuǎn)換型轉(zhuǎn)換)。2、參數(shù)列表、參數(shù)列表(1)參數(shù)列表聲明了在調(diào)用函數(shù)時函數(shù))參數(shù)列表聲明了在調(diào)用函數(shù)時函數(shù)所接收的參數(shù),形式為:所接收的參數(shù),形式為:數(shù)據(jù)類型數(shù)據(jù)類型 參數(shù)參數(shù)1,數(shù)據(jù)類型,數(shù)據(jù)類型 參數(shù)參數(shù)2 (2)如果函數(shù)不接收任何參數(shù),則參數(shù))如果函數(shù)不接收任何參數(shù),則參數(shù)列表定義為列表定義為void ;如;如 int print(void)(3)如果不列出參數(shù)的類型,編譯器就)如果不列出參數(shù)的類型,編譯器就假定其為假定其為int類型。但最

14、好明確指定參數(shù)類型。但最好明確指定參數(shù)的類型,即使是的類型,即使是int型,最好也明確定義。型,最好也明確定義。 整理整理ppt165.2.2 函數(shù)的定義函數(shù)的定義練習練習1:設計一個函數(shù):設計一個函數(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常見的程序設計錯誤:常見的程序設計錯誤:(1)把同一種類型的參數(shù)聲明為類似于形式)把同一種類型的參數(shù)聲明為類似于形式float x,y,而不是而不是float x,float y;(2)在函數(shù)內(nèi)部把函數(shù)參數(shù)再次定義成局部變

16、在函數(shù)內(nèi)部把函數(shù)參數(shù)再次定義成局部變量是一種語法錯誤;如:量是一種語法錯誤;如: int sum(int x, int y) int x, y;/錯誤!錯誤! return (x+y); 5.2.2 函數(shù)的定義函數(shù)的定義 整理整理ppt195.2.2 函數(shù)的定義函數(shù)的定義(3)不能在一個)不能在一個C函數(shù)的內(nèi)部定義另一個函數(shù);函數(shù)的內(nèi)部定義另一個函數(shù); main() int sum(int x,int y) return(x+y); 不允許!不允許! 整理整理ppt205.2.2 函數(shù)的定義函數(shù)的定義 練習練習2:定義以下問題的函數(shù)頭:定義以下問題的函數(shù)頭 設計一函數(shù),求一個正整數(shù)的長度;設計

17、一函數(shù),求一個正整數(shù)的長度; int length(int n) 設計一函數(shù),求三個整數(shù)中的最大值;設計一函數(shù),求三個整數(shù)中的最大值; int max(int n1, int n2, int n3) 整理整理ppt215.2.2 函數(shù)的定義函數(shù)的定義練習練習3 3:要求設計一個函數(shù):要求設計一個函數(shù):isPrim(x) 函數(shù)定義:函數(shù)定義:isPrim(x)=1 當當x 是素數(shù);是素數(shù); =0 當當x 不是素數(shù)不是素數(shù) ; 整理整理ppt225.2.2 函數(shù)的定義函數(shù)的定義要判斷的數(shù)通過參要判斷的數(shù)通過參數(shù)傳入數(shù)傳入判斷結(jié)果通過判斷結(jié)果通過return語句返語句返回回 整理整理ppt23/*

18、函數(shù)功能:判斷一個正整數(shù)是否為素數(shù)函數(shù)功能:判斷一個正整數(shù)是否為素數(shù).若是若是,則返回則返回1;否則返回否則返回0。 輸入?yún)?shù):輸入?yún)?shù):n:要判斷的整數(shù)。:要判斷的整數(shù)。 返回值:若返回值:若n是素數(shù),則返回值為是素數(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; /*初始設定初始設定n是素數(shù)

19、。在判斷中一旦發(fā)現(xiàn)不是素數(shù),則是素數(shù)。在判斷中一旦發(fā)現(xiàn)不是素數(shù),則isPrim被修改成被修改成0。*/while (i = sqrt(n) & isPrim = 1) if (n % i = 0) isPrim = 0; else i+; ; return isPrim; /*返回返回*/ 整理整理ppt245.1 子程序設計子程序設計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ù)應用舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量的存儲類別5.7 內(nèi)

20、部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt255.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 函數(shù)是一段封裝的代碼,能完成預定好的、獨函數(shù)是一段封裝的代碼,能完成預定好的、獨立的任務,能被其他函數(shù)所調(diào)用。那么,如何立的任務,能被其他函數(shù)所調(diào)用。那么,如何調(diào)用一個函數(shù)?調(diào)用一個函數(shù)? 函數(shù)的調(diào)用和執(zhí)行的實質(zhì)是控制轉(zhuǎn)移,調(diào)用函函數(shù)的調(diào)用和執(zhí)行的實質(zhì)是控制轉(zhuǎn)移,調(diào)用函數(shù)時,將控制轉(zhuǎn)到被調(diào)用的函數(shù),被調(diào)函數(shù)執(zhí)數(shù)時,將控制轉(zhuǎn)到被調(diào)用的函數(shù),被調(diào)函數(shù)執(zhí)行結(jié)束時,則將控制轉(zhuǎn)回主調(diào)函數(shù),繼續(xù)執(zhí)行行結(jié)束時,則將控制轉(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ù)調(diào)用過程:函數(shù)調(diào)用過程:給被調(diào)用函數(shù)分配存儲空間;給被調(diào)用函數(shù)分配存儲空間;計算實際參數(shù)表達式的值;計算實際參數(shù)表達式的值;把實際參數(shù)的值按賦值轉(zhuǎn)換規(guī)則把實際參數(shù)的值按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成形式參數(shù)的類型。轉(zhuǎn)換成形式參數(shù)的類型。把轉(zhuǎn)換后的實際參數(shù)(實參)的把轉(zhuǎn)換后的實際參數(shù)(實參)的值送入形

22、式參數(shù)(形參)中。值送入形式參數(shù)(形參)中。運行調(diào)用函數(shù)中的語句;運行調(diào)用函數(shù)中的語句;計算返回值表達式的值,并轉(zhuǎn)換計算返回值表達式的值,并轉(zhuǎn)換成函數(shù)的結(jié)果類型;成函數(shù)的結(jié)果類型;釋放被調(diào)用函數(shù)占用的存儲空間;釋放被調(diào)用函數(shù)占用的存儲空間;1.帶著轉(zhuǎn)換后的值返回調(diào)用函數(shù)。帶著轉(zhuǎn)換后的值返回調(diào)用函數(shù)。函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)原型的作用:是對被調(diào)函數(shù)原型的作用:是對被調(diào)用函數(shù)的用函數(shù)的接口聲明,接口聲明,它告它告訴編譯器函數(shù)返回的數(shù)據(jù)訴編譯器函數(shù)返回的數(shù)據(jù)類型、函數(shù)所要接收的參類型、函數(shù)所要接收的參數(shù)個數(shù)、參數(shù)類型和參數(shù)數(shù)個數(shù)、參數(shù)類型和參數(shù)順序,編譯器用函數(shù)原型順序,編譯器用函數(shù)原型校驗函數(shù)調(diào)用是否

23、正確。校驗函數(shù)調(diào)用是否正確。函數(shù)調(diào)用:函數(shù)調(diào)用: 函數(shù)名函數(shù)名(實參實參1,實參,實參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存儲空間存儲空間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ù)中的素數(shù)位正整數(shù)中的素數(shù)等價于:等價于:for(i = 1000;i = 9999;i+) if(isPrim(i) printf(%dt,i);此種寫法更接近于人慣用的此種寫法更接近于人慣用的表達方式表達方式 整理整理ppt29在語言中,可以用以下幾種方式調(diào)用函數(shù):在語言中,可以用以下幾種方式調(diào)用函數(shù):對于有返回值的函數(shù):對于有返回值的函數(shù):(1)函數(shù)表達式

25、函數(shù)表達式。函數(shù)作為表達式的一個操作數(shù),出現(xiàn)在。函數(shù)作為表達式的一個操作數(shù),出現(xiàn)在表達式中,函數(shù)返回值參與表達式的運算。表達式中,函數(shù)返回值參與表達式的運算。 如:如:i = 2*max(x, y); if (isPrim(n)(2)函數(shù)實參函數(shù)實參。函數(shù)作為另一個函數(shù)調(diào)用的實際參數(shù)。這。函數(shù)作為另一個函數(shù)調(diào)用的實際參數(shù)。這種情況是把該函數(shù)的返回值作為實參進行傳送。如:種情況是把該函數(shù)的返回值作為實參進行傳送。如: printf(”the large number is %d”, max(x, y);對于無返回值的函數(shù):對于無返回值的函數(shù):(3)函數(shù)語句函數(shù)語句。C語言中的函數(shù)可以只進行某些操

26、作而不語言中的函數(shù)可以只進行某些操作而不返回函數(shù)值,這時的函數(shù)調(diào)用可作為一條獨立的語句。返回函數(shù)值,這時的函數(shù)調(diào)用可作為一條獨立的語句。如:如:printf(”hellon”);5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 整理整理ppt305.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用切記切記:實參的個數(shù)、類型和順序,應該與形參:實參的個數(shù)、類型和順序,應該與形參個數(shù)、類型和順序一致,才能正確地進行數(shù)據(jù)個數(shù)、類型和順序一致,才能正確地進行數(shù)據(jù)傳遞。傳遞。 實參可以是常量、變量、表達式、函數(shù)等。無實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的量,在進行函數(shù)調(diào)用時,論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們

27、都必須具有確定的值,以便把這些值傳送它們都必須具有確定的值,以便把這些值傳送給形參。給形參。 形參變量只有在被調(diào)用時,才分配內(nèi)存單元;形參變量只有在被調(diào)用時,才分配內(nèi)存單元;調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元(有調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元(有例外,以后會講到)。例外,以后會講到)。 整理整理ppt315.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 實參和形參占用不同的內(nèi)存單元,即使同名也實參和形參占用不同的內(nèi)存單元,即使同名也互不影響?;ゲ挥绊?。 實參對形參的數(shù)據(jù)傳送是單向的,即只能把實實參對形參的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向傳參的值傳送給形參,而不能把形參

28、的值反向傳送給實參。送給實參。 不同函數(shù)中可以使用相同名稱和類型的變量,不同函數(shù)中可以使用相同名稱和類型的變量,它們占用不同的內(nèi)存單元,互不影響。它們占用不同的內(nèi)存單元,互不影響。 整理整理ppt325.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 如何確保能夠逐層返回到上一級調(diào)用?如何確保能夠逐層返回到上一級調(diào)用? 為何不同的函數(shù)可以使用同名的參數(shù)和變量?為何不同的函數(shù)可以使用同名的參數(shù)和變量? 進一步剖析函數(shù)的調(diào)用過程。進一步剖析函數(shù)的調(diào)用過程。 整理整理ppt33數(shù)據(jù)在內(nèi)存中的存儲數(shù)據(jù)在內(nèi)存中的存儲系統(tǒng)區(qū):用于存放系統(tǒng)軟件和運行系統(tǒng)區(qū):用于存放系統(tǒng)軟件和運行需要的數(shù)據(jù),如操作系統(tǒng)。只要需要的數(shù)據(jù),如操作

29、系統(tǒng)。只要機器一運行,這部分空間就必須機器一運行,這部分空間就必須保留給系統(tǒng)軟件使用。保留給系統(tǒng)軟件使用。用戶程序代碼區(qū):存放用戶程序的用戶程序代碼區(qū):存放用戶程序的代碼。代碼。靜態(tài)存儲區(qū):存放程序運行期間不靜態(tài)存儲區(qū):存放程序運行期間不釋放的數(shù)據(jù)(靜態(tài)局部變量,全釋放的數(shù)據(jù)(靜態(tài)局部變量,全局變量);局變量);棧區(qū):存放程序運行期間會被釋放棧區(qū):存放程序運行期間會被釋放的數(shù)據(jù)(非靜態(tài)局部變量)以及的數(shù)據(jù)(非靜態(tài)局部變量)以及活動的控制信息;活動的控制信息;堆區(qū):用戶可以在程序運行過程中堆區(qū):用戶可以在程序運行過程中根據(jù)需要動態(tài)地進行存儲空間的根據(jù)需要動態(tài)地進行存儲空間的分配,這樣的分配在堆區(qū)

30、進行;分配,這樣的分配在堆區(qū)進行;5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 用用戶戶數(shù)數(shù)據(jù)據(jù)區(qū)區(qū)int num; /全局變量全局變量void func(int n) static int m;/靜態(tài)局部變量靜態(tài)局部變量 整理整理ppt34 一個類比:裝東西的籮筐一個類比:裝東西的籮筐籮筐:一個存放東西的容器,框底封了口?;j筐:一個存放東西的容器,框底封了口。 裝東西:東西從籮筐口入;裝東西:東西從籮筐口入; 取東西:東西從籮筐口出,框頂?shù)臇|西先被取取東西:東西從籮筐口出,框頂?shù)臇|西先被取出。即最先放入的東西最后才能取出;最后放出。即最先放入的東西最后才能取出;最后放入的東西最先取出(先進后出)。入的東

31、西最先取出(先進后出)。5.2.3 函數(shù)的調(diào)用棧區(qū)簡介函數(shù)的調(diào)用棧區(qū)簡介重點介紹和函數(shù)調(diào)用相關的棧區(qū):重點介紹和函數(shù)調(diào)用相關的棧區(qū): 整理整理ppt35 棧區(qū)棧區(qū) 一片存放用戶數(shù)據(jù)的內(nèi)存空間;一端一片存放用戶數(shù)據(jù)的內(nèi)存空間;一端“封封”了口(棧底),一端了口(棧底),一端“開開”著口著口(棧頂棧頂); 保存數(shù)據(jù)保存數(shù)據(jù):數(shù)據(jù)只能從頂部(:數(shù)據(jù)只能從頂部(棧頂棧頂)進入;)進入; 取數(shù)據(jù)取數(shù)據(jù):棧頂?shù)臄?shù)據(jù)先被取出,:棧頂?shù)臄?shù)據(jù)先被取出,棧底棧底的數(shù)據(jù)的數(shù)據(jù)最后被取出。即數(shù)據(jù)是最后被取出。即數(shù)據(jù)是“先進后出先進后出”。數(shù)據(jù)。數(shù)據(jù)的進入和退出均在棧頂進行。的進入和退出均在棧頂進行。 讀數(shù)據(jù)讀數(shù)據(jù):只

32、能讀?。褐荒茏x取 棧頂?shù)臄?shù)據(jù)棧頂?shù)臄?shù)據(jù)5.2.3 函數(shù)的調(diào)用棧區(qū)簡介函數(shù)的調(diào)用棧區(qū)簡介棧底棧底棧頂棧頂 整理整理ppt365.2.3 函數(shù)的調(diào)用棧區(qū)簡介函數(shù)的調(diào)用棧區(qū)簡介設計了一個位置指示設計了一個位置指示top,用來指示當前的棧頂位置。,用來指示當前的棧頂位置。通過通過top可以訪問當前棧頂數(shù)據(jù)。數(shù)據(jù)的進入和退可以訪問當前棧頂數(shù)據(jù)。數(shù)據(jù)的進入和退出通過修改出通過修改top的值來實現(xiàn)。的值來實現(xiàn)。數(shù)據(jù)退出數(shù)據(jù)退出數(shù)據(jù)進入數(shù)據(jù)進入 整理整理ppt37函數(shù)調(diào)用過程函數(shù)調(diào)用過程-開辟新的運行環(huá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);運行環(huán)境即指函數(shù)執(zhí)行時需要的數(shù)運行環(huán)境即指函數(shù)執(zhí)行時需要的數(shù)據(jù)空間。需要哪些數(shù)據(jù)空間?據(jù)空間。需要哪些數(shù)據(jù)空間?函數(shù)執(zhí)行時需要的數(shù)據(jù)空間函數(shù)執(zhí)行時需要的數(shù)據(jù)空間 1. 生存期在本次函數(shù)執(zhí)行過程中生存期在本次函數(shù)執(zhí)行過程中的的數(shù)據(jù)對象數(shù)據(jù)對象,如,如形參、局部變量形參、局部變量等;等; 2.用以用以管理函數(shù)調(diào)用過程管理函數(shù)調(diào)用過程的信息。的信息。當函數(shù)當函數(shù)A調(diào)用函數(shù)函數(shù)調(diào)用函數(shù)函數(shù)B時,函數(shù)時,函數(shù)A的運行被中斷,的運行被中斷

34、,當前機器的狀態(tài)當前機器的狀態(tài)信息信息,如,如程序計數(shù)器程序計數(shù)器(返回地(返回地址)、址)、寄存器寄存器的值等都必須保存,的值等都必須保存,以便調(diào)用結(jié)束后,能準確返回到以便調(diào)用結(jié)束后,能準確返回到函數(shù)函數(shù)A并繼續(xù)正確執(zhí)行。并繼續(xù)正確執(zhí)行。 整理整理ppt385.2.3 函數(shù)調(diào)用過程函數(shù)調(diào)用過程-開辟新的運行環(huán)境開辟新的運行環(huán)境 為方便,引入一個術(shù)語:為方便,引入一個術(shù)語:“函數(shù)的活動記錄函數(shù)的活動記錄”。函數(shù)的活。函數(shù)的活動記錄是一段在動記錄是一段在棧區(qū)棧區(qū)分配的連續(xù)的內(nèi)存存儲區(qū),用以存放分配的連續(xù)的內(nèi)存存儲區(qū),用以存放函數(shù)一次執(zhí)行所需的數(shù)據(jù)。函數(shù)一次執(zhí)行所需的數(shù)據(jù)。 開辟新的運行環(huán)境即指在

35、開辟新的運行環(huán)境即指在棧區(qū)的棧頂棧區(qū)的棧頂創(chuàng)建一個函數(shù)活動記創(chuàng)建一個函數(shù)活動記錄。釋放本函數(shù)的運行環(huán)境即指從棧頂將活動記錄釋放。錄。釋放本函數(shù)的運行環(huán)境即指從棧頂將活動記錄釋放。 被調(diào)用函數(shù)中被調(diào)用函數(shù)中的數(shù)據(jù)的數(shù)據(jù) 現(xiàn)場信息,用現(xiàn)場信息,用于調(diào)用結(jié)束能于調(diào)用結(jié)束能正確返回正確返回 整理整理ppt395.2.3 函數(shù)調(diào)用過程函數(shù)調(diào)用過程-開辟新的運行環(huá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); 為簡化起見,假設為簡化起見,假設square函數(shù)的活動函數(shù)的活動記錄只包含分配給記錄只包含分配給形參形參y和返回地址的和返回地址的存儲空間存儲空間 整理整理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ù)活動記錄使用示例函數(shù)活動記錄使用示例main() A(); B(); void A() C(); 整理整理ppt42函數(shù)調(diào)用過程函數(shù)調(diào)用過程

37、總結(jié)總結(jié) 如何確保能夠逐層返回到上一級調(diào)用?如何確保能夠逐層返回到上一級調(diào)用?函數(shù)函數(shù)A調(diào)用函數(shù)調(diào)用函數(shù)B,則在函數(shù),則在函數(shù)B的活動記錄中記的活動記錄中記錄了錄了A的返回地址。返回前取出該地址,即能的返回地址。返回前取出該地址,即能正確返回。正確返回。 為何不同的函數(shù)可以使用同名的參數(shù)和變量?為何不同的函數(shù)可以使用同名的參數(shù)和變量? 因為不同函數(shù)的活動記錄占用不同的內(nèi)存單元,因為不同函數(shù)的活動記錄占用不同的內(nèi)存單元,程序運行時始終是從位于棧頂?shù)幕顒佑涗浿腥〕绦蜻\行時始終是從位于棧頂?shù)幕顒佑涗浿腥⌒螀⒑妥兞康闹?。形參和變量的值?整理整理ppt43子程序參數(shù)傳遞兩種方式:子程序參數(shù)傳遞兩種方式

38、:按值傳遞按值傳遞和和按引用傳遞按引用傳遞。按值傳遞按值傳遞:實參的值被復制并置入被調(diào)用子程序的形實參的值被復制并置入被調(diào)用子程序的形參中。此方式下不管在被調(diào)用子程序中怎樣操作并參中。此方式下不管在被調(diào)用子程序中怎樣操作并改變形參的值,在主調(diào)程序中的實參的值都是安全改變形參的值,在主調(diào)程序中的實參的值都是安全的未發(fā)生變化的。的未發(fā)生變化的。5.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用按值傳遞按值傳遞按值傳遞(將實參的按值傳遞(將實參的值傳遞給形參)值傳遞給形參)實參實參實參實參形參形參形參形參 整理整理ppt445.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用按引用傳遞(函按引用傳遞(函數(shù)調(diào)用時實參數(shù)調(diào)用時實參雖然寫的是

39、變雖然寫的是變量量max,但實,但實際傳遞的不是際傳遞的不是max的值,而的值,而是是max的地址)的地址)主調(diào)程序主調(diào)程序(實參)(實參)子程序子程序 (形參形參)如何解決函數(shù)的多返回值問題?如何解決函數(shù)的多返回值問題?按引用傳遞按引用傳遞:此時實參必須是變量,子程序調(diào):此時實參必須是變量,子程序調(diào)用時將用時將實參的實參的地址地址而不是實參的值置入被調(diào)子而不是實參的值置入被調(diào)子程序的形參中。被調(diào)子程序?qū)π螀⒌牟僮鲗嶋H程序的形參中。被調(diào)子程序?qū)π螀⒌牟僮鲗嶋H上是對主調(diào)程序中實參的操作,從而向主調(diào)程上是對主調(diào)程序中實參的操作,從而向主調(diào)程序傳回函數(shù)處理結(jié)果。序傳回函數(shù)處理結(jié)果。 整理整理ppt4

40、55.2.3 函數(shù)的調(diào)用函數(shù)的調(diào)用注意:注意:C C語言中所有的調(diào)用都是語言中所有的調(diào)用都是傳值調(diào)用傳值調(diào)用,但但是可以通過其他方式來實現(xiàn)函數(shù)的多返回值是可以通過其他方式來實現(xiàn)函數(shù)的多返回值( (即實參本身存放的就是某個變量的內(nèi)存地址即實參本身存放的就是某個變量的內(nèi)存地址,將該地址傳遞給被調(diào)用函數(shù)后,被調(diào)用函,將該地址傳遞給被調(diào)用函數(shù)后,被調(diào)用函數(shù)通過該地址來訪問變量,將函數(shù)處理結(jié)果數(shù)通過該地址來訪問變量,將函數(shù)處理結(jié)果寫入變量寫入變量) )。具體以后學習指針時講解具體以后學習指針時講解 整理整理ppt465.1 子程序設計子程序設計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ù)應用舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量的存儲類別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt47#includefloat square(float);/形參名可寫可不寫形參名可寫可不寫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ù)的原型編譯到藍色行時

42、報錯:編譯到藍色行時報錯:conflicting types for square。錯誤原因:當自上而下對錯誤原因:當自上而下對源程序編譯時,編譯到源程序編譯時,編譯到紅色字體那一行,編譯紅色字體那一行,編譯器會默認器會默認square(x)函數(shù)函數(shù)返回值類型是返回值類型是int型,從型,從而和后面的而和后面的float沖突。沖突。解決方法:在函數(shù)調(diào)用前解決方法:在函數(shù)調(diào)用前使用函數(shù)原型對函數(shù)進使用函數(shù)原型對函數(shù)進行聲明。行聲明。在文件在文件stdio.h中已經(jīng)給出了函數(shù)原型中已經(jīng)給出了函數(shù)原型思考:編譯器為何不會提示思考:編譯器為何不會提示printf未定義呢?未定義呢? 整理整理ppt48

43、(1) C語言的原則(先聲明、后使用);語言的原則(先聲明、后使用);(2)函數(shù)原型的作用:函數(shù)原型是對被調(diào)用函數(shù))函數(shù)原型的作用:函數(shù)原型是對被調(diào)用函數(shù)的的接口聲明,接口聲明,它告訴編譯器函數(shù)返回的數(shù)據(jù)類型、它告訴編譯器函數(shù)返回的數(shù)據(jù)類型、函數(shù)所要接收的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序,函數(shù)所要接收的參數(shù)個數(shù)、參數(shù)類型和參數(shù)順序,編譯器用函數(shù)原型校驗函數(shù)調(diào)用是否正確。編譯器用函數(shù)原型校驗函數(shù)調(diào)用是否正確。(3)函數(shù)原型一般格式:)函數(shù)原型一般格式: 返回值類型返回值類型 函數(shù)名函數(shù)名(數(shù)據(jù)類型數(shù)據(jù)類型 參數(shù)名參數(shù)名1, 數(shù)據(jù)數(shù)據(jù)類型類型 參數(shù)名參數(shù)名2);注意注意:參數(shù)名可寫可不寫。:參數(shù)名可寫

44、可不寫。 5.2.4 函數(shù)的原型函數(shù)的原型float square(float ); /*函數(shù)原型函數(shù)原型*/ 整理整理ppt49(4)函數(shù)原型可以放置在任何函數(shù)之外,出現(xiàn)在該函數(shù)原型可以放置在任何函數(shù)之外,出現(xiàn)在該函數(shù)原型之后的所有函數(shù)都可以調(diào)用對應的函數(shù);函數(shù)原型之后的所有函數(shù)都可以調(diào)用對應的函數(shù);也可以放在某個函數(shù)中,此時只有該函數(shù)能夠調(diào)也可以放在某個函數(shù)中,此時只有該函數(shù)能夠調(diào)用它。從程序設計風格考慮,最好是將函數(shù)原型用它。從程序設計風格考慮,最好是將函數(shù)原型集中在一起,放在主函數(shù)之前。集中在一起,放在主函數(shù)之前。(5)當被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在該函數(shù)調(diào)用之)當被調(diào)用函數(shù)的函數(shù)定義出

45、現(xiàn)在該函數(shù)調(diào)用之前時,可以省略函數(shù)原型。因為在調(diào)用之前,編前時,可以省略函數(shù)原型。因為在調(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類型、參數(shù)譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類型、參數(shù)個數(shù)、類型和順序。個數(shù)、類型和順序。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)用會導致語法錯誤;函和函數(shù)原型不匹配的函數(shù)調(diào)用會導致語法錯誤;函數(shù)原型和函數(shù)定義不一致,也會產(chǎn)生錯誤。數(shù)原型和函數(shù)定義不一致,也會產(chǎn)生錯誤。(7)如果程序中沒有包含函數(shù)原型,則編譯器就會)如果程序中沒有包含函數(shù)原型,則編譯器就會用第一次出現(xiàn)的該函數(shù)(函數(shù)定義或函數(shù)調(diào)用)來用第一次出現(xiàn)的

47、該函數(shù)(函數(shù)定義或函數(shù)調(diào)用)來構(gòu)造函數(shù)原型。默認情況下,編譯器假定函數(shù)的返構(gòu)造函數(shù)原型。默認情況下,編譯器假定函數(shù)的返回類型為回類型為int類型,而對參數(shù)不作任何假定。類型,而對參數(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ù)原型可以用來強制轉(zhuǎn)換參數(shù)類型。)

48、函數(shù)原型可以用來強制轉(zhuǎn)換參數(shù)類型。在函數(shù)調(diào)用之前,和函數(shù)原型中的參數(shù)類型不完全一致在函數(shù)調(diào)用之前,和函數(shù)原型中的參數(shù)類型不完全一致的實參值會被轉(zhuǎn)換為合適的類型。的實參值會被轉(zhuǎn)換為合適的類型。如:如: sqrt 的參數(shù)類型是的參數(shù)類型是double,進行如下調(diào)用進行如下調(diào)用printf(“%.3fn”,sqrt(4)時,在將時,在將4傳遞給傳遞給sqrt之前先轉(zhuǎn)換之前先轉(zhuǎn)換為為double類型的值類型的值4.0;參數(shù)類型的轉(zhuǎn)換有可能是低類型向高類型轉(zhuǎn)換,也可能參數(shù)類型的轉(zhuǎn)換有可能是低類型向高類型轉(zhuǎn)換,也可能是高類型向低類型轉(zhuǎn)換。高類型向低類型轉(zhuǎn)換可能會導是高類型向低類型轉(zhuǎn)換。高類型向低類型轉(zhuǎn)換可

49、能會導致不正確的結(jié)果(如致不正確的結(jié)果(如long類型向類型向short類型的轉(zhuǎn)換)。類型的轉(zhuǎn)換)。5.2.4 函數(shù)的原型函數(shù)的原型 整理整理ppt525.1 子程序設計子程序設計5.2 函數(shù)函數(shù)5.3 頭文件頭文件5.4 函數(shù)應用舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量的存儲類別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt535.3 頭文件頭文件 對于一些通用的函數(shù)(如輸入輸出函數(shù)、數(shù)學對于一些通用的函數(shù)(如輸入輸出函數(shù)、數(shù)學函數(shù)等),可能在不同的程序中都會用到。函數(shù)等),可能在不同的程序中都會用到。 為了使用這些函數(shù),需要在程序中說明其

50、函數(shù)為了使用這些函數(shù),需要在程序中說明其函數(shù)原型。原型。n一種方式是在程序中逐個寫出函數(shù)原型;一種方式是在程序中逐個寫出函數(shù)原型;double sqrt(double x) ;double fabs(double x) ;n另一種方式是將這些函數(shù)原型集中在一起,另一種方式是將這些函數(shù)原型集中在一起,形成形成.h頭文件頭文件,然后在程序中直接包含這些然后在程序中直接包含這些頭文件。頭文件。#include 整理整理ppt54每一個標準庫都有一個相應的頭文件每一個標準庫都有一個相應的頭文件,文件擴展名為文件擴展名為.h(如如stdio.h,示例示例)。該頭文件包含了該庫中所有函數(shù)該頭文件包含了該庫

51、中所有函數(shù)的原型以及這些函數(shù)所需的所有常量和數(shù)據(jù)類型的定的原型以及這些函數(shù)所需的所有常量和數(shù)據(jù)類型的定義。義。程序員可以根據(jù)需要自己建立頭文件,使用程序員可以根據(jù)需要自己建立頭文件,使用include命命令可以把程序員定義的頭文件包含到程序中,如:令可以把程序員定義的頭文件包含到程序中,如:#include “square.h”注意注意:#include包含標準庫的頭文件包含標準庫的頭文件#include “square.h” 包含程序員自定義的頭文件包含程序員自定義的頭文件5.3 頭文件頭文件 整理整理ppt555.1 子程序設計子程序設計5.2 函數(shù)函數(shù)5.3 頭文件頭文件5.4 函數(shù)應用

52、舉例函數(shù)應用舉例5.5 變量作用域變量作用域5.6 變量的存儲類別變量的存儲類別5.7 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)提綱提綱 整理整理ppt56例例1 1、驗證歌德巴赫猜想、驗證歌德巴赫猜想 任一充分大的偶數(shù),可以用兩個素數(shù)之和表示,任一充分大的偶數(shù),可以用兩個素數(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輸入一個偶數(shù),將其表示為兩素數(shù)之和,并輸出輸入一個偶數(shù),將其表示為兩素數(shù)之和,并輸出5

53、.4 函數(shù)應用舉例函數(shù)應用舉例 整理整理ppt57例例1 1、驗證歌德巴赫猜想、驗證歌德巴赫猜想 思路:偶數(shù)思路:偶數(shù)num是要分解的數(shù),則是要分解的數(shù),則 num = i + (num - i) 其中其中i和和(num - i)都得是素數(shù)都得是素數(shù) 因此可以對因此可以對i可能的取值進行窮舉。可能的取值進行窮舉。 整理整理ppt58例例1 1、驗證歌德巴赫猜想、驗證歌德巴赫猜想main()int num;/*num:要判斷的一個偶數(shù)要判斷的一個偶數(shù)*/ int num1; /*num表示為兩個素數(shù)表示為兩個素數(shù)num1和和num-num1之和之和*/ int count;/*計數(shù)輸出個數(shù),用于

54、換行。計數(shù)輸出個數(shù),用于換行。*/ printf(輸入要驗證的偶數(shù):輸入要驗證的偶數(shù):); scanf(%d,&num);if (num%2!=0) printf(輸入的數(shù)不是偶數(shù),程序終止輸入的數(shù)不是偶數(shù),程序終止n); 整理整理ppt59例例1 1、驗證歌德巴赫猜想、驗證歌德巴赫猜想 else/采用窮舉法,將采用窮舉法,將num分解為兩個素數(shù)之和分解為兩個素數(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個數(shù)換一行個數(shù)換一行 /end of if /end of for /end of else system(pause); return 0; 整理整理ppt605.4 函數(shù)應用舉例函數(shù)應用舉例 例例2:設計一個函數(shù),將十進制數(shù)轉(zhuǎn)換成二進:設計一個函數(shù),將十進制數(shù)轉(zhuǎn)換成二進制、八進制和十六進制。然后在主函數(shù)中讀入制、八進制和十六進制。然后在主函數(shù)中讀入一個整數(shù),調(diào)用函數(shù),輸出轉(zhuǎn)換結(jié)果。一個整數(shù),調(diào)用函數(shù),輸出轉(zhuǎn)換結(jié)果。 算法思路:見算法思路:見C程序設計教程程序設計教程489490頁頁 整理整理p

56、pt61例例2.進制轉(zhuǎn)換進制轉(zhuǎn)換 假設將十進制數(shù)假設將十進制數(shù)57轉(zhuǎn)換為二進制轉(zhuǎn)換為二進制 從右到左寫出每列的位值,直到發(fā)現(xiàn)位值大于該從右到左寫出每列的位值,直到發(fā)現(xiàn)位值大于該十進制數(shù)的列。這樣就先得到十進制數(shù)的列。這樣就先得到 位值:位值:64 32 16 8 4 2 1 然后去掉位值為然后去掉位值為64的列,得到:的列,得到: 位值:位值:32 16 8 4 2 1 然后,從左至右進行。然后,從左至右進行。57除以除以32得商為得商為1,余數(shù),余數(shù)為為25,所以在,所以在32這列寫下這列寫下1,然后,然后25除以除以16商為商為1,余數(shù)為余數(shù)為9,所以在,所以在16這列寫下這列寫下1, 位

57、值:位值: 32 16 8 4 2 1 符號值:符號值: 1 1 1 0 0 1 所以所以(57)10=(111001)2 整理整理ppt62例例2.進制轉(zhuǎn)換進制轉(zhuǎn)換 假設將十進制數(shù)假設將十進制數(shù)57轉(zhuǎn)換為八進制轉(zhuǎn)換為八進制 從右到左寫出每列的位值,直到發(fā)現(xiàn)位值大于該十進從右到左寫出每列的位值,直到發(fā)現(xiàn)位值大于該十進制數(shù)的列。這樣就先得到制數(shù)的列。這樣就先得到 位值:位值:64 8 1 然后去掉位值為然后去掉位值為64的列,得到:的列,得到: 位值:位值:8 1 然后,從左至右進行。然后,從左至右進行。57除以除以8得商為得商為7,余數(shù)為,余數(shù)為1,所,所以在以在8這列寫下這列寫下1,然后,然

58、后1除以除以1商為商為1,余數(shù)為,余數(shù)為0,所以,所以在在1這列寫下這列寫下1. 位值:位值: 8 1 符號值:符號值: 7 1 所以所以(57)10=(71)8 整理整理ppt63例例2.進制轉(zhuǎn)換進制轉(zhuǎn)換/*將將num轉(zhuǎn)換為轉(zhuǎn)換為base進制并輸出進制并輸出*/ 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進制數(shù)的各位進制數(shù)的各位*/ while( p != 0) k

59、 = num /p; /*計算當前要輸出的那個十進制數(shù)計算當前要輸出的那個十進制數(shù)*/ if (k = 9) printf(%d,k); else printf(%c,k 10 + A); num = num % p; p = p / base; 整理整理ppt64例例3:擲骰子游戲:擲骰子游戲(見見C程序設計教程程序設計教程119頁頁)1、rand()函數(shù):函數(shù):產(chǎn)生一個產(chǎn)生一個0到到RAND_MAX之間的整數(shù),使用時之間的整數(shù),使用時需要包含頭文件需要包含頭文件 。 RAND_MAX 是在頭文件是在頭文件中定義的符中定義的符號常量,號常量,ANSI規(guī)定其不得小于規(guī)定其不得小于32767。

60、用于產(chǎn)生用于產(chǎn)生16之間的隨機數(shù):之間的隨機數(shù): 1+rand()%65.4 函數(shù)應用舉例函數(shù)應用舉例 整理整理ppt65每一次調(diào)用函數(shù)每一次調(diào)用函數(shù)rand()時,時,0到到RAND_MAX之之間的每一個數(shù)字被選中的機會幾乎均等(見書間的每一個數(shù)字被選中的機會幾乎均等(見書上上120頁圖頁圖5-5)rand()所產(chǎn)生的隨機數(shù)是偽隨機數(shù),反復調(diào)用所產(chǎn)生的隨機數(shù)是偽隨機數(shù),反復調(diào)用rand()產(chǎn)生的一系列數(shù)似乎是隨機的,但是每產(chǎn)生的一系列數(shù)似乎是隨機的,但是每次執(zhí)行程序所產(chǎn)生的序列則是重復的次執(zhí)行程序所產(chǎn)生的序列則是重復的(重復運行重復運行120頁圖頁圖5-4的程序得到的結(jié)果是一樣的的程序得到的結(jié)果是一樣的)。5.4 函數(shù)應

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論