C語言程序設計第6章函數(shù)_第1頁
C語言程序設計第6章函數(shù)_第2頁
C語言程序設計第6章函數(shù)_第3頁
C語言程序設計第6章函數(shù)_第4頁
C語言程序設計第6章函數(shù)_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、第6章 函數(shù)學習目標本章內(nèi)容中我們將學習1用函數(shù)處理簡單模塊化問題2用函數(shù)處理數(shù)組中的模塊化問題3函數(shù)的遞歸調用4函數(shù)的嵌套調用6.1函數(shù)的定義、調用及簡單應用 學一學 1函數(shù)定義的一般格式類型標識符 函數(shù)名( 形式參數(shù)列表 ) 聲明部分 語句部分 此時稱函數(shù)為有參函數(shù),形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有些函數(shù)可以沒有參數(shù),即:類型標識符 函數(shù)名( ) 聲明部分 語句部分 此時稱函數(shù)為無參函數(shù)。學一學2函數(shù)的使用步聚函數(shù)在使用之前要先聲明、定義,然后才能調用。3函數(shù)的調用根據(jù)函數(shù)是否具有返回值,將函數(shù)分為兩類:有返回值的函數(shù)和沒有返回值的函數(shù)。調用沒有返回值的函數(shù)時,只需要將函數(shù)

2、做為一條語句處理即可:函數(shù)名 (實參列表);其中實參列表中的參數(shù)稱為實際參數(shù),簡稱為實參。調用有返回值的函數(shù)時,有以下三種方式:1)把函數(shù)返回值賦給調用函數(shù)中的某個變量,即變量=函數(shù)名(實參列表);2)函數(shù)出現(xiàn)在一個表達式中參與運算,這種表達式稱為函數(shù)表達式。3)函數(shù)調用作為一個函數(shù)的實參,實質上也是函數(shù)表達式調用的一種,因為函數(shù)的參數(shù)本來就要求是表達式形式。試一試問題6.1:請在屏幕上輸出一行15個”*”,如下圖形所示*【解題步驟】1聲明一個函數(shù)fnPrint;2在main()中調用fnPrint函數(shù)。fnPrint函數(shù)中算法如下: 1定義一個循環(huán)變量;2構造循環(huán),每次輸出一個*。流程圖程序

3、代碼 #include “stdio.h”void fnPrint(); /*函數(shù)聲明*/void fnPrint() /*函數(shù)定義*/ int i; /*函數(shù)體部分*/ for(i=0;i15;i+) printf(“*”); void main() fnPrint(); /*調用函數(shù)*/試一試問題6.2:拓展問題4.1,輸出3行,第一行3個,以后每行增加3個,輸出圖形如下:*分析:每行中輸出的*個數(shù)分別是3、6、9,因為print函數(shù)的功能輸出不確定個數(shù)的”*”,其具體的個數(shù)由主函數(shù)中的實參決定。【解題步驟】1聲明一個函數(shù)fnPrint;2在main()中分別使用3、6、9做實參調用fnP

4、rint函數(shù)。fnPrint函數(shù)中算法如下: 1設計形參為輸出的*號的個數(shù);2構造循環(huán),輸出多個*。流程圖 【程序代碼】#include “stdio.h”void fnPrint(); /*函數(shù)聲明*/ void fnPrint(int n) /*函數(shù)定義*/ int i; /*函數(shù)體部分*/ for(i=0;iiNum2) return iNum1; /*將大值返回到調用函數(shù)處*/ else return iNum2;void main() int iNum1,iNum2; printf(“nplease input two number:”); scanf(“%d%d”,&iNum1,&

