C語(yǔ)言(第7章函數(shù))_第1頁(yè)
C語(yǔ)言(第7章函數(shù))_第2頁(yè)
C語(yǔ)言(第7章函數(shù))_第3頁(yè)
C語(yǔ)言(第7章函數(shù))_第4頁(yè)
C語(yǔ)言(第7章函數(shù))_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語(yǔ)言程序設(shè)計(jì)信息與計(jì)算機(jī)學(xué)院Email:yixuan0820@163.com第7章函數(shù)本章主要內(nèi)容:函數(shù)的定義函數(shù)的調(diào)用函數(shù)的參數(shù)和函數(shù)返回值遞歸函數(shù)變量的作用域和存儲(chǔ)類別7.1函數(shù)的定義C函數(shù)的概念函數(shù):一段可以重復(fù)調(diào)用的、功能相對(duì)獨(dú)立完整的程序段。1)庫(kù)函數(shù):由C語(yǔ)言系統(tǒng)提供,用戶無(wú)須定義,可直接使用。2)用戶自定義函數(shù):由用戶按需要編寫(xiě)的函數(shù)函數(shù)的定義函數(shù)定義的一般形式為:類型標(biāo)識(shí)符函數(shù)名(類型形式參數(shù),類型形式參數(shù),…){

聲明部分執(zhí)行部分}說(shuō)明:類型標(biāo)識(shí)符用來(lái)定義函數(shù)類型,即指定函數(shù)返回值的類型。函數(shù)類型應(yīng)根據(jù)具體函數(shù)的功能確定。默認(rèn)類型標(biāo)識(shí)符為int類型。函數(shù)值通過(guò)return語(yǔ)句返回。函數(shù)執(zhí)行時(shí)一旦遇到return語(yǔ)句,則結(jié)束當(dāng)前函數(shù)的執(zhí)行,返回到主調(diào)函數(shù)的調(diào)用點(diǎn)。

如果函數(shù)執(zhí)行后沒(méi)有返回值,則函數(shù)類型標(biāo)識(shí)符用“void”,稱為“空類型”或“無(wú)類型”。

函數(shù)名必須符合標(biāo)識(shí)符的命名規(guī)則。在函數(shù)定義時(shí),函數(shù)體中不能再出現(xiàn)與函數(shù)名同名的其他對(duì)象名(如變量名、數(shù)組名等)。函數(shù)首部括號(hào)內(nèi)的參數(shù)稱為形式參數(shù)(簡(jiǎn)稱形參),形參的值來(lái)自函數(shù)調(diào)用時(shí)所提供的參數(shù)(稱為實(shí)參)值。形參也稱形參變量?!纠?.4】求一個(gè)數(shù)的立方。#include<stdio.h>longcub(int

x)/*函數(shù)定義*/

{longy;/*函數(shù)體中的聲明部分*/

y=x*x*x;/*函數(shù)體中的執(zhí)行部分*/

returny;}voidmain(){intnum;longcub_num;

printf("請(qǐng)輸入一個(gè)整數(shù):\n");

scanf("%d",&num);

cub_num=cub(num);/*函數(shù)調(diào)用*/

printf("%d的立方值是%1d",num,cub_num);}函數(shù)調(diào)用的過(guò)程:①創(chuàng)建形參變量,為每個(gè)形參變量建立相應(yīng)的存儲(chǔ)空間。②值傳遞,即將實(shí)參的值復(fù)制到對(duì)應(yīng)的形參變量中。③執(zhí)行函數(shù)體,執(zhí)行函數(shù)體中的語(yǔ)句。④返回(帶回函數(shù)值、返回調(diào)用點(diǎn)、撤消形參變量)。實(shí)參形參7.2函數(shù)參數(shù)和返回值形式參數(shù)和實(shí)際參數(shù)

