下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 模塊設(shè)計(jì),5.1函數(shù)的概念,函數(shù)式的程序結(jié)構(gòu),有且只能有一個(gè)名為main的主函數(shù) C程序的執(zhí)行總是從main函數(shù)開(kāi)始,在main中結(jié)束 函數(shù)不能嵌套定義,可以嵌套調(diào)用 較大的程序一般分為若干個(gè)程序模塊。每個(gè)模塊實(shí)現(xiàn)一個(gè)特定的功能。 常將一些常用的功能模塊編寫成函數(shù),以被多個(gè)程序調(diào)用。,例5-1求兩個(gè)整數(shù)的和,#include main() int x,y,z; scanf(“%d,%d”, ,int sum(int a,int b) int s; s=a+b; return s; main( ) int x,y,z; int sum(int ,int ); scanf(“%d,%d”,
2、 ,從用戶角度 標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供 用戶自定義函數(shù) 從參數(shù)形式 無(wú)參函數(shù) 有參函數(shù) 從返回值角度 有返回值函數(shù):return 無(wú)返回值函數(shù): void,使用庫(kù)函數(shù)應(yīng)注意: 1、函數(shù)功能 2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型 3、函數(shù)返回值意義和類型 4、需要使用的包含文件,函數(shù)分類,一般形式,用戶定義的合法標(biāo)識(shí)符,函數(shù)返回值類型 缺省int型 無(wú)返回值void,函數(shù)體,例 有參函數(shù)(現(xiàn)代風(fēng)格) int max(int x,int y) int z; z=xy?x:y; return(z); ,例 無(wú)參函數(shù) printstar( ) printf(“*n”); 或 print
3、star(void ) printf(“*n”); ,函數(shù)的定義,可選項(xiàng),一般形式為: , ,例 有參函數(shù)(傳統(tǒng)風(fēng)格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); ,函數(shù)傳統(tǒng)風(fēng)格和例子,函數(shù)的定義,函數(shù)定義不允許嵌套。 在語(yǔ)言中,所有函數(shù)(包括主函數(shù)main())都是平行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)main()之前或之后。但在一個(gè)函數(shù)的函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即不能嵌套定義。,函數(shù)的定義,注意:,main( ) int x,y,z; int sum(int ,int ); scanf(“%d,%d”, ,p
4、116例,形參與實(shí)參 形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名 實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式 C語(yǔ)言的參數(shù)傳遞規(guī)則是按值傳遞 方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值 特點(diǎn): 形參與實(shí)參占用不同的內(nèi)存單元 單向傳遞 實(shí)參和形參在數(shù)量上、類型上、順序上嚴(yán)格一致。,函數(shù)的參數(shù),例5-2,#include main() int n; printf(“Input number:”); scanf(“%d”, ,運(yùn)行結(jié)果: Input number: 100 n=5050 n=100,#include main()
5、 int x=7,y=11; printf(x=%d,ty=%dn,x,y); printf(swapped:n); swap(x,y); printf(x=%d,ty=%dn,x,y); swap(int a,int b) int temp; temp=a; a=b; b=temp; ,例 交換兩個(gè)數(shù),分析下面程序運(yùn)行結(jié)果,int swap(int a,int b) int t; printf(a=%d,b=%dn,a,b); t=a;a=b;b=t; printf(a=%d,b=%dn,a,b); main() int x=3,y=5; swap(x,y); printf(x=%d,y=%
6、dn,x,y);,例,程序運(yùn)行結(jié)果是什么?,#include int sum(int n) int i,s=0; for(i=0;in;i+) if(i%10= =9) s=s+i; return s; main() printf(“%d”,sum(69); ,204,#include int fun(int n) if(n10) return n; else return (n%10)*fun(n/10); main() printf(“%d”,fun(218); ,16,4.函數(shù)的返回值,函數(shù)執(zhí)行的最后一個(gè)操作是返回 返回的意義是: 使流程返回主調(diào)函數(shù),宣告函數(shù)的一次執(zhí)行終結(jié),在調(diào)用期間所
7、分配的變量單元被撤銷。 送函數(shù)值到調(diào)用表達(dá)式中,但是這一點(diǎn)并非是必需的,有些函數(shù)有返回值,有些函數(shù)可以沒(méi)有返回值。 從有無(wú)返回值這個(gè)角度,可把函數(shù)分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種。 函數(shù)的返回是通過(guò)函數(shù)中的return語(yǔ)句來(lái)實(shí)現(xiàn)的。,返回語(yǔ)句 功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返回值帶給調(diào)用函數(shù) 形式: return(表達(dá)式); 或 return 表達(dá)式; return; 說(shuō)明: 函數(shù)中可有多個(gè)return語(yǔ)句 在定義函數(shù)時(shí),對(duì)函數(shù)類型的說(shuō)明應(yīng)與return語(yǔ)句中返回值的類型一致。 若函數(shù)類型與return語(yǔ)句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換-函數(shù)調(diào)用轉(zhuǎn)換 不帶
8、表達(dá)式的return語(yǔ)句位于函數(shù)體的最后時(shí),允許省略,用作函數(shù)體結(jié)束的“”會(huì)將流程返回調(diào)用函數(shù) 函數(shù)中無(wú)return語(yǔ)句或使用不帶表達(dá)式的return語(yǔ)句,并不是不返回一個(gè)值,而是一個(gè)不確定的值。為了明確表示不返回值,可以用“void”定義成“無(wú)(空)類型”-void型函數(shù),例 無(wú)返回值函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; ,函數(shù)的返回值,例:有指定返回值函數(shù) int max(int k,int m) return(km?k:m); ,例 多個(gè)return語(yǔ)句 int cp(int x,int y ) if(xy)
9、return 1; else if(xy) return 2; return 0; ,在程序中,是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的 函數(shù)調(diào)用的一般形式: 說(shuō)明: 調(diào)用函數(shù)時(shí),函數(shù)名稱必須與具有該功能的自定義函數(shù)名稱完全一致。 實(shí)參與形參個(gè)數(shù)相等,類型一致,按順序一一對(duì)應(yīng),才能正確地進(jìn)行數(shù)據(jù)傳遞 實(shí)參表求值順序,因系統(tǒng)而定(Turbo C 自右向左) C語(yǔ)言規(guī)定,在調(diào)用函數(shù)之前,必須有相應(yīng)的函數(shù)說(shuō)明或函數(shù)定義。,5.2.2 函數(shù)的調(diào)用,函數(shù)名( ) 或 函數(shù)名(實(shí)參表);,函數(shù)調(diào)用語(yǔ)句: 例: printstar(); printf(“Hello,World!n”); 函數(shù)表達(dá)式: 例: m=ma
10、x(a,b)*2; 函數(shù)參數(shù): 例: printf(“%d”,max(a,b); m=max(a,max(b,c);,函數(shù)的調(diào)用調(diào)用方式:,#include main() int k=1,j; j=f(k,+k); /*函數(shù)調(diào)用*/ printf(%dn,j); int f(int a,int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c); ,函數(shù)調(diào)用時(shí)求值的順序,例,m=3; printf(%d,%d,m,m+);,例 比較兩個(gè)數(shù)并輸出大者,#include main() int a,b,c; scanf(%d,%d
11、, ,對(duì)被調(diào)用函數(shù)要求: 必須是已存在的函數(shù) 庫(kù)函數(shù): #include 用戶自定義函數(shù): 函數(shù)聲明 函數(shù)聲明 采用函數(shù)原型方式,對(duì)被調(diào)用函數(shù)進(jìn)行說(shuō)明 一般形式: ( ); 作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn) 函數(shù)定義與函數(shù)說(shuō)明不同 函數(shù)說(shuō)明位置:程序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外) 下列情況下,可不作函數(shù)說(shuō)明 函數(shù)返值是int型 被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,函數(shù)的聲明: 對(duì)在本函數(shù)中要調(diào)用的函數(shù)所做的說(shuō)明,double fun(int n) main() fun(1); ,函數(shù)聲明與定義的對(duì)應(yīng)關(guān)系,main() double fun(int n); fun(1); dou
12、ble fun(int n) ,double fun(int n); main() fun(1); double fun(int n) ,現(xiàn)代風(fēng)格:,不需要聲明:,main() fun(1); int fun(int n) ,例: (先定義后使用) #include float f(float x) return 2*x*x+3*x+1; void main( ) float x; scanf(%f, ,例:(后定義,原形說(shuō)明) #include float f(float); void main( ) float x; scanf(%f, ,找出函數(shù)定義部分和聲明部分,main( ) dou
13、ble new_style(int a,double x); double new_style(int a,double x) /*函數(shù)體*/ ,例子解析,main( ) int a=3,b=5; void swap(int x,int y); swap(a,b); printf(“a=%d,b=%dn”,a,b);,void swap(int x,int y) int temp; temp=x, x=y, y=temp; printf(“x=%d,y=%dn”,x,y); ,函數(shù)調(diào)用,函數(shù)定義,形參,實(shí)參, 執(zhí)行函數(shù)體,返回函數(shù)值 釋放相應(yīng)空間,函數(shù)聲明, 實(shí)參形參,x=5,y=3 a=3,
14、b=5,5.3函數(shù)調(diào)用中參數(shù)的傳遞,1 值傳遞方式 2 地址傳遞方式:指針 3 數(shù)組作為函數(shù)參數(shù): 與普通變量的值傳遞方式相同,單向的值傳送.,例5-4:求一個(gè)整數(shù)數(shù)組中各元素的絕對(duì)值.,#include void fun(int n) if(n=0) printf(%3d,n); else printf(%3d,-n); main( ) int a10,i; printf(input 10 numbers:n); for(i=0;i10;i+) scanf(%d, ,數(shù)組元素作函數(shù)參數(shù),例,#include main( ) int a7=3,2,6,9,10,4,8; int i,x; in
15、t cc(int); /*函數(shù)聲明*/ for(i=0;i7;i+) x=cc(ai); /*用數(shù)組元素作為函數(shù)的實(shí)參*/ if(x=1) printf(%dn,ai); int cc(int y) /*函數(shù)定義*/ int z=0; if(y % 2 = =1) z=1; return(z); ,分析下面程序的運(yùn)行結(jié)果,例,下面的程序完成什么功能?,#include int max(int x,int y) return(xy?x:y); void main() int a10,i,m; printf(enter 10 numbers:n); for(i=0;i10;i+) scanf(%d
16、, ,求10個(gè)數(shù)中的最大數(shù),數(shù)組名作為函數(shù)實(shí)參,用數(shù)組名作函數(shù)實(shí)參時(shí),形參和實(shí)參都必須是同類型的數(shù)組,而且都有明確的數(shù)組說(shuō)明。 若函數(shù)的形參是數(shù)組,則對(duì)應(yīng)的實(shí)參必須是數(shù)組。 說(shuō)明: 1.實(shí)參與形參數(shù)組的類型必須一致。 2.用數(shù)組作參數(shù)時(shí),傳遞的是數(shù)組的首地址,因此形參數(shù)組可以不指定大小,但需另指定一個(gè)參數(shù),傳遞數(shù)組元素的個(gè)數(shù)。 3.數(shù)組做為函數(shù)參數(shù)時(shí),實(shí)參和形參數(shù)組共享同一內(nèi)存單元。 如果形參數(shù)組元素被改變,則實(shí)參數(shù)組也就被改變了,5-5數(shù)組a中存放10個(gè)實(shí)型數(shù)據(jù),求平均 #include float aver(float b10) int i; float av,s=b0; for(i=0;
17、i10;i+) s=s+bi; av=s/10; return av; main() float a10,av; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f, ,5-6 #include void fun(int a10) int i; for(i=0;i10;i+) if(ai0) ai=-ai; printf(%3d,ai); main() int b10,i; printf(input 10 numbers:n); for(i=0;i10;i+) scanf(%d, ,5-7 #include void fun(i
18、nt a8) int i; for(i=0;i8;i+) if(ai0) ai=-ai; printf(%3d,ai); main() int b10,i; printf(input 10 numbers:n); for(i=0;i10;i+) scanf(%d, ,include int max(int x10) int i,m; m=x0; for(i=0;i10;i+) if(mxi) m=xi; return m; void main() int a10,i; printf(enter 10 numbers:n); for(i=0;i10;i+) scanf(%d, ,include
19、int max(int x,int n) int i,m; m=x0; for(i=0;in;i+) if(mxi) m=xi; return m; void main() int a10,i; printf(enter 10 numbers:n); for(i=0;i10;i+) scanf(%d, ,形參和實(shí)參總結(jié),概述 變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象,編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元,5.4 變量的存儲(chǔ)類別與作用域,變量的屬性 數(shù)據(jù)類型: 存儲(chǔ)類別: 存儲(chǔ)器類型:內(nèi)存、寄存器 生命期:變量占據(jù)內(nèi)存的時(shí)間期限-靜態(tài)變量與動(dòng)態(tài)變量 作用域:變量出現(xiàn)的有效區(qū)域-局部變量與全局變量 變量說(shuō)明
20、格式: ; 變量說(shuō)明的位置 外部(全局)變量:在函數(shù)外部說(shuō)明的變量 內(nèi)部(局部)變量:在一個(gè)函數(shù)內(nèi)部說(shuō)明的變量,概述,變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性),存儲(chǔ)類別: auto -自動(dòng)型 register-寄存器型(Turbo C 2.0中按自動(dòng)型處理) static -靜態(tài)型 extern -外部型,局部變量-內(nèi)部變量 定義:在函數(shù)內(nèi)定義,在本函數(shù)內(nèi)出現(xiàn)有效 局部變量可用存儲(chǔ)類型:auto register static (默認(rèn)為auto) 說(shuō)明: 所有函數(shù)是平行關(guān)系,main函數(shù)不例外。main中定義的變量只在main中有效,不能使用其它函數(shù)中定義的內(nèi)部變量 不同函數(shù)中同名變量,占不同內(nèi)存單
21、元 語(yǔ)言規(guī)定形參的存儲(chǔ)類別是自動(dòng)型,屬于局部變量 可定義在復(fù)合語(yǔ)句中出現(xiàn)有效的變量,作用域:局部變量和全局變量,運(yùn)行結(jié)果: main:a=3,b=4 sub:a=6,b=7 main:a=3,b=4,局部變量-內(nèi)部變量,運(yùn)行結(jié)果: 1 2 3 4 5,運(yùn)行結(jié)果: 1 2 6 24 120,靜態(tài)局部變量說(shuō)明: 初始化語(yǔ)句只在第一次調(diào)用該函數(shù)時(shí)才執(zhí)行 變量值具有可繼承性,全局變量-外部變量 定義:在函數(shù)外面定義的變量,可被作用域內(nèi)的所有函數(shù)直接引用 外部變量可用存儲(chǔ)類型:缺省 或 static 說(shuō)明 不帶存儲(chǔ)類別的外部變量說(shuō)明是變量的定義性說(shuō)明 作用域:從變量出現(xiàn)的位置直至本文件結(jié)束 生命期:整個(gè)
22、程序執(zhí)行期 在函數(shù)外面定義的static變量-靜態(tài)外部變量限定該外部變量只在本文件使用 用extern說(shuō)明可擴(kuò)充外部變量的作用域 若外部變量與局部變量同名,則外部變量被屏蔽,應(yīng)盡量少使用全局變量,因?yàn)椋?全局變量在程序全部執(zhí)行過(guò)程中占用存儲(chǔ)單元 降低了函數(shù)的通用性、可靠性,可移植性 降低程序清晰性,容易出錯(cuò),#include int sum; void plusone() sum+; void plustwo() sum+=2; main() sum=5; plusone(); plustwo(); printf(“The sum is %dn,sum); ,作用域,sum,例,全局變量-外部
23、變量 extern說(shuō)明 帶extern的外部變量說(shuō)明是變量的引用性說(shuō)明 引用性說(shuō)明格式: extern 數(shù)據(jù)類型 變量表; 擴(kuò)充外部變量的作用域 外部變量的定義性說(shuō)明與引用性說(shuō)明不同,定義性說(shuō)明 引用性說(shuō)明 次數(shù): 只能1次 可說(shuō)明多次 位置: 所有函數(shù)之外 函數(shù)內(nèi)或函數(shù)外 分配內(nèi)存: 分配內(nèi)存,可初始化 不分配內(nèi)存,不可初始化,extern char c1,c2;,extern char c1,c2;,例,int max(int x, int y) int z; z=xy?x:y; return(z); main() extern int a,b; printf(max=%d,max(a,b
24、); int a=13,b=-8;,運(yùn)行結(jié)果:max=13,extern int a,b; int max() int z; z=ab?a:b; return(z); main() printf(max=%d,max(); int a=13,b=-8;,例 外部變量用于函數(shù)之間的通信,int a=3,b=5; max(int a, int b) int c; c=ab?a:b; return(c); main() int a=8; printf(max=%d,max(a,b); ,運(yùn)行結(jié)果:max=8,例 外部變量與局部變量,5.4.2 變量的存儲(chǔ)類別,存儲(chǔ)方式 靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定
25、存儲(chǔ)空間 動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間,生命期 靜態(tài)變量:編譯時(shí)分配存儲(chǔ)空間,從程序開(kāi)始執(zhí)行直到程序結(jié)束 動(dòng)態(tài)變量:函數(shù)被調(diào)用期間,auto -自動(dòng)型 register-寄存器型(Turbo C 2.0中按自動(dòng)型處理) static -靜態(tài)型 extern -外部型 變量完整說(shuō)明格式: ;,如: int sum; auto int a,b,c; register int i; static float x,y; extern int f,m;,1、自動(dòng)變量(auto),默認(rèn)類型(以前用的均為auto類型),函數(shù)或分程序被調(diào)用時(shí)動(dòng)態(tài)建立,執(zhí)行完撤消,用之則建 用完即撤,函數(shù)或分
26、程序內(nèi)可用,如:auto int x; 等價(jià)于:int x;,自動(dòng)變量是局部變量,只在定義它的函數(shù)或分程序局部有效,main( ) int x=1; void prt(void); int x=3; prt( ); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x); void prt(void) int x=5; printf(“3th x=%dn”,x); ,x=1,x=3,x=5,調(diào)用聲明,函數(shù)定義,1,x,程序的運(yùn)行:,main( ),3th x=5,2nd x=3,1st x=1,釋放,釋放,釋放,外層與內(nèi)層變量同名時(shí),外層變量被內(nèi)層同名變量屏蔽
27、(孔洞原則),自動(dòng)變量賦值前,值不確定,main( ) int i; printf(“i=%dn”,i); ,運(yùn)行結(jié)果: i=62,i值不可預(yù)知,由存儲(chǔ)單元當(dāng)時(shí)的狀態(tài)決定,5-11,main() auto int a,s=10,p=10; printf(“n input a number:n”;) scanf(“%d”, ,2、靜態(tài)變量,編譯時(shí)建立,并初始化為0,執(zhí)行完保留。,編譯時(shí)建 用完保留,從定義點(diǎn)到程序結(jié)束可用,函數(shù)或分程序內(nèi)可用,靜態(tài)局部,靜態(tài)全局(外部),比較兩個(gè)程序,靜態(tài)局部變量的值具有繼承性,main( ) void increment(void); increment( );
28、 increment( ); increment( ); void increment(void) int x=0; x+; printf(“%dn”,x); ,1 1 1,main( ) void increment(void); increment( ); increment( ); increment( ); void increment(void) static int x=0; x+; printf(“%dn”,x); ,1 2 3,1,釋放,1,釋放,1,釋放,main( ) int i; void f(); for(i=1;i=5;i+) f( ); void f(); auto
29、 int j=0; +j; printf(“%dn”,j); ,main( ) int i; void f(); for(i=1;i=5;i+) f( ); void f(); static int j=0; +j; printf(“%dn”,j); ,3、寄存器變量(register),與 auto性質(zhì)完全相同,只是存放在CPU的寄存器中。 常把使用頻度高的變量(如循環(huán)變量)定義為register。,若寄存器變量由于寄存器數(shù)目等條件的限制不能實(shí)現(xiàn)時(shí),系統(tǒng)自動(dòng)處理為auto變量。,說(shuō) 明,main register int i,s=0; for(i=1;i=200;i+) s=s+i; pri
30、ntf(“s=%dn”,s); ,4、外部變量:extern,外部變量是全局變量,定義在所有函數(shù)之外的變量,從定義點(diǎn)到文件結(jié)束可用,編譯時(shí)建立,并初始化為0,執(zhí)行完保留。,編譯時(shí)建 用完保留,外部變量是全局變量,從定義點(diǎn)到本文件結(jié)束全程有效,/*exa1.c*/ int a,b; char c; main() /*exa2.c*/ extern int a,b; extern char c; func(int x,y ) ,在exa1.c和exa2.c兩個(gè)文件中都要使用a、b、c3個(gè)變量。在exa1.c文件中把a(bǔ)、b、c都定義為外部變量。在exa2.c文件中用extern把3個(gè)變量說(shuō)明為外部變
31、量,表示這些變量已在其他文件中定義,編譯系統(tǒng)不再為它們分配內(nèi)存空間。,交換兩個(gè)變量的值,a=3,b=5,a=5,b=3,若外部變量不加static限制時(shí),用完保留,可被其它文件使用,int a=3,b=5; main( ) void fun(void); printf(%d,%dn”,a,b); fun( ); printf(“%d,%dn”,a,b); void fun(void) int c; c=a; a=b; b=c; ,main( ) void gx( ),gy( ); extern int x,y; printf(“1:x=%dt y=%dn”,x,y); y=246; gx( )
32、; gy( ); void gx( ) extern int x,y; x=135; printf(“2:x=%dt y=%dn”,x,y); int x,y; void gy( ) printf(“3:x=%dt y=%dn”,x,y); ,1: x=0 y=0,2: x=135 y=246,3: x=135 y=246,main( ) incx( ); incy( ); incx( ); incy( ); incx( ); incy( ); incx( ) int x=0; printf(“x=%dt”,+x); incy( ) static int y=0; printf(“ny=%dn
33、”,+y); ,x=1,x=1,y=2,y=1,x=1,y=3,寫出程序的執(zhí)行結(jié)果,局部變量默認(rèn)為auto型 register型變量個(gè)數(shù)受限 局部static變量具有全局壽命和局部可見(jiàn)性 局部static變量具有可繼承性 extern不是變量定義,可擴(kuò)展外部變量作用域,變量存儲(chǔ)類型,函數(shù)不能嵌套定義,但可以嵌套調(diào)用,5.5、函數(shù)的嵌套調(diào)用與遞歸調(diào)用,嵌套調(diào)用 函數(shù)的嵌套調(diào)用是指在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。 C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù),例5-14 #include long f1(int p) int k; long r; long f2(int); k=p
34、*p; r=f2(k); retrun r; long f2(int q) long c=1; int i; for(i=1;i=q;i+) c=c*i; return c; ,main() int n,m; long s=0; scanf(%d,%d, ,函數(shù)的遞歸調(diào)用,從一個(gè)故事和圖片觀察到的,從前有座山,山里有個(gè)廟,廟里有個(gè)老和尚,老和尚在對(duì)小和尚講故事,故事講的是:“從前有座山,山里有個(gè)廟,廟里有個(gè)老和尚,老和尚在對(duì)小和尚講故事,故事講的是:從前有座山,山里有個(gè)廟 ”。,故事和圖片都是直接由這個(gè)故事和圖片本身組成的 。,觀察到的規(guī)律:,說(shuō)明:這里主要討論函數(shù)的直接遞歸調(diào)用,遞歸就是某一
35、事物直接或間接地由自己組成。如果一個(gè)函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用自身,則稱這個(gè)函數(shù)為遞歸函數(shù),稱這種調(diào)用方式為函數(shù)的遞歸調(diào)用。,遞歸的概念,int f(int x) int y; z=f(y); retrun z; ,int A(int n) x=B(n-1); ,int B(int m) y=A(m-1); ,直接遞歸,間接遞歸,遞歸函數(shù)的執(zhí)行,執(zhí)行過(guò)程(設(shè)n=3):,通過(guò)函數(shù)的遞歸調(diào)用計(jì)算n的階乘。,fac(int n) int t; if (n=1)|(n= =0) return 1; else t=n*fac(n-1); return t ; ,main() int m,y;
36、printf(“Enter m:”); scanf(%d, ,y=fac(3) 輸出y,fac(3),main( ),t=3*fac(2) 返回t的值,t=2*fac(1) 返回t的值,t=1 返回t的值,fac(2),fac(1),1,2,3,6,4,5,遞歸,回溯,參數(shù)傳遞,執(zhí)行,返回,遞歸函數(shù),遞歸公式,終止條件,遞歸函數(shù)的編寫,從要解決的問(wèn)題出發(fā),按倒推的方法來(lái)思考:如果要解決一個(gè)規(guī)模大的問(wèn)題,只要解決與之相似的小規(guī)模問(wèn)題就好了(尋找遞歸公式);直到倒推到一個(gè)顯而易見(jiàn)的已知問(wèn)題為止,使這個(gè)已知的問(wèn)題成立的條件就是遞歸終止條件。,long fact(int n) long x; if (
37、n=1) x=1; else x=fact(n-1)*n; return(x); ,n!=n*(n-1)! (n-1)!=(n-1)*(n-2)! 2!=2*1! 1!=1,fact(n)=n*fact(n-1) fac(n-1)=(n-1)*fac(n-2) fac(2)=2*fac(1) fac(1)=1,遞歸公式,終止條件,遞歸公式遞歸終止條件,5.7編譯預(yù)處理,作用:在編譯前對(duì)源程序進(jìn)行一些預(yù)加工,生成擴(kuò)展C源程序 具體功能: 宏替換 #define 文件包含 #include 條件編譯 #if-#else-#endif 預(yù)處理命令說(shuō)明: “#”開(kāi)頭 占單獨(dú)書(shū)寫行 尾部不加分號(hào) 可以出
38、現(xiàn)在程序中的任何位置 作用域是自出現(xiàn)點(diǎn)到程序正文結(jié)束,功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái) 一般形式: #include “文件名” 或 #include ,處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯, 直接按標(biāo)準(zhǔn)目錄搜索 “” 先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄 可指定路徑,1.文件包含,源文件(*.c) 頭文件(*.h),宏定義 數(shù)據(jù)結(jié)構(gòu)定義 函數(shù)說(shuō)明等,文件包含可嵌套,被包含文件內(nèi)容,文件包含,功能:對(duì)源程序中部分內(nèi)容指定編譯條件,條件滿足的部分才進(jìn)行編譯 條件編譯可有效地提高程序的可移植性 條件編譯命令一般形式:,2.條件編
39、譯,形式1: #ifdef #else #endif 含義:當(dāng)已經(jīng)被#define命令定義,則對(duì)進(jìn)行編譯,否則若有#else部分,則編譯。#else部分可以缺省。,形式2: #ifndef #else #endif 含義:當(dāng)未被#define命令定義,則對(duì)進(jìn)行編譯,否則若有#else部分,則編譯。#else部分可以缺省。,形式3: #if #else #endif 含義:當(dāng)值為非零,則對(duì)進(jìn)行編譯,否則若有#else部分,則編譯。#else部分可以缺省。,常量表達(dá)式,#define DEBUG 1 /*調(diào)試時(shí)設(shè)置為1,打印信息*/ main() /*條件編譯*/ #if DEBUG printf(“x=%d , y=%d , z=%dn”,x,y,z); #endif ,例:調(diào)試程序輸出信息,調(diào)試完成不再輸出信息。,不帶參數(shù)宏定義 一般形式: #define 功能:把程序中該宏定義之后的所有指定標(biāo)識(shí)符(宏名)用字符串(宏體)替換,宏展開(kāi):預(yù)編譯時(shí),用宏體替換
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 兒科學(xué)臨床試題庫(kù)及答案2025年新版本
- 人民醫(yī)護(hù)士值班交接班制度及流程
- 2025年醫(yī)院藥劑科工作計(jì)劃報(bào)告
- 公司財(cái)務(wù)會(huì)計(jì)崗位工作總結(jié)(一)
- 膀胱破裂應(yīng)急預(yù)案腳本
- 2025年數(shù)字化轉(zhuǎn)型與企業(yè)管理創(chuàng)新考試題及答案
- 2025年消防安全教育培訓(xùn)試題及答案
- 2025年土地登記代理人之地籍調(diào)查題庫(kù)及參考答案(典型題)
- 建設(shè)工程施工合同糾紛要素式起訴狀模板填寫步驟超詳細(xì)
- 建設(shè)工程施工合同糾紛要素式起訴狀模板法律依據(jù)充分
- 2025年律師事務(wù)所黨支部書(shū)記年終述職報(bào)告
- 中國(guó)腦小血管病診治指南2025
- 中國(guó)零排放貨運(yùn)走廊創(chuàng)新實(shí)踐經(jīng)驗(yàn)、挑戰(zhàn)與建議
- 宋代插花課件
- 2025年度耳鼻喉科工作總結(jié)及2026年工作計(jì)劃
- 2024年執(zhí)業(yè)藥師《藥學(xué)專業(yè)知識(shí)(一)》試題及答案
- 2025寧夏黃河農(nóng)村商業(yè)銀行科技人員社會(huì)招聘考試筆試參考題庫(kù)及答案解析
- 統(tǒng)編版語(yǔ)文一年級(jí)上冊(cè)無(wú)紙化考評(píng)-趣味樂(lè)考 玩轉(zhuǎn)語(yǔ)文 課件
- 2025年新水利安全員b證考試試題及答案
- 高壓氧進(jìn)修課件
- 2025無(wú)人機(jī)物流配送網(wǎng)絡(luò)建設(shè)與運(yùn)營(yíng)效率提升研究報(bào)告
評(píng)論
0/150
提交評(píng)論