5、iNum2); printf(“the max of %d and %d is %d”,iNum1,iNum2,fnMax(iNum1,iNum2);練一練1拓展問題6.3,分別編寫函數(shù)求2個數(shù)的加、減、乘、除及余數(shù)。2編寫一個函數(shù),求n!。問題6.5問題6.5:相傳古代印度國王舍罕要褒獎他的聰明能干的宰相達依爾(國際象棋發(fā)明者),問他需要什么,達依爾回答說:“國王只要在國際象棋的棋盤上第一個格子放一粒麥子,第二個格子放上二粒,第三個格子放四粒,以此類推,每一格加一倍,一直放到64格,我就感恩不盡了”。國王答應了,結果全印度的糧食用完還不夠。國王很納悶,怎么也算不清這筆賬。現(xiàn)在我們用C編程來算

6、一下(1立方米數(shù)小麥大約1.42108 粒)。分析:第一格的麥子數(shù)1,即2的0次冪,第二格的麥子數(shù)是2,即2的1次冪,第3格的麥子數(shù)是4,即2的2次冪,依次類推,第64格的麥子數(shù)即2的63次冪,因此要求所放麥子的總數(shù),應先求每個格子所放麥子數(shù),即轉化為求2n次冪的問題,因此可以將求2n次冪轉化為一函數(shù),避免代碼的重復編寫。【解題步驟】1定義一個累加變量dSum=0;2構造循環(huán),以第幾個格子做實參調用函數(shù),將每格所放的麥子數(shù)計算出來并累加到dSum中;3輸出總麥子數(shù)。函數(shù)中算法如下: 1設計形參,接收格子數(shù),定義一個s=1;2構造循環(huán),調用函數(shù)將每格所放的麥子數(shù)計算出來并累加到s中;3輸出總麥子

7、數(shù)。流程圖程序代碼#include “stdio.h”double fnPower(int iNum);double fnPower(int iNum) double s=1; int i; for (i=0;iiNum;i+) s=s*2; return s; void main() double dSum=0,dEvery,dVol; int i; for(i=0;i=64;i+) dEvery=fnPower(i); /*以i為實參調用fnPower函數(shù)*/ dSum=dSum+dEvery; dVol= dSum/1.42e8; printf(“the sum of wheat is

8、%f”,dVol); 練一練1拓展問題6.5,如果每格中所放的麥子不是2,而應該是由鍵盤上輸入的任意一個數(shù),應該怎么編程。提示:因為每格所放麥子數(shù)是未知數(shù),函數(shù)的參數(shù)變成兩個,一個參數(shù)表示每格所放麥子數(shù),另外一個表示第幾格。即:double fnPower(int iNum1,int iNum2)2查看下面程序的執(zhí)行結果:#include “stdio.h”void swap(int a,int b) int t;t=a; a=b;b=t;printf(“in the function:a=%d,b=%dn”,a,b);void main() int a,b;a= 1; b=2;printf(

9、“before call function:a=%d, b=%dn”,a,b);swap(a,b);printf(“after call function:a=%d, b=%dn”,a,b);小結:函數(shù)使用的步驟1. 函數(shù)聲明:函數(shù)的使用有三大步驟:聲明、定義和調用。被調用的函數(shù)需先聲明后調用。但若定義位于調用前面,可省掉聲明。為統(tǒng)一或標準化起見,一般將自定義的所有函數(shù)都在程序前面予以聲明。函數(shù)定義:用C語句,或調用其它函數(shù)實現(xiàn)它的功能。 函數(shù)調用。小結:函數(shù)的定義2無參函數(shù)的定義:類型標識符 函數(shù)名( ) 聲明部分 語句部分 有參函數(shù)的定義:類型標識符 函數(shù)名( 形式參數(shù)列表 ) 聲明部分

10、語句部分 例如:void fnPrint()即為無參函數(shù),void fnPrint(int n)即為有參函數(shù),fnPrint為函數(shù)名,void為函數(shù)的類型,即返回值的類型,void代表函數(shù)沒有返回值,如果沒有定義函數(shù)的類別,默認函數(shù)的類型為整型。小結:函數(shù)的形參與實參(1)在函數(shù)定義時說明的參數(shù)叫做形參,在函數(shù)調用時使用的參數(shù)叫做實參。例如:int fnMax(int iNum1,int iNum2)中,iNum1和iNum2即形參,定義形參時即說明形參的數(shù)據(jù)類型,多個形參之間用逗號隔開,形參為函數(shù)內(nèi)定義的參數(shù),為局部變量,只在函數(shù)執(zhí)行時才有意義。函數(shù)執(zhí)行完畢后,即釋放該參數(shù)。iNum3=fn

