




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章函數信息工程學院主講人:XXX內容提要41函數的定義12函數的參數和函數的返回值423函數的調用42函數的嵌套調用425函數的遞歸調用24446.1概述函數是完成特定功能的程序段。一個C程序有且只有一個主函數main(),C程序執行的入口是main()函數。在C語言中,不允許嵌套定義函數,所有函數的定義都是平行的,但允許函數嵌套調用。main()函數可以調用其它函數,其它函數不允許調用main()函數。函數可分為:標準庫函數和自定義函數。對于標準庫函數我們主要要知道有哪些庫函數,能完成什么功能以及如何調用,這可以通過查閱相關手冊來實現。所以后續課程我們主要講解自定義函數的定義與使用。6.2函數的定義6.2.1無參函數的定義無參函數定義的一般形式:數據類型標識符函數名(){聲名部分語句部分}無參函數就是()里面是空的,函數調用時不用傳遞參數的函數6.2函數的定義【例6.1】無參函數的簡單例子#include<stdio.h>voidmain(){voidstar();voidmessage();star();message();star();}voidstar(){printf(“**********\n”);}voidmessage(){printf(“Howdoyoudo!\n”);}運行結果:無參函數舉例6.2函數的定義6.2.2有參函數的定義有參函數定義的一般形式:數據類型標識符函數名(類型名型式參數1,類型名型式參數2,......){聲名部分語句部分}有參函數就是函數調用時需要傳遞參數的函數,如下:intsum(intx,inty)//函數頭{intz;z=x+y;//大括號部分叫函數體return(z);}6.2函數的定義6.2.3空函數的定義空函數定義的一般形式:數據類型標識符函數名(){}例如:voiddummy(){}定義的函數dummy()是一個空函數。調用空函數時,由于函數體是空的,不執行任何操作,好像沒有什么實際作用。但是,早期在模塊兒化程序設計中,空函數十分有用,它可以實現擴充程序功能(函數)模塊的作用。在程序編寫前期,可以寫上以備將來擴充使用的空函數,這個空函數只是暫時沒有函數體,等以后需要時,再編寫函數體,來實現特定的功能。6.3函數的參數和函數的返回值6.3.1形式參數和實際參數在調用函數時,大多數情況下,主調函數和被調函數之間有數據傳遞,這類函數就是有參函數。在定義有參函數時,函數名后面括號里的變量名稱為“形式參數”(簡稱“形參”),在主調函數中調用該函數時,函數名后面括號里的參數(可以是表達式)稱為“實際參數”(簡稱“實參”)。6.3函數的參數和函數的返回值【例6.2】函數調用時的數據傳遞。#include<stdio.h>voidmain(){intmax(intx,inty);inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d\n”,c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);運行結果:函數調用時的數據傳遞6.3函數的參數和函數的返回值6.3.2函數的返回值通常,希望通過函數調用使主調函數能得到一個確定的值,這個值就是函數的返回值,也稱為函數值。函數值也是一種數據,它具有數據的屬性:值和類型。函數值的類型在函數定義時指定,函數的返回值通過return語句來獲得。return語句的一般形式:return(表達式);或return表達式;上面的兩種return語句通用。return語句的功能使程序控制流程返回到主調函數,同時將表達式的值返回到主調函數。當僅僅是將程序控制流程返回到主調函數時,return語句可以寫為:return;6.3函數的參數和函數的返回值函數返回值說明如下:(1)一個函數可以有多個return語句,當執行到某一個return語句時,將return語句中表達式的值返回調用函數。(2)若函數體內沒有return語句,則一直執行到函數末尾,然后返回主調函數,這時也會返回一個不確定的值。(3)若不要求函數有返回值,可以將函數定義為void。例如將例6.4改成如下程序,觀察程運行結果。(4)return語句中表達式的類型如果與函數值的類型不一致,則以函數值的類型為準。6.4函數的調用6.4.1函數調用的一般形式函數調用的一般形式:函數名(實參列表)如果調用的是無參函數,可以沒有“實參列表”,但括號不能省略。如果有多個實參,則各參數用逗號隔開。實參與形參的個數要相等,類型應相互匹配,按順序一一傳遞數據。需要說明的是,實參列表如果包含多個實參,對實參求值的順序不是確定的,有的系統按自右向左順序求實參的值,有的系統則按自左至右的順序求實參的值。6.4函數的調用6.4.2函數調用的方式按函數在程序中的位置來分,函數調用可以有以下3種方式。(1)函數語句例如:fun(a,a+2);(2)函數表達式例如:c=2*min(a,b);函數min是表達式的一部分,它的值乘以2再把所得到的值賦給c。(3)函數參數函數調用作為一個函數的實參。例如:m=min(a,min(b,c));其中min(b,c)是一次函數調用,它的值作為min另一次調用的實參。其中m的值是a,b,c三者中最小的值。6.4函數的調用6.4.2函數調用的方式按函數在程序中的位置來分,函數調用可以有以下3種方式。(1)函數語句例如:fun(a,a+2);(2)函數表達式例如:c=2*min(a,b);函數min是表達式的一部分,它的值乘以2再把所得到的值賦給c。(3)函數參數函數調用作為一個函數的實參。例如:m=min(a,min(b,c));其中min(b,c)是一次函數調用,它的值作為min另一次調用的實參。其中m的值是a,b,c三者中最小的值。6.4函數的調用6.4.3函數的聲明當一個函數調用另一函數時,被調函數必須是存在的,而且被調函數的編譯順序應該在主調函數之前。否則需要在主調函數中的調用語句之前,對被調函數進行聲明(或稱為說明)。函數聲明的作用是把函數類型、函數名和函數參數的個數等信息通知編譯系統,當遇到函數調用時,編譯系統能檢查函數調用是否合法并正確識別函數。函數定義是編寫不存在的函數,函數定義只能有一次,函數聲名是對存在的函數聲明,函數聲明可以有多次。函數聲明一般有兩種形式:形式一:函數類型函數名([參數類型1,參數類型2,...,參數類型n]);形式二:函數類型函數名([參數類型1參數名1,參數類型2參數名2,...,參數類型n參數名n]);6.5函數的嵌套調用函數不允許嵌套定義,但可以嵌套調用,也就是說在調用一個函數的過程中,被調函數還可以再調用另外一個函數,如圖6-11所示。6.5函數的嵌套調用#include<stdio.h>voidp();voidq();voidmain(){printf("start\n");p();printf("end\n");}voidp(){printf("11111\n");q();printf("*****\n");}voidq(){printf("$$$$$\n");}運行結果:嵌套調用舉例6.5函數的嵌套調用【例6.9】調用自定義階乘函數,求1!+2!+3!+...+n!#include<stdio.h>voidmain(){inti,n;longsum=0;longfac(intn);//被調用函數在main函數后面,需要先聲明printf(“Entern:”);scanf(“%d”,&n);for(i=1;i<=n;i++)sum=sum+fac(i);printf(“%ld\n”,sum);}longfac(intn){longf=1;if(n<0)return0;for(;n>0;n--)f*=n;returnf;}運行結果:嵌套調用舉例6.6函數的遞歸調用在C語言中,一個函數除了可以調用其它函數外,還可以調用自已。這種在程序執行的過程中函數直接或間接的調用自身,稱為函數的遞歸調用。例如:intf1(intx){inty,z;z=f1(y);return(2*z);}在調用函數f1的過程中,又要調用f1函數,這就是直接調用本函數(需要注意死循環)。6.6函數的遞歸調用直接遞歸調用和間接遞歸調用6.6函數的遞歸調用【例6.11】用遞歸方法求n!#include<stdio.h>voidmain(){intfac(intn);intn;inty;printf("請輸入一個整數:");scanf("%d",&n);y=fac(n);printf("%d!=%d\n",n,y);}intfac(intn){floatf;if(n<0){printf("n<0,dateerror");}elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}運行結果:遞歸調用舉例6.7數組作為函數的參數數組也可以作為函數的參數,數組元素作為函數的參數,它的用法與變量相同。此外,數組名也可以作為函數的參數,它傳遞的是數組的首地址。1、數組元素作為函數的參數實參可以是表達式,數組元素又可以是表達式的組成部分,因此,數組元素可以作為函數的參數,同變量作為函數的參數一樣,是單向值傳遞的方式。2、數組名作為函數的參數在C語言中,可以用數組名作為函數的參數,此時實參與形參可以都是數組名。由于數組名代表的是數組的首地址,在實際參數傳遞中,實參數組的首地址傳遞給形參數組名,從而形參數組名的首地址就是實參數組的首地址,系統并沒有為形參數組開辟新的存儲單元,而是和實參的數組共用存儲單元。因此,被調用函數中的形參數組各元素的值就是實參數組對應的各元素的值,在被調函數中如果改變了形參數組元素的值,實際上也就改變了實參數組元素對應的值。6.7數組作為函數的參數【例6.13】有一個一維數組score,該數組內放有8個學生的成績,求平均成績。程序如下:#include<stdio.h>voidmain(){floataverage(floatarray[8]);floatscore[8],ave;inti;printf(“Input8scores:\n”);for(i=0;i<8;i++)scanf(“%f”,&score[i]);ave=average(score);printf(“Averagescoreis%4.1f\n”,ave);}floataverage(floatarray[8]){inti;floatave,sum=0;for(i=0;i<8;i++)sum+=array[i];ave=sum/8;return(ave);}運行結果:數組名作為函數的參數6.7數組作為函數的參數【例6.14】有一個3×4矩陣,求其中的最大元素。程序如下:#include<stdio.h>voidmain(){intmaxval(intarray[3][4]);inta[3][4]={{1,-3,10,12},{2,120,15,19},{6,-6,22,32}};printf("maxvalueis%d\n",maxval(a));}intmaxval(intarray[3][4]){inti,j,max;max=array[0][0];for(i=0;i<3;i++){for(j=0;j<4;j++){if(array[i][j]>max)max=array[i][j];}}return(max);}運行結果:數組名作為函數的參數6.8函數中變量的作用域6.8.1局部變量在一個函數內部定義的變量是內部變量,它的使用范圍只在本函數內,在本函數之外就不能使用這些變量了,這種變量稱為“局部變量”。例如:6.8.2全局變量如果變量的定義在所有函數的外部,則稱該變量為全局變量。它可以定義在源文件的開頭,也可以定義在兩個函數的中間或者源文件的尾部。它的作用域是從它
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 考試過程中情緒管理的重要性與實踐試題及答案
- 軟件開發合作協議
- 項目管理考試的前瞻性分析試題及答案
- 2024新教材高中政治 第四課 只有堅持和發展中國特色社會主義才能實現中華民族偉大復興 4.3 習近平新時代中國特色社會主義思想教學設計 部編版必修1
- 2025年金融理財師考試倫理決策思維訓練及試題答案
- 提高項目管理考試自信的有效途徑與試題答案
- 財務報表分析與特許金融分析師考試試題及答案
- 2025年金融市場法規和監管試題及答案
- 年度工作重點的明確與落實計劃
- 促進幼兒思維發展的教研方法計劃
- 山東省高中名校2025屆高三4月校際聯合檢測大聯考生物試題及答案
- 2025年中鐵快運股份有限公司招聘(98人)筆試參考題庫附帶答案詳解
- 2025年武漢數學四調試題及答案
- 職業病防護設施與個體防護用品的使用和維護
- 綠化養護服務投標方案(技術標)
- 2024年鄭州信息科技職業學院單招職業適應性測試題庫學生專用
- 中國紡織文化智慧樹知到期末考試答案2024年
- TB-T 3356-2021鐵路隧道錨桿-PDF解密
- (正式版)HGT 6313-2024 化工園區智慧化評價導則
- 扶梯施工過程記錄
- 藥物動力學常見參數及計算方法PK
評論
0/150
提交評論