形參:在定義函數(shù)時(shí)函數(shù)名后面括號(hào)中變量名稱為形式參數(shù),簡(jiǎn)稱形參。實(shí)參:在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。實(shí)參形參(1)傳遞數(shù)值(值傳遞方式)(2)傳遞地址(地址傳遞方式)函數(shù)關(guān)于參數(shù)的幾點(diǎn)說(shuō)明:⑷實(shí)參可以是常量、變量或表達(dá)式,并且必須有確定的值;⑶對(duì)每個(gè)形參必須指明其名字和數(shù)據(jù)類型;⑸實(shí)參個(gè)數(shù)、類型必須與對(duì)應(yīng)的形參一致;⑵形參是函數(shù)的內(nèi)部變量,只在函數(shù)內(nèi)部才有意義;⑹實(shí)參對(duì)形參的數(shù)據(jù)傳遞是值傳遞,即單向傳遞,只由實(shí)參傳遞給形參,反之不可。調(diào)用結(jié)束后,只有形參單元被釋放,實(shí)參單元中原來(lái)的值不變。⑴形參調(diào)用前不占內(nèi)存單元,調(diào)用時(shí)占用,調(diào)用后釋放;1、用函數(shù)調(diào)用完成求一個(gè)數(shù)組{12,3,2,4,5,8,9,12,2,40}中的最小(大、平均值、總和)元素值

要求:通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)(計(jì)算方法在子函數(shù)中,通過(guò)主函數(shù)調(diào)用實(shí)現(xiàn))

2、求一個(gè)數(shù)的平方(立方);

3、求兩個(gè)數(shù)的平方和(平方差);

4、用函數(shù)調(diào)用完成求一個(gè)3×3數(shù)組主對(duì)角線上所有元素的最大值。(注:主對(duì)角線是左上角到右下角的對(duì)角線)【例7.5】分析以下程序的運(yùn)行結(jié)果。(值傳遞方式)#include<stdio.h>voidswap(float

x,floaty)/*定義交換變量x,y值的函數(shù)*/{floattemp;temp=x;x=y;y=temp;

printf("x=%.2fy=%.2f\n",x,y);}voidmain(){floatx=8.5,y=3.7;swap(x,y);/*調(diào)用swap函數(shù)*/

printf("x=%.2fy=%.2f\n",x,y);}結(jié)論:由于形參與實(shí)參各自占用不同的存儲(chǔ)空間,因此,在函數(shù)體執(zhí)行中,對(duì)形參變量的任何改變都不會(huì)改變實(shí)參的值。地址傳遞方式:

函數(shù)調(diào)用時(shí),將實(shí)參數(shù)據(jù)的存儲(chǔ)地址作為參數(shù)傳遞給形參。其特點(diǎn)是:形參與實(shí)參占用同樣的內(nèi)存單元,函數(shù)中對(duì)形參值的改變也會(huì)改變實(shí)參的值。因此函數(shù)參數(shù)的地址傳遞方式可實(shí)現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的雙向數(shù)據(jù)傳遞。比較典型的地址傳遞方式就是用數(shù)組名作為函數(shù)的參數(shù),在用數(shù)組名作函數(shù)參數(shù)時(shí),不是進(jìn)行值的傳送,因?yàn)閷?shí)際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有同一段內(nèi)存空間?!纠?.6】一個(gè)一維數(shù)組score內(nèi)放10個(gè)學(xué)生成績(jī),用一個(gè)函數(shù)求平均成績(jī)。(地址傳遞方式)#include<stdio.h>floataverage(float