11、Sum(iNum1,iNum2)中,iNum1和iNum2即實參,是函數(shù)調用時使用的參數(shù)。實參可以是常量、變量、表達式或函數(shù),無論實參是何種類型的數(shù)據(jù),在執(zhí)行函數(shù)調用時,必須有明確的值,以便把值傳給形參。(2)在函數(shù)調用時,將實參的值復制一份,傳遞給形參,這種參數(shù)的傳遞方式稱為值傳遞。變量做函數(shù)參數(shù)時是單向的值傳遞,只能從實形向形參傳遞,而不能由形參傳回實參。(3)實參與形參占用不同的內(nèi)存單元,即使同名也不影響。 小結:函數(shù)的返回值函數(shù)可以比做一個加工廠,主函數(shù)比做一個公司,公司可以委拖加工廠對零件進行加工,在委托前應確定加工廠的性質,是手工的還是機械的,即函數(shù)的類型,送去的零配件即函數(shù)實參,

12、加工的過程其實就是函數(shù)的功能,公司只要最后的成品,即函數(shù)返回值。函數(shù)返回值用return語句實現(xiàn),格式為:return ();return語句的執(zhí)行過程是先計算表達式的值,再將計算的結果返回給主調函數(shù)。小結:函數(shù)的調用分為有返回值的函數(shù)調用和無返回值的函數(shù)調用兩種。(1)無返回值函數(shù)的調用:函數(shù)名(參數(shù)列表);當函數(shù)調用不需要返回值的時候,可由函數(shù)調用加上分號(;)實現(xiàn),該函數(shù)調用作為一個獨立語句使用。例如:fnPrint(3);(2)有返回值函數(shù)的調用可以有如下幾種格式: 把函數(shù)返回值賦給調用函數(shù)中的某個變量,即變量=函數(shù)名(實參列表);例如:iNum3=fnSum(iNum1,iNum2)

