




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第5章 函數(shù)學(xué)習(xí)目標(biāo)與要求1、掌握C語言函數(shù)的定義2、掌握C程序調(diào)用函數(shù)的方法3、了解遞歸函數(shù)的用法4、掌握宏定義和文件包含的使用方法 本章要點函數(shù)概要 函數(shù)的定義 函數(shù)的參數(shù)和函數(shù)的值 函數(shù)的調(diào)用 函數(shù)的嵌套調(diào)用 函數(shù)的遞歸調(diào)用數(shù)組作為函數(shù)參數(shù) 局部變量和全局變量 變量的存儲類別 預(yù)處理命令5.1 函數(shù)概要 一個C程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。一個C程序只能有一個也必須有一個main函數(shù),而子函數(shù)的數(shù)目實際上是不限的。 mainabcdefghhieg示意圖函數(shù)的分類:按用戶使用分類:(1)標(biāo)準(zhǔn)
2、(2)自定義函數(shù)按函數(shù)形式分類:(1)無參函數(shù) (2)有參函數(shù)5.1 函數(shù)概要 5.2 函數(shù)的定義無參函數(shù)的定義形式類型標(biāo)識符 函數(shù)名( ) 聲明部分語句有參函數(shù)定義的形式類型標(biāo)識符 函數(shù)名(形式參數(shù)表列) 聲明部分 語句空函數(shù)dummy()int max(int x,int y)int z; z=xy?x:y;return(z);5.3 函數(shù)參數(shù)和函數(shù)的值形式參數(shù)和實際參數(shù)形參:在定義函數(shù)時,函數(shù)名后面括號中的變量稱為形式參數(shù)實參:在調(diào)用函數(shù)時,函數(shù)名后面括號中的參數(shù)(可以是表達(dá)式)稱為實際參數(shù)。說明:例5-1函數(shù)的返回值 返回值的方式:通過return語句返回??梢杂幸粭l返回語句,也可以有
3、多條返回語句,也可以沒有返回語句。 return 語句的一般形式為:return (表達(dá)式) 返回值的類型一般應(yīng)和函數(shù)類型一致,如不一致,則以函數(shù)型為準(zhǔn)。即函數(shù)類型決定返回值的類型。 為了明確表示不帶回值,可以用void定義無類型。5.3 函數(shù)參數(shù)和函數(shù)的值例5-2main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is %d, c);int max(int x, int y)int z;x=x+2;y=y+4;z=xy?x:y;return(z);程序運行情況輸入:7,8結(jié)果:Max is 12例5-1 調(diào)用函數(shù)時的數(shù)據(jù)傳遞調(diào)用結(jié)
4、束后調(diào)用時b8y877axb8y1297axint max(float x, float y)float z; /* z為實型變量*/z=xy?x:y;return(z);main()float a,b; int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(Max is %d, c);程序運行情況:1.5,2.5Max is 2例5-2返回值類型與函數(shù)類型不同 5.4 函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式 函數(shù)名(實參表列);函數(shù)調(diào)用的方式 1)函數(shù)語句 如:printstar(); 2)函數(shù)表達(dá)式 如: c=2*max(a,b); 3)函數(shù)參數(shù) 如: m=max(a
5、,max(b,c);例5-3例5-4對被調(diào)用函數(shù)的聲明和函數(shù)原型 函數(shù)聲明是對所用到的函數(shù)的特征進(jìn)行必要的聲明,編譯系統(tǒng)以函數(shù)聲明中給出的信息為依據(jù),對調(diào)用實際參數(shù)進(jìn)行控制,以保證調(diào)用表達(dá)式與函數(shù)之間的參數(shù)正確傳遞。函數(shù)聲明的格式:類型標(biāo)識符 函數(shù)名(類型標(biāo)識符 形參, 類型標(biāo)識符 形參,);在下列情況下可以缺省函數(shù)聲明;(1)被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前(2)函數(shù)返回值為int類型(3)在所有函數(shù)定義之前,在函數(shù)的外部已做了函數(shù)聲明。 5.4 函數(shù)的調(diào)用int f(int a,int b) /*函數(shù)定義*/int c;if(ab) c=1;else if(a=b) c=0;else c=-1;
6、return(c);main()int i=3,p,j=2;p=f(i,+j); /*函數(shù)調(diào)用*/printf(%dn,p);程序運行結(jié)果:0例 5-3函數(shù)調(diào)用和函數(shù)定義+j3b333iamain()float add(float x,float y);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);程序運行情況:輸入3.6, 6.5結(jié)果:sum is 10.100000例 5-4 對被調(diào)用的函數(shù)作聲明5.5 函數(shù)的嵌套
7、調(diào)用C語言不能嵌套定義,即在定義一個函數(shù)時,其函數(shù)體內(nèi)不能包含另一個函數(shù)的定義。但可以嵌套調(diào)用函數(shù),在調(diào)用一個函數(shù)的過程中又調(diào)用另一個函數(shù)。例5-5例5-5 函數(shù)的嵌套調(diào)用。main( ) int n=3; printf (%dn,sub1(n); int sub1(int n) int i,a=0; for (i=n; i0; i-) a+=sub2(i); return a ; int sub2(int n) return n+1; 程序輸出結(jié)果:9 5.6 函數(shù)的遞歸調(diào)用遞歸的基本概念遞歸調(diào)用:在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體
8、內(nèi)調(diào)用該函數(shù)本身。例如:直接調(diào)用sub函數(shù)本身int sub(int x) int y,z; if( ) z=sub(y); else return ;數(shù)值型問題遞歸函數(shù)的編程方法對于數(shù)值型問題,首先要找出解題的數(shù)學(xué)公式,這個公式必須是遞歸定義的,且所處理的對象要有規(guī)律地遞增或遞減,然后確定遞歸結(jié)束條件。例5-6 5.6 函數(shù)的遞歸調(diào)用例5-6 編一遞歸函數(shù)求n! 思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (n1)遞歸結(jié)束條件:當(dāng)n=1或n=0時,n!=1。動畫演示f (4)4*f (3)3
9、*f (2)2*f (1)2*13*2*14*3*2*124f (4)的執(zhí)行過程程序示例有些問題不能直接用數(shù)學(xué)公式求解,非數(shù)值問題比數(shù)值問題更難找出遞歸算法,它不能用一個遞歸公式表示。首先要把問題由繁化簡,由大化小,而某個小問題的解法與原問題解法相同,并且越來越簡單直到有確定的解。例5-7 5.6 函數(shù)的遞歸調(diào)用非數(shù)值型問題遞歸函數(shù)的編程方法例5-7 編制一遞歸函數(shù),將一個十進(jìn)制正整數(shù)(如:15613)轉(zhuǎn)換成八進(jìn)制數(shù)形式輸出。思路:十進(jìn)制整數(shù)轉(zhuǎn)換成八進(jìn)制整數(shù)的方法是除8逆向取余。 余數(shù): 商:15613%8=5 15613/8=19511951%8=7 1951/8=243243%8=3243
10、/8=3030%8=630/8=33%8=33/8=0結(jié)果:36375 該題實際上是要把一個十進(jìn)制數(shù)除以8得到的余數(shù)逆向輸出。就是先得到的余數(shù)后輸出,最后得到的余數(shù)最先輸出。我們先由大化?。呵蟀诉M(jìn)制數(shù)變成求一系列余數(shù)的問題。求第一個余數(shù)是將15613除以8取余,因為先得到的余數(shù)后輸出,所以把這個余數(shù)存在一個變量m中,接下去求下一個余數(shù)。和求第一個余數(shù)的方法相同,只是被除數(shù)變成了15613除以8的整數(shù)商1951。因此,這是一個遞歸調(diào)用的問題。定義變量m存放余數(shù),x存放被除數(shù)。 先求出余數(shù)m:m=x%8; 求x除以8取余后的整數(shù)商:x=x/8; 如果x不等于0,遞歸調(diào)用該函數(shù),否則執(zhí)行。 輸出余數(shù)
11、m。 返回調(diào)用點。遞歸算法描述如下:例5-7 編制一遞歸函數(shù),將一個十進(jìn)制正整數(shù)(如:15613)轉(zhuǎn)換成八進(jìn)制數(shù)形式輸出。#include stdio.hvoid dtoo(int x) int m; m=x%8; x=x/8; if (x!=0) dtoo(x); printf(%d,m);例5-7 編制一遞歸函數(shù),將一個十進(jìn)制正整數(shù)(如:15613)轉(zhuǎn)換成八進(jìn)制數(shù)形式輸出。main( ) int n; scanf(%d,&n); printf(%d=(,n); dtoo(n); printf()8n);程序運行情況:1561315613=(36375)85.7 數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函
12、數(shù)實參數(shù)組名作函數(shù)參數(shù)用多維數(shù)組名作函數(shù)參數(shù)例5-8例5-9說明例5-11例5-10有兩個數(shù)組a,b,各有10個元素,將它們對應(yīng)地逐個相比(即a0與b0比)。如果a數(shù)組中的元素大于b 數(shù)組中的相應(yīng)元素的數(shù)目多于b數(shù)組中元素大于a數(shù)組中相應(yīng)元素的數(shù)目(如aibi6次,biai3次,其中i每次為不同的值),則認(rèn)為a數(shù)組大于b數(shù)組,并分別統(tǒng)計出兩個數(shù)組相應(yīng)元素大于、等于、小于的次數(shù)。例5-8 數(shù)組元素作為函數(shù)實參舉例說明程序運行情況:enter array a:1 3 5 7 9 8 6 4 2 0enter array b:5 3 8 9 -1 -3 5 6 0 4aibi 4 timesai=b
13、i 1 timesaibi 5 timesarray a is smaller than array b例5-8 數(shù)組元素作為函數(shù)實參舉例說明程序示例 數(shù)組名作為參數(shù)的說明:在普通變量或下標(biāo)變量作函數(shù)參數(shù)時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。在函數(shù)調(diào)用時發(fā)生的值傳送是把實參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時,不是進(jìn)行值的傳送,即不是把實參數(shù)組的每一個元素的值都賦予形參數(shù)組的各個元素。因為實際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。前面曾介紹過,數(shù)組名就是數(shù)組的首地址。因此在數(shù)組名作函數(shù)參數(shù)時,實際是把實參數(shù)組的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地
14、址之后,也就等于有了實在的數(shù)組。實際上是形參數(shù)組和實參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。 數(shù)組名作為參數(shù)的說明:上圖說明了這種情形。圖中設(shè)a為實參數(shù)組,類型為整型。a占有以2000為首地址的一塊內(nèi)存區(qū)。b為形參數(shù)組名。當(dāng)發(fā)生函數(shù)調(diào)用時,進(jìn)行地址傳送,把實參數(shù)組a的首地址傳送給形參數(shù)組名b,于是b也取得該地址2000。于是a,b兩數(shù)組共同占有以2000為首地址的一段連續(xù)內(nèi)存單元。從圖中還可以看出a和b下標(biāo)相同的元素實際上也占相同的兩個內(nèi)存單元(整型數(shù)組每個元素占二字節(jié))。例如a0和b0都占用2000和2001單元,當(dāng)然a0等于b0。類推則有ai等于bi。 例5-9 編程序,實現(xiàn)字符串連接。算
15、法思想:將s2字符串連接到s1字符串后。ABD0 s10 s11 s1i-1 s1is1字符串while (s1i!=0) i+;S2字符串EF0k=0;while (s2k!=0) s1i=s2k; i+; k+; s20 s21 例5-9 編程序,實現(xiàn)字符串連接。scat函數(shù)還可簡化為:void scat(char str1 ,char str2 ) int i=0,k=0; while (str1i) i+; while (str1i+=str2k+);程序運行情況:Input s1:I am Input s2: teacher!Output s1:I am teacher!Output
16、 s2:teacher!程序示例用選擇法對數(shù)組中十個整數(shù)進(jìn)行由小到大排序。排序的算法如下: 1) 先從b0 b9的十個整數(shù)中找出最小的數(shù),與元素b0交換。 2) 接下來在從b1 b9的九個整數(shù)中找出最小的數(shù),與元素b1交換。依次類推,每一次比較,減少比較一個數(shù),共比較九次,剩下最大的數(shù)留在b9。例5-10 數(shù)組名作函數(shù)參數(shù)舉例說明3以5個整數(shù)的排序為例,說明選擇法的比較過程:b0 b1 b2 b3 b4 3 6 1 9 4 未排序時的情況 1 6 3 9 4 將5個數(shù)中的最小數(shù)1與b0 互換 1 3 6 9 4 將4個數(shù)中的最小數(shù)3與b1 互換 1 3 4 9 6 將3個數(shù)中的最小數(shù)4與b2
17、互換 1 3 4 6 9 將2個數(shù)中的最小數(shù)6與b3 互換 剩下最大的數(shù)留在b4。例5-10 數(shù)組名作函數(shù)參數(shù)舉例說明3void sort(int b ,int n) int i,j,k,t ; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(bjbk) k=j; t=bk; bk=bi; bi=t; 例5-10數(shù)組名作函數(shù)參數(shù)舉例說明3main( ) int a10,i; printf(enter the arrayn); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(the sorted array:
18、 n); for(i=0;ib?a:b;return(c);main()int a=8; /a為局部變量*/printf(%d,max(a,b);形參a、b作用范圍局部變量a作用范圍全局變量b作用范圍 程序運行情況:8例5-12 外部變量與內(nèi)部變量同名舉例 5-9 變量的存儲類別動態(tài)存儲方式和靜態(tài)存儲方式靜態(tài)存儲方式:全局變量,靜態(tài)局部變量static動態(tài)存儲方式:函數(shù)形參,自動變量,函數(shù)調(diào)用時的現(xiàn)場保護(hù)和返回地址。自動變量auto 變量函數(shù)中的局部變量沒有用static聲明,都是自動變量。調(diào)用該函數(shù)時系統(tǒng)給他們分配存儲空間,函數(shù)調(diào)用結(jié)束時這些存儲空間被自動釋放。靜態(tài)局部變量static變量函
19、數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即起占用的存儲單元不釋放,在下一次調(diào)用該函數(shù)時,該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時的值。例5-13f(int a) auto b=0;static c=3;*/函數(shù)f中靜態(tài)局部變量c(static)*/ b=b+1;c=c+1;return a+b+c; main( ) int a=2; for(i=0;i3;i+) printf(%d ,f(a); 程序運行結(jié)果:7 8 9例5-13 靜態(tài)局部變量的值函數(shù)調(diào)用過程中,各變量值的變化圖示第幾次調(diào)用調(diào)用時初值 調(diào)用結(jié)束時的值 b c b ca+b+c第一次第二次第三次 0 0 0 3 4 5
20、 1 1 1 4 5 6 7 8 9例5-13 靜態(tài)局部變量的值5.10 預(yù)處理命令宏定義文件包含條件編譯C語言中的編譯預(yù)處理命令有:所有的預(yù)處理命令以符號#開頭,并且每個預(yù)處理命令必須單獨占一行,不使用分號作為結(jié)束符。宏定義 無參宏定義 定義的一般形式為: #define 標(biāo)識符 字符串例如:#define PI 3.1415926帶參宏定義帶參宏定義的一般形式為#define 宏名(形參表) 字符串在字符串中含有各個形參。帶參宏調(diào)用的一般形式為: 宏名(實參表); 如:#define S(a,b) a+b area=S(3,2)*5;例5-14例5-15#define R 3.0#defi
21、ne PI 3.1415926#define L 2*PI*R#define S PI*R*Rmain() printf(L=%fnS=%fn,L,S);程序運行情況:L=18.849556S=28.274333例5-14無參宏定義 說明:宏定義必須寫在函數(shù)之外,其作用域為宏定義命令起到源程序結(jié)束。如要終止其作用域可使用# undef命令。在進(jìn)行宏定義時,可以引用已定義的宏名,可以層層置換。#define PI 3.1415926#define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*Rmain()float r,l,s,v; scanf(%f,&r); CIRCLE(r,l,s,v); printf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn,r,l,s,v);程序運行情況:輸入:3.5輸出:r=3.50,l=21.99,s=38.48,v=179.59例5-15 帶參宏定義文件包含 文件包含命令行的一般形式有兩種:#include 文件名 例如#include s1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公路養(yǎng)護(hù)合同范本
- 人力資源外包合同范例
- 代理旗艦店合同范本
- 農(nóng)戶種植水稻合同范本
- 2024年中國移動招聘考試真題
- 個人債權(quán)抵押合同范本
- 2024年西安工業(yè)大學(xué)專任教師招聘考試真題
- 企業(yè)簽訂勞務(wù)合同范本
- 供熱站拆除合同范本
- 兼職技術(shù)總工合同范本
- 小學(xué)三年級下冊綜合實踐活動.水果拼盤-(14張)ppt
- 部編版二年級語文下冊第三單元課文《傳統(tǒng)節(jié)日》PPT課件
- 北京市城市建設(shè)節(jié)約用地標(biāo)準(zhǔn)
- 開學(xué)第一課我們開學(xué)啦主題班會PPT課件(帶內(nèi)容)
- 電源線檢驗報告RVV
- 體育訓(xùn)練隊隊規(guī)
- 八字命理漫畫版
- 電梯工程開工報告(直梯)(共1頁)
- 五年級第二學(xué)期體育知識結(jié)構(gòu)圖
- 復(fù)件德力西質(zhì)量獎自評報告2戰(zhàn)略
- 自主改善的活動方案
評論
0/150
提交評論