![山西財經大學華商學院《C語言程序設計》課件第7章函數(shù)的課件_第1頁](http://file4.renrendoc.com/view/24ccf498a06d958871c72e9623ddbb59/24ccf498a06d958871c72e9623ddbb591.gif)
![山西財經大學華商學院《C語言程序設計》課件第7章函數(shù)的課件_第2頁](http://file4.renrendoc.com/view/24ccf498a06d958871c72e9623ddbb59/24ccf498a06d958871c72e9623ddbb592.gif)
![山西財經大學華商學院《C語言程序設計》課件第7章函數(shù)的課件_第3頁](http://file4.renrendoc.com/view/24ccf498a06d958871c72e9623ddbb59/24ccf498a06d958871c72e9623ddbb593.gif)
![山西財經大學華商學院《C語言程序設計》課件第7章函數(shù)的課件_第4頁](http://file4.renrendoc.com/view/24ccf498a06d958871c72e9623ddbb59/24ccf498a06d958871c72e9623ddbb594.gif)
![山西財經大學華商學院《C語言程序設計》課件第7章函數(shù)的課件_第5頁](http://file4.renrendoc.com/view/24ccf498a06d958871c72e9623ddbb59/24ccf498a06d958871c72e9623ddbb595.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第7章 函數(shù)山西財經大學華商學院C語言程序設計函數(shù)概述函數(shù)定義的一般形式函數(shù)的調用、參數(shù)和返回值局部變量和全局變量變量的存儲類型內部函數(shù)和外部函數(shù)概述C程序源程序文件n函數(shù)1函數(shù)m 源程序文件1函數(shù)1函數(shù)nC語言用函數(shù)實現(xiàn)程序模塊化一個源程序文件由一個或多個函數(shù)組成;一個程序由一個或多個源程序文件組成C程序的執(zhí)行從main函數(shù)開始,并回到main函數(shù)結束函數(shù)之間可以相互調用,或調用自身不能調用main函數(shù)函數(shù)之間相互獨立,不存在從屬關系【例】求一個整數(shù)的立方int cube (int x) /* 函數(shù)定義 */ return (x * x * x); main( ) int f, a; pri
2、ntf(nEnter an integer number:); scanf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序運行情況如下:Enter an integer number:22 * 2 * 2 = 8函數(shù)調用程序的執(zhí)行總是從main函數(shù)開始 函數(shù)的種類從函數(shù)定義形式分: 有參函數(shù):int cube (int x) 無參函數(shù):如 getchar( )從使用的角度看: 標準函數(shù)(庫函數(shù)) 用戶自定義函數(shù)。7.2.1 函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型 函數(shù)名(形式參數(shù)表列) 聲明部分 語句返回類型、參數(shù)
3、、函數(shù)體內容都可沒有dummy()/* does nothing & returns nothing */關于“聲明部分”指變量、函數(shù)的聲明函數(shù)定義形式的說明關于“函數(shù)類型”指函數(shù)返回值的類型若省略此項,則認為返回類型是int若無返回值,則定義返回類型為void例如:求兩個數(shù)的最大值。 int max(int x,int y) int z; z = x y ? x : y; return( z );類型省略時默認為int類型int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;或int max
4、(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );形參也可以這樣定義如下定義都是錯誤的 形參定義格式:類型 形參名, 類型 形參名, .int max(int x,int y) 函數(shù)名(實參表列)在C語言中,把函數(shù)調用也作為一個表達式。因此凡是表達式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調用。例如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);7.2.2 函數(shù)的調用函數(shù)調用的一般形式:int sum ( ) int i,t=0; for (i=1; i=1
5、00; i+) t+=i; return (t);main( ) int s; s=sum ( ); printf(%dn, s);程序輸出結果:5050int sum ( int x ) int i,t=0; for (i=1; i=x; i+) t+=i; return (t);main( ) int s; s=sum (100); printf(%dn, s); 【例】求1100的累加和。思考:兩個程序有何不同程序輸出結果:5050?void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( )
6、int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);7.2.3 函數(shù)參數(shù)與函數(shù)的返回值1函數(shù)的形式參數(shù)與實際參數(shù)程序輸出結果:x=20,y=10a=10,b=20形式參數(shù)(形參)實際參數(shù)(實參)【例】編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。單向值傳遞有關形參和實參的說明: 說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉換函數(shù)調用轉換形參在函數(shù)被調用前不占內存;函數(shù)調用時為形參分配內存;調用結束,內存釋放“單向值傳遞”return語句形式形式
7、一:return (表達式);形式二:return 表達式;功能函數(shù)返回語句結束函數(shù)調用如果需要,還可以帶回函數(shù)返回值函數(shù)的返回值說明函數(shù)返回值的類型在函數(shù)定義中指定函數(shù)返回值通過函數(shù)中的return語句獲得return語句后的表達式類型,與函數(shù)返回值類型不同時,自動做按函數(shù)類型轉換函數(shù)需要返回值時,若缺少return語句,或return語句未帶返回值,則返回一個不確定值為明確表示不帶回值,用void定義無類型。系統(tǒng)保證不使函數(shù)帶回任何值?!纠坑嬎悴⑤敵鰣A的面積。s(int r) return 3.14*r*r;main( ) int r,area; scanf(%d,&r); printf
8、(%dn,s(r);自動轉換為int型 程序運行情況如下:212函數(shù)聲明的一般形式如下:類型名 函數(shù)名(類型1 形參1,類型2 形參2,類型n 形參n);或類型名 函數(shù)名(類型1,類型2,類型n);或類型名 函數(shù)名();函數(shù)聲明是以語句形式出現(xiàn)的,因此其后有語句結束標記“;”若函數(shù)定義放在主調函數(shù)之前,遵循先定義后調用原則,函數(shù)聲明可以省略。庫函數(shù)的聲明包括在頭文件(*.h)里,不需聲明對被調函數(shù)的聲明和函數(shù)原型允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調函數(shù)之后定義,則應在主調函數(shù)中或主調函數(shù)之前對被調函數(shù)進行聲明。void swap(int x
9、, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x,int y) 函數(shù)聲明被調函數(shù)出現(xiàn)在主調函數(shù)之前,不必函數(shù)說明int型函數(shù)可不作函數(shù)說明 例 函數(shù)聲明舉例#include foat max(float x, float y);main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);foat max(float x, float y) float z; z=xy?x:y; return(z);在函數(shù)外面做了聲明, 所有調用函數(shù)不必再
10、聲明main() float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);float add();一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內存中的起始地址。 例如:數(shù)組a在內存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù),不能把它看成是整型或其他類型數(shù)據(jù)。實參是數(shù)組名,形參也應定義為數(shù)組
11、形式,形參數(shù)組的長度可以省略,但 不能省,否則就不是數(shù)組形式了。void sort(int b ,int n); void printarr(int b ); main( ) int a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10); printf(After sort:n); printarr(a);void printarr(int b10) int i; for (i=0; i10; i+) printf(%5d,bi); printf(n);void sort(int
12、 b , int n) int i,j,t; for (i=1; in; i+) for (j=0; jbj+1) t=bj;bj=bj+1;bj+1=t; 用冒泡法將10個整數(shù)排序 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后圖8.3 調用sort函數(shù)2000b形
13、參 b 實際是一個可以存放地址的變量a:2000實參賦給形參首地址: 2000首地址: 2000函數(shù)的遞歸調用1遞歸的基本概念遞歸調用:一個函數(shù)直接或間接地調用了它本身,就稱為函數(shù)的遞歸調用。遞歸函數(shù):在函數(shù)體內調用該函數(shù)本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;例如:直接調用sub函數(shù)本身2遞歸函數(shù)的執(zhí)行過程【例】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結束條件:當n=1或n=0時,n!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (
14、n1)遞歸調用過程 回 推main( ) fact(4) fact(3) fact(2) fact(1) y=fact(4); f=4*fact(3); f=3*fact(2); f=2*fact(1); f=1; return 24 return 6 return 2 return 1 遞 推 3編制遞歸函數(shù)的方法對于數(shù)值型問題,首先要找出解題的數(shù)學公式,這個公式必須是遞歸定義的,且所處理的對象要有規(guī)律地遞增或遞減,然后確定遞歸結束條件?!纠烤幰贿f歸函數(shù)求xn 。思路:首先把xn轉化成遞歸定義的公式xn =1 (n=0)x xn - 1 (n0)再找出遞歸結束條件:當n=0時,xn=1。程
15、序如下:long xn(int x,int n) long f=0; if (n0) printf(n0,data error!n); else if (n=0) f=1; else f=x*xn(x,n-1); return (f);main( ) int n,x; long y; scanf(%d,%d,&x,&n); y=xn(x,n); printf(%ldn,y);程序運行情況如下:2,101024局部變量和全局變量在一個函數(shù)內部定義的變量稱為局部變量。 局部變量的有效范圍是所在定義的函數(shù)內。float f1(int a)int b , c; char f2(int x, int y
16、) int b ,c ; a,b,c的有效范圍x , y ,b,c的有效范圍main()int m,n; m , n的有效范圍說明:1、主函數(shù)中定義的變量也屬于局部變量。2、不同函數(shù)中可以使用相同名字的變量,在內存中占有不同的存儲單元。例如上面的函數(shù) f1 和 f2中均使用局部變量 b 和c 。3、形參也是局部變量。4、在一個函數(shù)內部,也可以在復合語句中定義變量,這些變量只能在本復合語句中有效,這種復合語句稱為“分程序”或“程序塊”。例如: main() int a ,b ; . int c; c=a+b; . . C的有效范圍a ,b的有效范圍例 不同函數(shù)中同名變量main() int a,
17、b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例 不同函數(shù)中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結果:main:a=3,b=4s
18、ub:a=6,b=7main:a=3,b=4地址地址3467函數(shù)main中的變量a,b的存儲單元20002050abba31003500函數(shù)sub中的變量a,b的存儲單元地址地址二、全局變量 定義在函數(shù)外部的變量稱為全局變量,全局變量可以為本文件中其它函數(shù)所使用。它的有效范圍為從定義變量的位置開始到本源文件結束。int p=1 ,q=5;float f1(int a)int b, c ; .char c1 ,c2 ;char f2(int x,int y)int i ,j ; . main() int m ,n ; 全局變量p、q有效范圍全局變量c1,c2有效范圍變量 p、q、c1、c2都是全
19、局變量,但是它們的作用范圍是不同的。全局變量也稱為外部變量,通常定義中全局變量的變量名的第一個字母大寫,便于識別。float Max,Min;float average(float array, int n) int i; float sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayib?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);運行結果:max=8如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內,外部變量被“屏蔽”,即不
20、起作用。變量的存儲類型 一、動態(tài)存儲方式與靜態(tài)存儲方式每一個變量從它的作用域角度來分:全局變量和局部變量。下面我們考慮變量在內存中的存儲情況:C語言把用戶使用的內存分為三部分(如圖):即1、程序區(qū)2、靜態(tài)存儲區(qū)3、動態(tài)存儲區(qū)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶區(qū)內存變量的存儲區(qū)靜態(tài)區(qū)中變量是源程序編譯時分配單元的,程序執(zhí)行完畢才釋放動態(tài)區(qū)中變量是程序執(zhí)行過程中分配單元的,程序執(zhí)行過程中釋放二、變量的存儲類別從全局變量、局部變量出發(fā)來考慮。C語言中規(guī)定所有的全局變量都放在靜態(tài)存儲區(qū)中 對局部變量分以下幾種情況來處理: 局部變量: 1、auto 變量 (自動變量)2、static 變量 (靜態(tài)局部變量)
21、3、register 變量(寄存器變量)1、auto 變量 (自動變量)所有未聲明為static存儲類別的函數(shù)中的局部變量,就是auto變量。auto類別變量是動態(tài)的分配存儲空間,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。 自動變量使用關鍵字auto(可以省略)作存儲類別聲明。例如: int f(int a) int f(int a) auto int b , c=3; int b ,c=3; a,b,c都是auto類型變量,這類變量是在調用該函數(shù)時系統(tǒng)會給它們分配存儲空間,在函數(shù)調用結束時就釋放這些存儲空間。因此稱為自動變量。2、用static聲明局部變量 (靜態(tài)局部變量) 用static聲明的局部變量稱為靜
22、態(tài)局部變量,特點是變量存儲在靜態(tài)存儲區(qū)中,函數(shù)編譯時賦初值,函數(shù)調用結束后不釋放存儲單元,其值作為下次調用的初始值。靜態(tài)局部變量用關鍵字static聲明。例如: f(int a) main() auto int b=0; int a=2, i ; static int c=3; for(i=0;i3;i+) b=b+1; printf(“%d”,f(a); c=c+1; return(a+b+c); 運行結果: 7 8 93、register 變量(寄存器變量)只有函數(shù)內定義的變量或形參可以定義為寄存器變量。凡是聲明為register類別的變量 ,不是保存在內存中,而是保存在CPU中的寄存器中
23、。聲明方式如下: int fac( int n) main() register int i, f=1; int i; for(i=1;i=n;i+) for(i=1; iy?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;extern a,b;int max() int z; z=ab?a:b; return(z);main() printf(max=%d,max();int a=13,b=-8;A、變量的存儲方式小節(jié)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、靜態(tài)局部變量 形參變量 局部動態(tài)變量(
24、auto) 全局變量(定義在函數(shù)外部): 有效范圍是從定義處開始到文件結束。局部變量(定義在函數(shù)內部): 有效范圍是在所定義的函數(shù)內。B、變量的作用范圍小節(jié)C、變量的聲明方式小節(jié)auto 類型符 變量名 是自動變量(局部變量)static 類型符 變量名 register 類型符 變量名 聲明為寄存器局部變量 extern 變量名 聲明外部變量,擴展作用域聲明靜態(tài)的局部變量聲明靜態(tài)的外部變量(只限于本文件使用)D、變量存在的時間小節(jié)全局變量(外部變量):在程序的整個運行期間。靜態(tài)局部變量(用static聲明的局部變量): 在程序的整個運行期間。自動變量(未用static聲明的局部變量): 從函
25、數(shù)調用到該函數(shù)結束。 寄存器變量:屬于自動變量。靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調用開始至結束生存期編譯時賦初值,只賦一次每次函數(shù)調用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復合語句內本文件其它文件局部變量默認為auto型局部static變量具有可繼承性extern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別變量存儲類型例 auto 變量的作用域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);運行結果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例 局部靜態(tài)變量值具有可繼承性main() void increment(v
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《家居裝飾物流配送合同》
- 親子樂園主題裝修設計合同
- IT項目規(guī)劃與實施指南
- 企業(yè)法律合規(guī)風險防范指南
- 淘寶代理合同協(xié)議書
- 三農村特色產業(yè)培育手冊
- 股份制企業(yè)的合作與管理文書
- 房地產開發(fā)合同標準協(xié)議
- 醫(yī)療設備智能制造與管理平臺開發(fā)
- 企業(yè)人力資源數(shù)字化管理與服務支持平臺方案設計
- 2023年天津市文化和旅游局直屬事業(yè)單位招聘考試真題及答案
- 《中國慢性阻塞性肺疾病基層診療與管理指南(2024年)》解讀
- 2023年機動車檢測站質量手冊(依據(jù)2023年版評審準則和補充要求編制)
- 《研學旅行課程設計》課件-研學課程設計計劃
- 電力系統(tǒng)分析(郝亮亮)
- 改善護理服務行動計劃方案
- 《手語基礎學習》課件
- 部編(統(tǒng)編)版語文+四下第四單元教材解讀課件
- 建筑材料包銷協(xié)議書
- 常州市2023-2024學年八年級上學期期末地理試卷(含答案解析)
- 道路安全教育課件
評論
0/150
提交評論