13、;將函數(shù)的值賦給變量iNum3。函數(shù)出現(xiàn)在一個表達式中參與運算,這種表達式稱為函數(shù)表達式。例如:printf(“the max of %d and %d is %d”,iNum1,iNum2,fnMax(iNum1,iNum2)中將函數(shù)調用做為一個表達式的值在printf函數(shù)中輸出。函數(shù)調用作為一個函數(shù)的實參,實質上也是函數(shù)表達式調用的一種,因為函數(shù)的參數(shù)本來就要求是表達式形式。例如:iNum=fnMax(fnMax(iNum1,iNum2),fnMax(iNum3,iNum4),首先計算fnMax(iNum1,iNum2)和fnMax(iNum3,iNum4)的值,即兩次調用函數(shù)fnMax(

14、),計算完后把函數(shù)的返回值再次做為fnMax()函數(shù)實參,再次調用函數(shù)fnMax(),計算最后結果是求四個數(shù)的最大值。數(shù)組作函數(shù)參數(shù)的應用學一學1.數(shù)組元素做函數(shù)的實參數(shù)組元素做函數(shù)的實參,與其它同類型普通變量做實參并沒有區(qū)別,在發(fā)生函數(shù)調用時,把數(shù)組元素的值傳遞給形參,實現(xiàn)單向值。其調用方式同普通變量一樣。試一試 問題6.6從鍵盤上輸入一串字符,編寫一個函數(shù),統(tǒng)計字符串中小寫字母的個數(shù)。分析:函數(shù)中只要判斷字符是否小寫字母,如果是,則返回1,如果不是,返回0。在主函數(shù)中構造循環(huán),以數(shù)組中每個元素為實參,調用函數(shù)?!窘忸}步驟】1定義一個字符型數(shù)組,存放字符串;2定義一個整型變量用來保存小寫字母

15、的個數(shù);3輸入字符數(shù)組的值;4構造循環(huán),以單個字符為實參調用函數(shù)計算字符串中小寫字母的個數(shù);5輸出小寫字母的個數(shù)。函數(shù)中的算法如下:1設計形參為單個字符;2判斷字符變量是否小寫字母,如果是,返回1,否則,返回0。流程圖程序代碼#include “stdio.h”int fnCount(char chChar); int fnCount(char chChar) if(chChar=a&chChar=z) /*判斷字符cChar是否是小寫字母*/ return 1; /*返回值1*/ else return 0;void main() int iCount=0,i; char chString1

16、0; gets(chString); /*輸入字符串*/ for(i=0;chStringi!=0;i+) iCount+=fnCount(chStringi); /*計數(shù)累加*/ printf(“n the sum of character is %d”,iCount); getch(); 練一練1.學院舉行數(shù)據(jù)庫大賽,有10名同學參賽,從鍵盤上輸入每個同學的比賽成績(百分制),編寫函數(shù),輸出對應1,2,3等獎。(假定:90分以上為1等獎,80-90分之間為2等獎,60-80分之間3等獎)提示:將每個同學的參賽成績做為函數(shù)的實參。在函數(shù)中構造一個形參,對每個形參進行判斷,如果大于90分,返回

17、值1,如果大于80分,小于90分,返回值2,如果大于60分,小于80分,返回值3.在主函數(shù)中,調用函數(shù)根據(jù)返回值分別輸出一、二、三等獎。學一學1數(shù)組名做函數(shù)的實參與形參數(shù)組名做函數(shù)參數(shù)時,既可以是形參,也可以做實參,要求形參和對應的實參都必須是類型相同的數(shù)組(或指向同類型數(shù)組的指針變量),并且都必須有明確的數(shù)組定義。2.地址傳遞數(shù)組名不但代表數(shù)組元素的共同名字,而且代表數(shù)組的首地址,即數(shù)組中第一個元素的地址,所以數(shù)組名作參數(shù)傳遞時,傳遞給形參的是實參數(shù)組的首地址,換句話說,采用的不是“值傳遞”而是“地址傳遞”,即把實參的地址傳遞給形參。 試一試問題6.7學校舉行知識競賽,有10個學生參賽,請編

18、寫一個函數(shù),求平均分。分析:函數(shù)的功能是求10個數(shù)的平均值,需要將平均值返回到調用函數(shù)中,因而,函數(shù)的類型應為平均值的類型,參數(shù)是10個學生的參賽成績?!窘忸}步驟】1定義一個float型數(shù)組,存放10個學生的參賽成績;2定義一個float型變量存放平均分;3循環(huán)輸入10個學生的比賽成績;4以數(shù)組名為實參調用函數(shù)計算平均分,并將函數(shù)的返回值賦給平均分變量;5輸出平均分。函數(shù)中的算法如下:1設計一個數(shù)組接收10個學生參賽成績,定義一個變量fSum保存10個學生的總分,并賦初值為0;2構造一個循環(huán)將每個學生的分數(shù)累加到fSum中;3返回fSum/10的值。流程圖程序代碼#include “stdio

19、.h”float fnAvg(float fScore110);float fnAvg(float fScore110) float fSum=0; int i; for(i=0;i10;i+) fSum=fSum+fScore1i; return fSum/10; /*返回平均值*/void main() int i; float fScore10,fAvg; for(i=0;i10;i+) scanf(“%f”,&fScorei); fAvg=fnAvg(fScore); /*以數(shù)組名為實參調用函數(shù)*/ printf(“n the sum of sugar is %f”,fAvg); ge

