版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/141 C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/142C語言中,函數(shù)可分為兩類語言中,函數(shù)可分為兩類 :一類是由系統(tǒng)定義的標(biāo)準(zhǔn)函數(shù),又稱為庫函數(shù),其函數(shù)聲明一般是放在系統(tǒng)的一類是由系統(tǒng)定義的標(biāo)準(zhǔn)函數(shù),又稱為庫函數(shù),其函數(shù)聲明一般是放在系統(tǒng)的include目錄下以目錄下以.h為后綴的頭文件中,如在程序中要用到某個(gè)庫函數(shù),必須在調(diào)用為后綴的頭文件中,如在程序中要用到某個(gè)庫函數(shù),必須在調(diào)用該函數(shù)之前用該函數(shù)之前用#include命令將庫函數(shù)信息包含到本程序中。命
2、令將庫函數(shù)信息包含到本程序中。另一類函數(shù)是自定義函數(shù)另一類函數(shù)是自定義函數(shù)C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/143 1.1.1 函數(shù)定義函數(shù)定義 存儲(chǔ)類型符存儲(chǔ)類型符 返回值類型符返回值類型符 函數(shù)名函數(shù)名(形參說明表形參說明表) 函數(shù)語句體函數(shù)語句體 C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/144說明:說明: 1存儲(chǔ)類型符存儲(chǔ)類型符指的是函數(shù)的作用范圍,它只有兩種形式:指的是函數(shù)的作用范圍,它只有兩種形式:static和和extern。 static說明函數(shù)只能作用于其所在的源文件,用說
3、明函數(shù)只能作用于其所在的源文件,用static說明的函數(shù)又稱為內(nèi)部函數(shù)。說明的函數(shù)又稱為內(nèi)部函數(shù)。extern說明函數(shù)可被其它源文件中的函數(shù)調(diào)用,用說明函數(shù)可被其它源文件中的函數(shù)調(diào)用,用extern說明的函數(shù),又稱為外部說明的函數(shù),又稱為外部函數(shù)。函數(shù)。缺省情況為缺省情況為extern。 2返回值類型符返回值類型符指的是函數(shù)體語句執(zhí)行完成后,函數(shù)返回的值的類型,如指的是函數(shù)體語句執(zhí)行完成后,函數(shù)返回的值的類型,如int, float, char等等,若函數(shù)無返回值,則用空類型等等,若函數(shù)無返回值,則用空類型void來定義函數(shù)的返回值。來定義函數(shù)的返回值。缺省情況為缺省情況為int型。型。C C
4、 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1453函數(shù)名由任何合法的標(biāo)識(shí)符構(gòu)成。建議將函數(shù)名的命名與函數(shù)內(nèi)容有一定關(guān)函數(shù)名由任何合法的標(biāo)識(shí)符構(gòu)成。建議將函數(shù)名的命名與函數(shù)內(nèi)容有一定關(guān)系。系。4 形參說明表形參說明表是一系列用逗號(hào)分開的每個(gè)形參變量說明。是一系列用逗號(hào)分開的每個(gè)形參變量說明。如:如:int x, int y, int z這表示形參變量有三個(gè):這表示形參變量有三個(gè):x, y, z。它們的類型都是。它們的類型都是int型。型。 5函數(shù)語句體是放在一對花括號(hào)函數(shù)語句體是放在一對花括號(hào) 中,由局部數(shù)據(jù)類型描述和功能實(shí)現(xiàn)兩部分中,由局部數(shù)據(jù)類型描述
5、和功能實(shí)現(xiàn)兩部分組成。組成。 C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1466函數(shù)返回語句的形式有以下兩種:函數(shù)返回語句的形式有以下兩種:函數(shù)無返回值的情況:函數(shù)無返回值的情況:return;或者什么也不寫;或者什么也不寫函數(shù)有返回值的情況:函數(shù)有返回值的情況:return(表達(dá)式的值表達(dá)式的值);在第種情況下要注意在第種情況下要注意“表達(dá)式的值表達(dá)式的值”的類型必須與函數(shù)返回值的類型相一致。的類型必須與函數(shù)返回值的類型相一致。例如:求兩個(gè)任意整數(shù)的絕對值的和,用函數(shù)例如:求兩個(gè)任意整數(shù)的絕對值的和,用函數(shù)abs_sum()實(shí)現(xiàn)。實(shí)現(xiàn)。/*直接
6、調(diào)用庫函數(shù)來計(jì)算直接調(diào)用庫函數(shù)來計(jì)算m和和n的絕對值的絕對值 */int abs_sum(int m, int n) return (abs(m)+abs(n); /*函數(shù)函數(shù)abs()是在頭文件是在頭文件math.h中聲明的中聲明的*/ C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/147函數(shù)定義如下:函數(shù)定義如下:int abs_sum(int m, int n) if (m0) m=-m; if(n0) n=-n; return(m+n);1.1.2 函數(shù)聲明和調(diào)用函數(shù)聲明和調(diào)用 1函數(shù)的聲明函數(shù)的聲明函數(shù)聲明的一般形式:函數(shù)聲明的一般形式:存
7、儲(chǔ)類型符存儲(chǔ)類型符 返回值類型符返回值類型符 函數(shù)名函數(shù)名(形參說明表形參說明表);如:如:int abs_sun(int m, int n);C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1482函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)調(diào)用是通過函數(shù)調(diào)用語句來實(shí)現(xiàn)的,分兩種形式:函數(shù)調(diào)用是通過函數(shù)調(diào)用語句來實(shí)現(xiàn)的,分兩種形式:無返回值的情況:無返回值的情況: 函數(shù)名函數(shù)名(實(shí)參表實(shí)參表);有返回值的情況:有返回值的情況: 變量名函數(shù)名變量名函數(shù)名(實(shí)參表實(shí)參表);該變量名的類型必須與函數(shù)的返回值類型相同。該變量名的類型必須與函數(shù)的返回值類型相同。函數(shù)調(diào)用時(shí)都會(huì)去執(zhí)行函
8、數(shù)語句中的內(nèi)容,函數(shù)執(zhí)行完畢后,回到函數(shù)的調(diào)用處,函數(shù)調(diào)用時(shí)都會(huì)去執(zhí)行函數(shù)語句中的內(nèi)容,函數(shù)執(zhí)行完畢后,回到函數(shù)的調(diào)用處,繼續(xù)執(zhí)行下面的語句。繼續(xù)執(zhí)行下面的語句。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1491.1.3 函數(shù)的傳值方式函數(shù)的傳值方式 函數(shù)的傳值方式:函數(shù)的傳值方式: 采用實(shí)參表將每一個(gè)實(shí)參的值相應(yīng)地傳遞給每一個(gè)形參變量,形參變量在接收到實(shí)采用實(shí)參表將每一個(gè)實(shí)參的值相應(yīng)地傳遞給每一個(gè)形參變量,形參變量在接收到實(shí)參表傳過來的值時(shí),會(huì)在內(nèi)存參表傳過來的值時(shí),會(huì)在內(nèi)存臨時(shí)開辟新的空間臨時(shí)開辟新的空間,以保留形參變量的值,當(dāng)函數(shù)執(zhí)行完,以
9、保留形參變量的值,當(dāng)函數(shù)執(zhí)行完畢時(shí),這些畢時(shí),這些臨時(shí)開辟的內(nèi)存空間會(huì)被釋放臨時(shí)開辟的內(nèi)存空間會(huì)被釋放,并且形參的值在函數(shù)中不論是否發(fā)生變化,并且形參的值在函數(shù)中不論是否發(fā)生變化,都不會(huì)影響到實(shí)參變量的值的變化都不會(huì)影響到實(shí)參變量的值的變化,這就是函數(shù)的傳值方式。,這就是函數(shù)的傳值方式。自定義函數(shù)在程序中的使用順序有兩種形式:自定義函數(shù)在程序中的使用順序有兩種形式: 先進(jìn)行函數(shù)聲明,再進(jìn)行函數(shù)調(diào)用,先進(jìn)行函數(shù)聲明,再進(jìn)行函數(shù)調(diào)用,函數(shù)定義放在函數(shù)調(diào)用之后。函數(shù)定義放在函數(shù)調(diào)用之后。函數(shù)聲明在函數(shù)聲明在函數(shù)調(diào)用之前。函數(shù)調(diào)用之前。 函數(shù)定義放在函數(shù)調(diào)用之前。函數(shù)定義放在函數(shù)調(diào)用之前。C C 程序
10、設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1410【例例1-1】 編程序,通過調(diào)用函數(shù)編程序,通過調(diào)用函數(shù)abs_sum(),求任意兩個(gè)整數(shù)的絕對值的和。,求任意兩個(gè)整數(shù)的絕對值的和。/*exam1_1.c 調(diào)用函數(shù)求兩整數(shù)絕對值的和調(diào)用函數(shù)求兩整數(shù)絕對值的和*/#include int abs_sum(int m,int n);main()int x,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);printf(sum is %d,z);int abs_sum(int m,int n)if(m0)m=-m;if(n
11、0)n=-n;return m+n;C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1411用傳值方式調(diào)用函數(shù)時(shí),實(shí)參也可以是函數(shù)調(diào)用語句用傳值方式調(diào)用函數(shù)時(shí),實(shí)參也可以是函數(shù)調(diào)用語句 【例例1-2】求任意三個(gè)數(shù)的絕對值的和。求任意三個(gè)數(shù)的絕對值的和。/*exam1_2.c 調(diào)用函數(shù)求三個(gè)整數(shù)絕對值的和調(diào)用函數(shù)求三個(gè)整數(shù)絕對值的和*/#include int abs_sum(int m,int n);main()int x,y,z,sum;scanf(%d%d%d,&x,&y,&z);sum=abs_sum(abs_sum(x,
12、y),z);printf(sum is %d,sum);int abs_sum(int m,int n)if(m0)m=-m;if(n0)n=-n;return m+n;程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果:7 12 5 sum is 24C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1412注意:注意: 對于有返回值的函數(shù),調(diào)用時(shí)若沒有把它賦給某個(gè)變量,仍然是可以的,只是函數(shù)對于有返回值的函數(shù),調(diào)用時(shí)若沒有把它賦給某個(gè)變量,仍然是可以的,只是函數(shù)的返回值有可能會(huì)被丟失。的返回值有可能會(huì)被丟失?!纠?-3】 求任意兩數(shù)的乘積。求任意兩數(shù)的乘積。自定義一個(gè)函數(shù)自
13、定義一個(gè)函數(shù)mul(),用于求兩數(shù)的乘積,程序:,用于求兩數(shù)的乘積,程序:/*exam1_3.c 求兩個(gè)數(shù)的乘積求兩個(gè)數(shù)的乘積*/#include float mul(float a,float b);main()float x,y,z;scanf(%f %f,&x,&y);z=mul(x,y); /* */x=x+10;y=y-10;mul(x,y); /* */C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1413x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y); /* *
14、 /float mul(float a,float b)return a*b;程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果:5 6 z=30.000000,mul(30.000000,-8.000000)=-240.000000C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1414程序說明:程序說明: 注釋處調(diào)用函數(shù)后的返回值賦給變量注釋處調(diào)用函數(shù)后的返回值賦給變量z。 注釋處調(diào)用函數(shù)后的返回值沒有賦給任何變量,函數(shù)的返回值被丟失。注釋處調(diào)用函數(shù)后的返回值沒有賦給任何變量,函數(shù)的返回值被丟失。 注釋處調(diào)用函數(shù)后的返回值成為了注釋處調(diào)用函數(shù)后的返回值成為了printf()
15、函數(shù)的參數(shù)。函數(shù)的參數(shù)。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1415 1變量的作用域變量的作用域 變量的作用域:指的是變量的有效范圍,針對變量不同的作用域,可把變量分為局變量的作用域:指的是變量的有效范圍,針對變量不同的作用域,可把變量分為局部變量和全局變量。部變量和全局變量。局部變量:在函數(shù)內(nèi)部或某個(gè)控制塊的內(nèi)部定義的變量為局部變量,局部變量的有局部變量:在函數(shù)內(nèi)部或某個(gè)控制塊的內(nèi)部定義的變量為局部變量,局部變量的有效范圍只限于本函數(shù)內(nèi)部,退出函數(shù),該變量自動(dòng)失效。效范圍只限于本函數(shù)內(nèi)部,退出函數(shù),該變量自動(dòng)失效。 全局變量:在函數(shù)外面定
16、義的變量稱為全局變量,全局變量的作用域是從該變量定義的全局變量:在函數(shù)外面定義的變量稱為全局變量,全局變量的作用域是從該變量定義的位置開始,直到源文件結(jié)束。在同一文件中的所有函數(shù)都可以引用全局變量。位置開始,直到源文件結(jié)束。在同一文件中的所有函數(shù)都可以引用全局變量。 C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1416局部變量和全局變量的作用域如圖所示:局部變量和全局變量的作用域如圖所示:C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1417【例例1-4】 變量作用域應(yīng)用舉例,閱讀下面的程序,注意區(qū)分局部
17、變量和全變量作用域應(yīng)用舉例,閱讀下面的程序,注意區(qū)分局部變量和全局變量的作用域。局變量的作用域。/*exam9_4.c 變量作用域舉例變量作用域舉例*/#include void a( void );void b( void );void c( void );int x = 1;main()int x = 5;printf(local x in outer scope of main is %dn, x );C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1418int x = 7;printf( local x in inner scope of m
18、ain is %dn, x );printf( local x in outer scope of main is %dn, x );a();b();c();a();b();c();前三次輸出前三次輸出結(jié)果結(jié)果:local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 5C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1419printf( local x in main is %dn, x );getc
19、har();return 0;void a( void )int x = 25;printf( nlocal x in a is %d after entering an, x );+x;printf( local x in a is %d before exiting an, x );C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1420void b( void ) static int x = 50; printf( nlocal static x is %d on entering bn, x ); +x; printf( local stat
20、ic x is %d on exiting bn, x );void c( void )printf( nglobal x is %d on entering cn, x );x *= 10;printf( global x is %d on exiting cn, x );C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1421程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果: 后后6次函數(shù)調(diào)用次函數(shù)調(diào)用local x in a is 25 after entering alocal x in a is 26 before exiting a local static x
21、is 50 on entering blocal static x is 51 on exiting b global x is 1 on entering cglobal x is 10 on exiting c local x in a is 25 after entering alocal x in a is 26 before exiting a local static x is 51 on entering blocal static x is 52 on exiting bglobal x is 10 on entering cglobal x is 100 on exiting
22、 c最后一次輸出:最后一次輸出:local x in main is 5C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/14222變量的存儲(chǔ)類型變量的存儲(chǔ)類型 變量的存儲(chǔ)類型:指的是變量的存儲(chǔ)屬性,它說明變量占用存儲(chǔ)空間的區(qū)域。變量的存儲(chǔ)類型:指的是變量的存儲(chǔ)屬性,它說明變量占用存儲(chǔ)空間的區(qū)域。 在內(nèi)存中,供用戶使用的存儲(chǔ)區(qū)由程序區(qū)、靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)三部分組成。在內(nèi)存中,供用戶使用的存儲(chǔ)區(qū)由程序區(qū)、靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)三部分組成。 變量的存儲(chǔ)類型有四種:變量的存儲(chǔ)類型有四種:auto型、型、register型、型、static型和型和exter
23、n型。型。auto型變量存儲(chǔ)在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)。型變量存儲(chǔ)在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)。register型變量保存在寄存器中。型變量保存在寄存器中。static型變量和型變量和extern型變量存儲(chǔ)在靜態(tài)存儲(chǔ)器。型變量存儲(chǔ)在靜態(tài)存儲(chǔ)器。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1423局部變量的存儲(chǔ)類型缺省值為局部變量的存儲(chǔ)類型缺省值為auto型型 。全局變量的存儲(chǔ)類型缺省值為全局變量的存儲(chǔ)類型缺省值為extern型型 。auto型變量和型變量和register型變量只用于定義局部變量。型變量只用于定義局部變量。 static型變量即可定義成局部變量,又可
24、定義成全局變量。型變量即可定義成局部變量,又可定義成全局變量。 【例例1-5】 設(shè)計(jì)一個(gè)函數(shù):設(shè)計(jì)一個(gè)函數(shù):long fac(int n),可用來計(jì)算,可用來計(jì)算15的階乘。的階乘。分析:可在函數(shù)中定義一個(gè)分析:可在函數(shù)中定義一個(gè)static型變量,用來保存上次的計(jì)算結(jié)果。型變量,用來保存上次的計(jì)算結(jié)果。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1424/*exam1_5.c 用用static型變量保留上次階乘的值型變量保留上次階乘的值*/#include long fac(int n)static int f=1;f=f*n;return f;
25、main()int i;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果:1!=1 2!=2 3!=6 4!=24 5!=120C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1425 1內(nèi)部函數(shù)內(nèi)部函數(shù) 若函數(shù)的存儲(chǔ)類型為若函數(shù)的存儲(chǔ)類型為static型,則稱其為內(nèi)部函數(shù)或稱靜態(tài)函數(shù),它表示在同一個(gè)程序中型,則稱其為內(nèi)部函數(shù)或稱靜態(tài)函數(shù),它表示在同一個(gè)程序中(由多個(gè)源文件組成),該函數(shù)只能在一個(gè)文件中存在,在其它文件中不可使用。(由多個(gè)源文件組成),該函數(shù)只能在一個(gè)文件中存在,在其它文件中不可使
26、用。 如:如:static int fun-name();內(nèi)部函數(shù)只能被其所在的源文件調(diào)用。內(nèi)部函數(shù)只能被其所在的源文件調(diào)用。2外部函數(shù)外部函數(shù) 若函數(shù)的存儲(chǔ)類型定義為若函數(shù)的存儲(chǔ)類型定義為extern型,則稱其為外部函數(shù),它表示該函數(shù)能被其它源文型,則稱其為外部函數(shù),它表示該函數(shù)能被其它源文件調(diào)用。函數(shù)的缺省存儲(chǔ)類型為件調(diào)用。函數(shù)的缺省存儲(chǔ)類型為extern型。型。注意:在需要用到外部函數(shù)的文件中,其函數(shù)聲明必須用注意:在需要用到外部函數(shù)的文件中,其函數(shù)聲明必須用extern進(jìn)行說明。進(jìn)行說明。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1426
27、例如:有兩個(gè)源文件和如下所示:例如:有兩個(gè)源文件和如下所示:/* 調(diào)用外部函數(shù)調(diào)用外部函數(shù)*/# include int mod(int a, int b);extern int add (int m, int n); /*外部函數(shù)聲明外部函數(shù)聲明*main() int x, y, result; scanf (“%d%d”, &x, &y); result=add(x,y); /*調(diào)用外部函數(shù)調(diào)用外部函數(shù)*/ if (result 0) result=result-mod(x,y); printf(“result=%dn”, result);C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基
28、礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1427int mod(int a, int b) return(a%d);/* 外部函數(shù)外部函數(shù)*/extern int add(int m, int n) return(m+n);說明:說明:1在文件在文件1()中的函數(shù)聲明:中的函數(shù)聲明: int mod(int a, int b);實(shí)際上相當(dāng)于:實(shí)際上相當(dāng)于:extern int mod(int a, int b);C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/14282在文件在文件2()中的函數(shù)定義:中的函數(shù)定義: extern int
29、 add(int m, int n) return(m+n); 實(shí)際上相當(dāng)于:實(shí)際上相當(dāng)于:int add(int m, int n) return(m+n); 3由多個(gè)源文件組成一個(gè)程序時(shí),由多個(gè)源文件組成一個(gè)程序時(shí),main()函數(shù)只能出現(xiàn)在一個(gè)源文件中。函數(shù)只能出現(xiàn)在一個(gè)源文件中。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/14294多個(gè)源文件的連接方式有三種:多個(gè)源文件的連接方式有三種:將各源文件分別編譯成目標(biāo)文件,得到多個(gè)目標(biāo)文件(將各源文件分別編譯成目標(biāo)文件,得到多個(gè)目標(biāo)文件(.obj后綴),然后用連接命后綴),然后用連接命令(令(tl
30、ink)把多個(gè))把多個(gè).obj文件連接起來,在文件連接起來,在Turbo c上用如下命令:上用如下命令: tlink +生成一個(gè)的可執(zhí)行文件。生成一個(gè)的可執(zhí)行文件。建立項(xiàng)目文件(建立項(xiàng)目文件(.prj后綴),具體操作可參閱各種后綴),具體操作可參閱各種C編譯手冊。編譯手冊。 使用文件包含命令。使用文件包含命令。 C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1430 C語言中一個(gè)函數(shù)中的語句可以是對另一個(gè)函數(shù)的調(diào)用。語言中一個(gè)函數(shù)中的語句可以是對另一個(gè)函數(shù)的調(diào)用。函數(shù)嵌套調(diào)用圖例:函數(shù)嵌套調(diào)用圖例:調(diào)用過程按圖中箭頭所示的方向和順序進(jìn)行,屬于一種線性
31、調(diào)用關(guān)系,每次調(diào)用后,調(diào)用過程按圖中箭頭所示的方向和順序進(jìn)行,屬于一種線性調(diào)用關(guān)系,每次調(diào)用后,最終返回到原調(diào)用點(diǎn),繼續(xù)執(zhí)行以下語句。最終返回到原調(diào)用點(diǎn),繼續(xù)執(zhí)行以下語句。 C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1431C語言中還允許在函數(shù)中調(diào)用自身,或函數(shù)之間相互調(diào)用,這種調(diào)用方式稱語言中還允許在函數(shù)中調(diào)用自身,或函數(shù)之間相互調(diào)用,這種調(diào)用方式稱之為遞歸。遞歸又分為直接遞歸調(diào)用和間接遞歸調(diào)用。之為遞歸。遞歸又分為直接遞歸調(diào)用和間接遞歸調(diào)用。 直接遞歸調(diào)用;函數(shù)直接調(diào)用自身。直接遞歸調(diào)用;函數(shù)直接調(diào)用自身。間接遞歸調(diào)用:函數(shù)互相調(diào)用對方。間接
32、遞歸調(diào)用:函數(shù)互相調(diào)用對方。直接遞歸:直接遞歸:int temp (int x) int y, z; z=temp(y); C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1432間接遞歸:間接遞歸:顯然,遞歸有可能陷入無限遞歸狀態(tài),最終導(dǎo)致錯(cuò)誤發(fā)生。因此,設(shè)計(jì)一個(gè)遞歸問題顯然,遞歸有可能陷入無限遞歸狀態(tài),最終導(dǎo)致錯(cuò)誤發(fā)生。因此,設(shè)計(jì)一個(gè)遞歸問題必須具備兩個(gè)條件:必須具備兩個(gè)條件:1后一部分與原始問題類似。后一部分與原始問題類似。2后一問題是原始問題的簡化。后一問題是原始問題的簡化。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏
33、定義義2022/2/1433【例例1-6】 編程,從鍵盤輸入一個(gè)正整數(shù)編程,從鍵盤輸入一個(gè)正整數(shù)n,求,求n!。n!的數(shù)字表達(dá)式為:的數(shù)字表達(dá)式為:n!=) 1()!1(*) 1, 0(1nnnn定義一個(gè)求定義一個(gè)求n!的函數(shù):的函數(shù):long fac(int n)long fac(int n) long result; if (n= = 0 | n= =1) result =1; else result=n*fac(n-1); return(result); C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1434完整程序如下:完整程序如下: /*e
34、xam1_6.c 用遞歸法求用遞歸法求n!*/#include long fac(int n)long result;if(n=0|n=1)result=1;elseresult=n*fac(n-1);return result;main()int x;long f;C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1435scanf(%d,&x);if(x1)設(shè)計(jì)一個(gè)函數(shù):設(shè)計(jì)一個(gè)函數(shù):long fibonacci (int n)用于計(jì)算數(shù)列中第用于計(jì)算數(shù)列中第n項(xiàng)的值,項(xiàng)的值, C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函
35、數(shù)與宏定義義2022/2/1437程序如下所示:程序如下所示: /*exam1_7.c 求第求第n項(xiàng)項(xiàng)Fibonacci數(shù)列的值數(shù)列的值*/#include long fibonacci(int n);main()int x=0;long result;doresult=fibonacci(x);printf(fibonacci(%d)=%ldn,x,result);scanf(%d,&x);while(x!=-1);C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1438long fibonacci(int n)if(n=0|n=1)retu
36、rn n;elsereturn fibonacci(n-1)+fibonacci(n-2);C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義2022/2/1439以以x=4為例,下圖說明了為例,下圖說明了fibonacci函數(shù)是怎樣計(jì)算函數(shù)是怎樣計(jì)算fibonacci(4)的。圖中把的。圖中把fibonacci簡寫成簡寫成f。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義40“編譯預(yù)處理編譯預(yù)處理”是是C與其它高級(jí)語言的一個(gè)重要區(qū)別。它們主要是:與其它高級(jí)語言的一個(gè)重要區(qū)別。它們主要是: 宏定義宏定義 文件包含文件包含 條件編譯條件編譯
37、 1.5 預(yù)處理預(yù)處理C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義411) 不帶參數(shù)的宏定義不帶參數(shù)的宏定義 用指定的標(biāo)識(shí)符用指定的標(biāo)識(shí)符(宏名宏名)代表一串字符。代表一串字符。#define 宏名宏名 字符串字符串1.5.1 宏定義宏定義例例 求正圓錐體的底周長、底面積和它的體積。求正圓錐體的底周長、底面積和它的體積。 #define PI 3.1415926 /* 宏名宏名PI用大寫,行末無分號(hào)用大寫,行末無分號(hào) */ main( ) float l, s, r, v ; scanf(%f,&r); l = 2.0*PI*r; s = PI*r*r
38、; v = 4.0 / 3*PI*r*r*r ; printf(l=%10.4f ns=%10.4f nv=%10.4f n,l,s,v); getch(); C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義42 進(jìn)行宏定義時(shí),可以引用已定義的宏名,層層置換。進(jìn)行宏定義時(shí),可以引用已定義的宏名,層層置換。 對程序中用雙引號(hào)括起來的字符串,即使與宏名相同,也不會(huì)被置換。對程序中用雙引號(hào)括起來的字符串,即使與宏名相同,也不會(huì)被置換。 宏名的有效范圍為該宏定義命令之后至本源文件結(jié)束。通常,宏定義命令一般寫在文件開頭或函宏名的有效范圍為該宏定義命令之后至本源文件結(jié)束。通常,
39、宏定義命令一般寫在文件開頭或函數(shù)之前作為該文件的一部分。數(shù)之前作為該文件的一部分。 可以用可以用 #undef 命令終止宏定義的作用域。如:命令終止宏定義的作用域。如:#define G 9.8main( )#undef Gfloat f( ) G 的作用范圍的作用范圍C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義432帶參數(shù)的宏定義帶參數(shù)的宏定義語句形式:語句形式:#define 宏名宏名(形參表形參表) 字符串字符串注意:字符串應(yīng)包含形參表中的參數(shù)注意:字符串應(yīng)包含形參表中的參數(shù)例例#define PI 3.1415926#define S(r) PI*r*r
40、main( )float a, area; a=3.6; area=S(a); /*area=3.1415926*a*a,但不會(huì)置換,但不會(huì)置換a為為3.6 */ printf(r=%f narea=%f n,a,area); getch();C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義44 若將若將area=S(a) 改寫成改寫成 area=S(a+2),將置換為:,將置換為: area=PI a+2 a+2,而不是,而不是: area=PI (a+2) (a+2)。 若要達(dá)到后者,則應(yīng)將宏定義命令改寫為:若要達(dá)到后者,則應(yīng)將宏定義命令改寫為: #define
41、 S(r) PI (r) (r) 宏名與括號(hào)之間不得有空格,因?yàn)楹昝c表達(dá)式之間的分隔符為空格。如果用宏名與括號(hào)之間不得有空格,因?yàn)楹昝c表達(dá)式之間的分隔符為空格。如果用#define S (r) PI r r 的話,則被置換為的話,則被置換為 area=(r) PI r r (a)宏展開并不進(jìn)行值的傳遞,即不求表達(dá)式的值,也沒有宏展開并不進(jìn)行值的傳遞,即不求表達(dá)式的值,也沒有“返回值返回值”的概念。的概念。 宏不存在類型問題,宏名無類型,參數(shù)也無類型,表達(dá)式可以是任何類型。宏不存在類型問題,宏名無類型,參數(shù)也無類型,表達(dá)式可以是任何類型。C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函
42、數(shù)與宏定函數(shù)與宏定義義45注注:這里的:這里的 t 展開后為展開后為 t = (a+b)(c+d)?(a+b):(c+d) 如果第一行寫成:如果第一行寫成: #define MAX(x,y) xy ? x : y 則這里的則這里的 t 展開后為展開后為 t = a+bc+d?a+b:c+d 因?yàn)橐驗(yàn)橹脫Q展開是用置換展開是用“表達(dá)式表達(dá)式”對等的置換對等的置換“形參表形參表”中的參數(shù)中的參數(shù)。 定義帶參數(shù)的宏,可以實(shí)現(xiàn)一些簡單的函數(shù)功能。定義帶參數(shù)的宏,可以實(shí)現(xiàn)一些簡單的函數(shù)功能。如:如:#define MAX(x,y) (x)(y)?(x) : (y) main( )int a, b, c,
43、t ; t = MAX(a+b, c+d); C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義461.5.2 “文件包含文件包含” 用用 #include 命令實(shí)現(xiàn)一個(gè)文件包含另一個(gè)文件。命令實(shí)現(xiàn)一個(gè)文件包含另一個(gè)文件。 語句形式:語句形式: #include “文件名文件名”例例#include stdio.h#define N 2#define M N+1#define NUM (M+1)*M/2main( ) int i, n=0; for (i=1; i=NUM; i+) n+; printf(%2d, n); getch();輸出結(jié)果:輸出結(jié)果:1 2 3
44、 4 5 6 7 8C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義47 一個(gè)一個(gè)include命令只能指定一個(gè)被包含文件,如果要包含命令只能指定一個(gè)被包含文件,如果要包含n個(gè)文件,則要用個(gè)文件,則要用n個(gè)個(gè)include命令。命令。 NUM被代換展開后為:被代換展開后為:( 2+1+1) 2+1/2#include命令中,文件名既可用雙引命令中,文件名既可用雙引“ ”號(hào)號(hào)(推薦),也可用尖括號(hào)推薦),也可用尖括號(hào)括起來。括起來。表示被表示被包含在標(biāo)準(zhǔn)目錄中包含在標(biāo)準(zhǔn)目錄中(include).“”表示被包含文件在指定目錄中,若只有文件名不帶路徑,則表示被包含文件在指
45、定目錄中,若只有文件名不帶路徑,則在當(dāng)前目錄中,若找不到,再到標(biāo)準(zhǔn)目錄中找。在當(dāng)前目錄中,若找不到,再到標(biāo)準(zhǔn)目錄中找。包含文件名可以是包含文件名可以是.c源文件或源文件或.頭文件,如頭文件,如#include #include “myhead.h”#include “D:myexammyfile.c”C C 程序設(shè)計(jì)基礎(chǔ)教程程序設(shè)計(jì)基礎(chǔ)教程第九章第九章函數(shù)與宏定函數(shù)與宏定義義48 條件編譯條件編譯語句形式:語句形式:1#ifdef 宏名宏名程序段程序段1 #else程序段程序段2 #endif 作用:如果宏名已定義,則編譯作用:如果宏名已定義,則編譯“程序段程序段1”,否則編譯,否則編譯“程序段程序段2” 。所謂所謂“宏名已定義宏名已定義”是無論是無論“宏名宏名”定義為什么內(nèi)容。定義為什么內(nèi)容。 條件編譯的作用:縮短編譯時(shí)間,減少目標(biāo)程序的長度。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度暖通工程保險(xiǎn)合同
- 課題申報(bào)參考:明清時(shí)期俄人旅華游記中的中國形象研究
- 課題申報(bào)參考:面向大學(xué)生情緒調(diào)節(jié)的人工智能眼動(dòng)交互音樂生成系統(tǒng)設(shè)計(jì)研究
- 二零二五年度模具行業(yè)創(chuàng)新項(xiàng)目合作合同2篇
- 2025版選礦廠礦山地質(zhì)勘查承包合同樣本3篇
- 2025年度個(gè)人汽車租賃與停車服務(wù)合同4篇
- 2025版寧夏糧食和物資儲(chǔ)備局糧食儲(chǔ)備庫智能化升級(jí)合同3篇
- 2025年度牛糞處理設(shè)施融資租賃合同范本4篇
- 2025版農(nóng)副業(yè)科技成果轉(zhuǎn)化承包合同書二份3篇
- 二零二五年度磚廠生產(chǎn)線承包租賃合同3篇
- 2024年銀行考試-興業(yè)銀行筆試參考題庫含答案
- 泵站運(yùn)行管理現(xiàn)狀改善措施
- 2024屆武漢市部分學(xué)校中考一模數(shù)學(xué)試題含解析
- SYT 0447-2014《 埋地鋼制管道環(huán)氧煤瀝青防腐層技術(shù)標(biāo)準(zhǔn)》
- 第19章 一次函數(shù) 單元整體教學(xué)設(shè)計(jì) 【 學(xué)情分析指導(dǎo) 】 人教版八年級(jí)數(shù)學(xué)下冊
- 浙教版七年級(jí)下冊科學(xué)全冊課件
- 弧度制及弧度制與角度制的換算
- 瓦楞紙箱計(jì)算公式測量方法
- 江蘇省中等職業(yè)學(xué)校學(xué)業(yè)水平考試商務(wù)營銷類(營銷方向)技能考試測試題
- DB32-T 4004-2021水質(zhì) 17種全氟化合物的測定 高效液相色譜串聯(lián)質(zhì)譜法-(高清現(xiàn)行)
- DB15T 2724-2022 羊糞污收集處理技術(shù)規(guī)范
評(píng)論
0/150
提交評(píng)論