array[10]){inti;floataver,sum=array[0];

for(i=1;i<10;i++)sum=sum+array[i];aver=sum/10;

return(aver);voidmain(){floatscore[10],aver;

inti;

printf("請(qǐng)輸入10個(gè)學(xué)生的成績(jī):\n");

for(i=0;i<10;i++)

scanf("%f",&score[i]);

printf("\n");aver=average(score);

printf("平均成績(jī)是%5.2f\n",aver);}

程序說(shuō)明:①用數(shù)組名作函數(shù)參數(shù),應(yīng)在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義數(shù)組,其中score是實(shí)參數(shù)組名,array是形參數(shù)組名。②在被調(diào)用函數(shù)average中聲明了形參數(shù)組的大小是10,其實(shí)指定其大小不起作用,形參數(shù)組可以不指定大小,在定義數(shù)組時(shí)可以只在數(shù)組名后跟一個(gè)空的方括號(hào)。因?yàn)镃語(yǔ)言編譯系統(tǒng)對(duì)形參數(shù)組大小不做檢查,只是將實(shí)參數(shù)組的首地址傳給形參數(shù)組,因此形參數(shù)組名獲得了實(shí)參數(shù)組的首元素的地址。7.2.2函數(shù)的返回值return語(yǔ)句的一般形式:①return;②return表達(dá)式;或return(表達(dá)式);例如:下面是3個(gè)函數(shù)的首行:intmax(floata,floatb)/*函數(shù)值為整型*/charletter(charc1,charc2)/*函數(shù)值為字符型*/doublemin(inty,inty)/*函數(shù)值為雙精度型*/【例7.8】調(diào)用函數(shù)返回兩個(gè)數(shù)中的較大者。#include<stdio.h>intmax(floatx,floaty){floatz;

z=x>y?x:y;

return(z);

}voidmain()

{floata,b;

intc;

scanf("%f,%f",&a,&b);

c=max(a,b);

printf("較大的是%d\n”,c);

}7.3函數(shù)的調(diào)用調(diào)用有參函數(shù)的一般形式:

函數(shù)名(實(shí)參表列)

如果是調(diào)用無(wú)參函數(shù),則沒(méi)有實(shí)參表列,但括號(hào)不能省略。形式如下:

函數(shù)名()

函數(shù)調(diào)用可以有三種方式。①表達(dá)式方式:c=2*max(a,b);②參數(shù)方式:d=max(a,max(b,c))③語(yǔ)句方式:不要求函數(shù)帶回返回值的情況下。7.3.2函數(shù)聲明函數(shù)聲明的目的是通知編譯系統(tǒng)有關(guān)被調(diào)用函數(shù)的一些特性,便于在函數(shù)調(diào)用時(shí),檢查調(diào)用是否正確。

函數(shù)聲明的一般形式如下:

類型標(biāo)識(shí)符函數(shù)名(類型參數(shù)名,類型參數(shù)名,…);或

類型標(biāo)識(shí)符函數(shù)名(類型,類型,…);

說(shuō)明:如果被調(diào)函數(shù)定義的位置在主調(diào)函數(shù)之前,主調(diào)函數(shù)中可以省略對(duì)被調(diào)函數(shù)的聲明。int

max(int

x,inty){ruturn((x>y)?x:y);}voidmain(){…c=max(a,b);…}voidmain(){…

intmax(intx,inty);c=max(a,b);…}

int

max(int

x,inty){ruturn((x>y)?x:y);}函數(shù)聲明一、嵌套調(diào)用:在調(diào)用一個(gè)函數(shù)的過(guò)程中又調(diào)用另一個(gè)函數(shù)。

例如:int

fb(){……}int

fa(){…fb(“…”);…}voidmain(){……x=fa();……}調(diào)用fb函數(shù)調(diào)用fa函數(shù)7.4.1函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用執(zhí)行過(guò)程main函數(shù)調(diào)用fa函數(shù)結(jié)束fa函數(shù)調(diào)用fb函數(shù)fb函數(shù)fa函數(shù)結(jié)束fb函數(shù)結(jié)束遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用此函數(shù)本身。

7.4.2函數(shù)的遞歸調(diào)用用遞歸求解問(wèn)題的過(guò)程分為兩個(gè)階段:1.遞推階段:將原問(wèn)題不斷地轉(zhuǎn)化成子問(wèn)題。逐漸從未知向已知推進(jìn),最終到達(dá)已知解的問(wèn)題,遞推階段結(jié)束。2.回歸階段:從已知解的問(wèn)題出發(fā),按照遞推的逆過(guò)程,逐一求值回歸,最后到達(dá)遞歸的開(kāi)始處,結(jié)束回歸階段,獲得問(wèn)題的解。遞歸調(diào)用對(duì)應(yīng)的一般算法:f(x)=終了公式遞歸公式遞歸調(diào)用函數(shù)的一般形式為:類型標(biāo)識(shí)符

函數(shù)名(形參列表){……

if(遞歸調(diào)用的終止條件)語(yǔ)句1;

else

語(yǔ)句2;……return返回值}【例7.11】用遞歸方法計(jì)算n!longjc(intn){longt;if(n<0)

printf(“n<0,輸入數(shù)據(jù)錯(cuò)!”);elseif(n==0||n==1)return1;elsereturnn*jc(n-1);}計(jì)算n階乘的數(shù)學(xué)遞歸定義式:#include<stdio.h>voidmain(){longjc(intn);

intn;

printf("請(qǐng)輸入n:\n");

scanf("%d",&n);

printf("%d!=%ld\n",n,jc(n));}longjc(intn){longt;if(n<0)

printf(“n<0,輸入數(shù)據(jù)錯(cuò)!”);elseif(n==0||n==1)t=1;elset=n*jc(n-1);returnt;}對(duì)jc函數(shù)的聲明調(diào)用jc函數(shù)程序執(zhí)行順序圖例(假設(shè)n=3)main函數(shù)調(diào)用jc(3)結(jié)束jc(3)函數(shù)3*jc(2)jc(3)結(jié)束jc(2)函數(shù)2*jc(1)jc(2)結(jié)束jc(1)函數(shù)返回1jc(1)結(jié)束遞推遞推遞推回歸回歸回歸返回值1返回值2返回值6例:有5個(gè)人做在一起,問(wèn)第5個(gè)人多大歲數(shù)?他說(shuō)比第4個(gè)人大3歲。問(wèn)第4個(gè)人多大歲數(shù)?他說(shuō)比第3個(gè)人大3歲。問(wèn)第3個(gè)人多大歲數(shù)?他說(shuō)比第2個(gè)人大3歲。問(wèn)第2個(gè)人多大歲數(shù)?他說(shuō)比第1個(gè)人大3歲。最后問(wèn)第1個(gè)人,他說(shuō)自已是20歲。請(qǐng)問(wèn)第5個(gè)人多大?age(x)=20x=1age(x-1)+3x>1#include<stdio.h>int