20、tch(); 試一試問題6.8某系要選拔身高較高的同學,有N名同學參加選拔,請你將身高輸入電腦,編寫函數(shù)將身高按從低到高進行排序,并且輸出排序后的結果?!窘忸}步驟】1定義一個int型數(shù)組,存放N個學生的身高;2循環(huán)輸入N個學生的身高;3調用函數(shù)將身高按從低到高進行排序;4輸出排好序的身高。函數(shù)中的算法如下見問題6.5:流程圖程序代碼#include “stdio.h”#define N 10void fnSort(int iStu ); void fnSort(int iStu )int i,k,t;for(k=1;k=k;i-) if(iStuiiStui-1) t=iStui; iStui

21、=iStui-1; iStui-1=t; /*兩個相鄰的數(shù)交換*/ void main() int i;int iGaoN;for(i=0;iN;i+)scanf(“%d”,&iGaoi);fnSort(iGao); /*以iGao為實參調用函數(shù)*/for(i=0;iN;i+)printf(“%d”,iGaoi);getch(); 練一練1拓展問題6.6,使用數(shù)組名作函數(shù)的實參和形參,實現(xiàn)問題6.6中求字符串中字符的個數(shù)。2. 拓展問題6.7,分別編寫兩個函數(shù)求10個參賽學生中最高分和最低分,在主函數(shù)中調用兩個最高分最低分函數(shù),并輸出。3. 編寫函數(shù)實現(xiàn)從鍵盤上輸入兩個字符串。試一試問題6.9

22、拓展問題6.8,參加選拔的學生中有一人退出了。請輸入這個學生的身高,將這個同學的身高從排好序的數(shù)組中刪除。分析:在此題中存在二個未知數(shù),一個是數(shù)組,表示所有學生的身高,一個是退出的學生的身高,因此,函數(shù)的參數(shù)有兩個。【解題步驟】1定義一個int型數(shù)組,存放n個學生的身高;2循環(huán)輸入n個學生的身高;3. 輸入退出的學生的身高;4以數(shù)組名和退出學生身高做實參,調用函數(shù)將退出學生的身高從數(shù)組中刪除;5在主函數(shù)輸出所有學生的身高。函數(shù)中的流程如下:1. 定義兩個形參,一個保存所學生的身高,一個保存退出學生的身高;2. 構造循環(huán),對每個身高進行比較,是否等于退出學生身高,如果相等的話,將后面學生依次前移

23、一個位置。流程圖程序代碼#include “stdio.h”#define N 10 void fnDelete(int iStu ,int num)int i,k;for(i=0;iN-1;i+) if (iStui= =num) /*判斷刪除的位置*/ for(k=i;kN-1;k+) iStuk=iStuk+1; /*刪除位置后每個元素往前移動一個*/ break; void main() int i,iNum;int iGaoN;for(i=0;iN;i+)scanf(“%d”,&iGaoi);scanf(“%d”,&iNum);fnDelete(iGao,iNum); /*調用刪除數(shù)

24、據(jù)的函數(shù)*/for(i=0;iN-1;i+)printf(“%d”,iGaoi);getch(); 想一想1拓展問題6.8,后來又來了一個同學參加身高選拔,請將這個同學的身高插入到已經(jīng)排好序的隊伍當中,請編寫函數(shù)實現(xiàn)這一過程。(可參考第5章的問題5.6)2.編寫一個小的程序,使之能夠具有增加、刪除、排序、查找等功能,并可選擇性的多次操作?小結:數(shù)組做函數(shù)的參數(shù)的兩種方式:數(shù)組元素做函數(shù)的實參; 數(shù)組名做函數(shù)的實參和形參。(1)數(shù)組元素是一個變量,數(shù)組元素做實參與普通變量做實參的情況類似,是把數(shù)組元素值復制一份,拷貝給形參,形參的值不能傳回實參,實參與形參之間是單向的值傳遞的關系。例:在問題6.

25、6中,函數(shù)調用語句iCount+=fnCount(chStringi);中,把chStringi的值復制一份,傳遞給函數(shù)定義中的變量chChar,在函數(shù)中完成對chChar變量的運量。(2)數(shù)組名可以做函數(shù)的實參和形參,數(shù)組名代表數(shù)組在內(nèi)存中的首地址,因此,實參與形參之間采用地址傳遞,實參可以將數(shù)據(jù)傳遞給形參,形參對數(shù)據(jù)操作后,將修改后的值返回到實參。例:在問題6.7中,定義了int型數(shù)組iGaoN,在函數(shù)調用語句fnSort(iGao)中,用iGao即數(shù)組名作實參,將數(shù)組的首地址傳遞給形參,在函數(shù)void fnSort(int iStu )中,對數(shù)組iStu進行排序后,將排好序的數(shù)組返回到調

26、用函數(shù)處,因此在主函數(shù)中,打印出來的iGao數(shù)組即是排好序的數(shù)組。數(shù)組名做函數(shù)的參數(shù)需要注意以下幾點:用數(shù)組名做函數(shù)參數(shù),應該在調用函數(shù)和被調用函數(shù)中分別定義數(shù)組,且數(shù)組類型必須一致,否則,結果會出錯。C語言編譯系統(tǒng)對形參數(shù)組大小不做檢查,所以形參數(shù)組可以不指定大小,如果指定形參數(shù)組的大小,則實參數(shù)組的大小必須大于形參數(shù)組,否則,形參數(shù)組中會有部分元素沒有確定的值,而導致計算錯誤。 小結:值傳遞與地址傳遞(1)值傳遞的特點:實參與形參各自占據(jù)獨立的存儲單元。調用時,將實參的值傳入形參單元。在被調用的函數(shù)內(nèi),訪問相應的形參單元。函數(shù)調用結束后,釋放形參單元。(2)地址傳遞的特點:數(shù)組名作參數(shù),是

27、將實參數(shù)組的首地址傳給形參數(shù)組,從而使形參數(shù)組與實參數(shù)組共用同一段內(nèi)存空間,所以,形參數(shù)組元素的值發(fā)生變化,即實參數(shù)組元素的值發(fā)生變化。形參數(shù)組的長度可以不定義,如果要定義數(shù)組長度,那么長度必須小于實參數(shù)組長度。函數(shù)的嵌套調用與遞歸調用 1.函數(shù)的嵌套就函數(shù)定義而言,C語言不支持函數(shù)的嵌套定義,即在定義一個函數(shù)時不能在函數(shù)體內(nèi)再定義另一個函數(shù),因此,所有的函數(shù)定義都是平行的。但就函數(shù)調用來說,C語言支持嵌套的函數(shù)調用。函數(shù)的嵌套調用是指,在執(zhí)行被調用函數(shù)時,被調用函數(shù)又調用了其它函數(shù)。2.函數(shù)的遞歸函數(shù)的遞歸調用是指,一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調用該函數(shù)本身,能夠遞歸調用的函數(shù)是一種

28、遞歸函數(shù)。顯然,遞歸調用是嵌套調用的特例 試一試問題6.10編程計算s = 1! + 2! + 3! + + 20!的值。分析:觀察表達式可以得知,應先計算n!,然后再計算階乘之和,所以應該有兩個函數(shù),一個函數(shù)計算n!,另外一個函數(shù)計算階乘之和。【解題步驟】1定義一個長整型變量保存階乘之和;2以長整型變量作實參調用函數(shù)求階乘之和;3輸出階乘之和。求階乘之和的函數(shù)的算法:1定義一個長整型變量lSum保存階乘之和;2構造循環(huán),分別調用函數(shù)求1-n的階乘并累加到lSum中;3將lSum返回到調用函數(shù)。求階乘的函數(shù)的算法:1設計一個長整型變量為形參,定義一個長整型變量lFact保存階乘之和,賦初值為1