age(intx){

if(x==1)retunr20;elsereturnage(x-1)+3;}voidmain(){

intz;z=age(5);

printf(“第5個(gè)人是:%d歲”,z;);}使用遞歸調(diào)用,最關(guān)鍵的是要確定以下兩點(diǎn):1)確定遞歸的終止條件;2)確定遞歸的形式---即求解的規(guī)律;7.5變量的作用域變量定義的位置不同,使得其作用范圍也不同。全局變量:在函數(shù)外面定義的變量,其作用域從變量定義的位置開(kāi)始到文件結(jié)束。局部變量::在函數(shù)內(nèi)部定義的變量,其作用域是所定義的函數(shù)。變量inta;

/*定義全局變量,可在main和fun函數(shù)中引用*/voidmain()

{

intfun(intz);函數(shù)聲明;int

x,y;

/*x、y為局部變量,只能在main函數(shù)中引用*/

…}intb;

/*b為全局變量,可在fun中引用*/fun(intz)

/*形參z為局部變量,可在fun函數(shù)中引用*/{

intc;

/*c為局部變量,可在fun函數(shù)中引用*/…}變量的作用域a變量的作用域b【例7.13】編寫(xiě)一個(gè)函數(shù),求兩個(gè)數(shù)的和與差。#include<stdio.h>

floatadd,diff;

/*全局變量*/voidfun(float

x,floaty){add=x+y;diff=x-y;}voidmain(){floata,b;

scanf("%f%f",&a,&b);

fun(a,b);printf("%.2f%.2f\n",add,diff);}注意:因?yàn)楹瘮?shù)值只能有一個(gè),所以當(dāng)需要通過(guò)函數(shù)得到兩個(gè)或多個(gè)值時(shí),就要定義全局變量。voidnum()

{extern

int

x,y;

inta=7,b=5;

x=a-b;

y=a+b;

}int

x,y;void

main()

{

inta=7,b=5;x=a-b;y=a+b;num();}x,y的原作用域