29、;2構造循環(huán),將1-n的乘積并累乘到lFact中;3將lFact返回到調用函數(shù)。流程圖程序代碼#include long fnFact(int n) int i; long lFact=1; for(i=1;i=n;i+) lFact=lFact*i; return lFact;long fnFactSum(int n) int i; long lSum=0; for(i=1;i=n;i+) lSum+=fnFact(i); /* 調用fnFact函數(shù) */ return lSum;void main() int iNum; long lFactsum; printf(nInput a num

30、ber(=12): ); scanf(%d, &iNum); lFactsum=fnFactSum(iNum); /* 調用fnFactSum函數(shù) */ printf(n1!+2!+3!+ + %d!= %ldn,iNum,lFactsum);試一試問題6.11有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人多少歲?他說比第3個人大2歲。問第3個人多少歲?他說比第2個人大2歲。問第2個人多少歲?他說比第1個人大2歲。問第1個人多少歲?他說是10歲。請問第5個人多大。分析:要求第5個人的年齡就比須先知道第4個人的年齡,而第4個人的年齡也不知道,要求第4個人的年齡,就比須知道第

31、3個人的年齡,而第3個人的年齡又取決于第2個人的年齡,第2個人的年齡又取決于第一個人的年齡,每一個人的年齡又比前一個人大2歲,即:fnAge(5)=fnAge(4)+2fnAge(4)=fnAge(3)+2fnAge(5)=fnAge(2)+2fnAge(5)=fnAge(1)+2fnAge(1)=10解題步驟【解題步驟】1.主函數(shù)中調用求年齡函數(shù),計算第5個人年齡并輸出。求年齡函數(shù)的算法:1定義一個整型變量保存年齡;2. 判斷是否為第一個人,如果是第一個,則年齡=10,否則繼續(xù)調用年齡函數(shù)。流程圖程序清單#include int fnAge(int n);int fnAge(int n) /

32、* 定義遞歸函數(shù) */ int iAge; if(n=1) iAge=10; /* 終止條件 */ else iAge=fnAge(n-1)+2; /* 遞歸調用 */ return iAge;void main() printf(第5個人的年齡是 %dn,fnAge(5);練一練練一練13個同學進行踢毽子比賽,編寫一個函數(shù),求出踢的個數(shù)最多和最少的差。提示:分別編寫二個函數(shù)求三個數(shù)的最大和最小值。然后再編寫一個函數(shù),調用最大值和最小值函數(shù)求差,將求差的結果返回。2利用遞歸求n!。提示:n!可以寫成遞歸公式 :fact(n)=1 n=1或者n=0 fact(n)= fact(n-1)*n n1

33、小結:函數(shù)嵌套調用C語言不支持函數(shù)的嵌套定義,所有的函數(shù)定義都是平行的。但就函數(shù)調用來說,C語言支持嵌套的函數(shù)調用。嵌套調用為結構化程序設計提供了基本的支持。調用函數(shù)的特點:(1)無論函數(shù)在何處被調用,調用結束后,其流程總是返回到調用該函數(shù)的地方。(2)C語言支持多層函數(shù)調用。小結: 函數(shù)的遞歸調用函數(shù)的遞歸調用是指,一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調用該函數(shù)本身,能夠遞歸調用的函數(shù)是一種遞歸函數(shù)。語言的特點之一是允許函數(shù)的遞歸調用。顯然,遞歸調用是嵌套調用的特例。說明如下:(1)遞歸函數(shù)主要用于解決具有遞歸性質的問題。(2)C語言編譯系統(tǒng)對遞歸函數(shù)自調用次數(shù)沒有限制,但是通常情況下,遞歸

34、過程不是無限制的進行下去,每個遞歸函數(shù)應確定函數(shù)的出口,即結束遞歸調用的條件。例如問題6.11中,n=1即是本遞歸的出口條件。(3)編寫遞歸函數(shù)有兩個要點:確定遞歸公式和根據(jù)公式確定遞歸函數(shù)的出口。學一學:內(nèi)部變量與外部變量變量必須先定義后使用。變量的定義可以在函數(shù)內(nèi)部、函數(shù)外部及復合語句的內(nèi)部。如果變量定義在某函數(shù)或復合語句內(nèi)部,則稱該變量為內(nèi)部變量(也稱為局部變量),如果變量的定義在所有函數(shù)外部,則稱該變量為外部變量(也稱為全局變量)。局部變量只在本函數(shù)范圍內(nèi)有效,即局部變量的作用域僅僅局限于定義它的函數(shù)內(nèi);全局變量的作用域是從它定義的位置開始到本源文件的結束,即位于全局變量的定義后面的所

35、有函數(shù)都可以使用此變量。學一學:動態(tài)存儲變量、靜態(tài)存儲變量及寄存器變量動態(tài)存儲變量(也稱自動類變量)是指那些當程序的流程轉到函數(shù)時才開辟內(nèi)存單元,執(zhí)行結束后又立即被釋放的變量。定義方式為:auto 數(shù)據(jù)類型 變量名靜態(tài)存儲變量則是指在整個程序運行期間分配固定存儲空間的變量。定義方式為:static 數(shù)據(jù)類型 變量名寄存器變量只能出現(xiàn)在函數(shù)內(nèi)部,寄存器變量的值存放在寄存器中(寄存器被認是一種超高速的存儲器),這樣對這種變量存取速度就很快,因此寄存器量主要用來存放循環(huán)變量,以提高程序的執(zhí)行速度。定義方式為:register 數(shù)據(jù)類型 變量名學一學:內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)(也稱靜態(tài)函數(shù))是指只被

36、文本文件內(nèi)的其它函數(shù)調用的函數(shù),而外部函數(shù)是指被文本文件內(nèi)、外其它函數(shù)調用的函數(shù)。內(nèi)部函數(shù)的定義格式如下:static 數(shù)據(jù)類型 函數(shù)名(形式參數(shù)列表)聲明部分; 執(zhí)行部分;動態(tài)函數(shù)的定義格式如下:extern 數(shù)據(jù)類型 函數(shù)名(形式參數(shù)列表)聲明部分; 執(zhí)行部分;試一試問題6.12分析以下程序,指明哪些是內(nèi)部變量,哪些是外部變量?#include “stdio.h”int iA=100,iB=10; /*定義外部變量*/void fnSum() int iC; /*定義內(nèi)部變量*/ iC=iA+iB;printf(“%d,”,iC);void main() int iA=1,iC; /*定義

37、內(nèi)部變量*/ iC=iA+iB; printf(“%d,”,iC);fnSum(); 練一練 1 指出以下程序中,哪些是外部變量,哪些是內(nèi)部變量,哪個寄存器變量?及其作用域?#include “stdio.h”int iA=100,iB=10;void fnSum1(int iA,int iB)int iC; iA=2;iB=2;iC=iA+iB;printf(“%d,”,iC);void fnSum2() int iC; iC=iA+iB;printf(“%d,”,iC);void main() int iA=1,iB=1;register int iC; fnSum(iA,iB); fnS

38、um2(); iC=iA+iB; printf(“%d”,iC);試一試問題6.13分析以下程序,指明哪些是動態(tài)變量和靜態(tài)變量?#include “stdio.h”int fnMyfun() auto int iX=1; /*動態(tài)變量*/ static int iY=1; /*靜態(tài)變量*/ iX=iX+2; iY=iY+2; return iX+iY;void main() register int i; /*寄存器變量*/int iSum; for(i=1;iiNum2) return iNum1; else return iNum2;第二同學的程序保存在f2.c文件,程序如下:#include “stdio.h”int min(int iNum1,int iNum2) if (iNum1iNum2)return iNum1; else return iNum2;第三同學的程序保存在f3.c文件,程序如下:void main() int iNum1=2,iNum2=3; printf(“%d”,max(iNum1,iNum2);printf(“%d”,min(iNum1,iNum2);解題步驟:由這三個文件組成的源程序可按如下步驟運行:編輯文件.編輯以上文件后分別存入在f1.c,f2.c,f3.c。創(chuàng)建

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論