x,y新的作用域如果在全局變量定義位置之前或其他文件中的函數(shù)要引用該全局變量,應(yīng)該在引用之前用關(guān)鍵字extern對(duì)該變量做聲明,表示該變量是一個(gè)已經(jīng)定義的全局變量。當(dāng)全局變量與局部變量同名時(shí),在局部變量的作用范圍內(nèi)全局變量不起作用。【例7.15】全局變量與局部變量同名#include<stdio.h>floatadd=1,diff=1;/*全局變量*/voidfun(float

x,floaty){floatadd,diff;/*局部變量*/add=x+y;diff=x-y;}voidmain(){floata,b;scanf("%f%f",&a,&b);fun(a,b);printf("%.2f%.2f\n",add,diff);}7.6變量的存儲(chǔ)類別程序存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)用戶存儲(chǔ)空間分配示意圖存儲(chǔ)程序代碼全局變量函數(shù)的形參,auto變量,函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)和返回地址等1.靜態(tài)存儲(chǔ)方式:在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式,在靜態(tài)存儲(chǔ)區(qū)分配內(nèi)存的變量,直到整個(gè)程序運(yùn)行結(jié)束時(shí)才釋放內(nèi)存。

2.動(dòng)態(tài)存儲(chǔ)方式:指在程序運(yùn)行期間根據(jù)需要由系統(tǒng)動(dòng)態(tài)分配存儲(chǔ)空間的方式,在動(dòng)態(tài)存儲(chǔ)區(qū)分配內(nèi)存的變量,當(dāng)函數(shù)調(diào)用結(jié)束或復(fù)合語(yǔ)句結(jié)束時(shí),立即釋放內(nèi)存空間。

變量的存儲(chǔ)類別:變量的存儲(chǔ)類別有:auto自動(dòng)型:(缺省的都是auto型)

static靜態(tài)型register寄存器型extern外部型:一、auto變量(自動(dòng)變量)分配內(nèi)存位置:動(dòng)態(tài)存儲(chǔ)區(qū)生存期:需要時(shí)分配空間,不需要時(shí)被撤銷(xiāo);二、static變量(靜態(tài)變量)靜態(tài)型變量可分為靜態(tài)局部變量和靜態(tài)全局變量

靜態(tài)局部變量:分配內(nèi)存位置:靜態(tài)存儲(chǔ)區(qū);生存期:在程序運(yùn)行期間一直存在,直到程序結(jié)束被撤消。初始化:對(duì)靜態(tài)局部變量在編譯時(shí)賦初值,若沒(méi)有賦初值,則系統(tǒng)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。使用:只初始化一次,以后每次調(diào)用函數(shù)時(shí)不再重新賦初值,都是保留上一次函數(shù)調(diào)用結(jié)束時(shí)的值。例7.16】考察static(靜態(tài))局部變量與auto(自動(dòng))變量的區(qū)別。

#include"stdio.h"intfunc1(){staticints=5;/*靜態(tài)局部變量*/s+=1;return(s);}intfunc2(){ints=5;/*局部變量*/s+=1;return(s);}voidmain(){

inti;

for(i=0;i<3;i++)printf("%3d",func1());

printf("\n");

for(i=0;i<3;i++)printf("%3d",func2());}

靜態(tài)全局變量:如果在程序設(shè)計(jì)時(shí)希望某些全局變量只限于被本文件中的函數(shù)引用,而不能被其他文件中的函數(shù)引用,就可以在定義全局變量時(shí)加上static進(jìn)行聲明。3.register寄存器型在CPU的寄存器中分配存儲(chǔ)空間,訪問(wèn)速度快,并不是在內(nèi)存中分配存儲(chǔ)空間。4.extern外部型用于擴(kuò)展全局變量的作用域。課后練習(xí)和習(xí)題課后習(xí)題:函數(shù)調(diào)用的例子#include<stdio.h>voidmain(){voidprintstar();/*對(duì)printstar函數(shù)進(jìn)行聲明*/voidprint_message();/*對(duì)print_message函數(shù)進(jìn)行聲明*/

printstar();/*調(diào)用printstar函數(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論