C語言程序設(shè)計(jì)(微課版)ch7-函數(shù)_第1頁
C語言程序設(shè)計(jì)(微課版)ch7-函數(shù)_第2頁
C語言程序設(shè)計(jì)(微課版)ch7-函數(shù)_第3頁
C語言程序設(shè)計(jì)(微課版)ch7-函數(shù)_第4頁
C語言程序設(shè)計(jì)(微課版)ch7-函數(shù)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)第七章函數(shù)第七章函數(shù)第7章函數(shù)

7.1函數(shù)定義和函數(shù)調(diào)用

7.2函數(shù)的嵌套調(diào)用和遞歸調(diào)用

7.3局部變量和全局變量

7.4變量的存儲類別

7.5內(nèi)部函數(shù)和外部函數(shù)函數(shù)概述程序設(shè)計(jì)有兩大最高級的藝術(shù)算法設(shè)計(jì)藝術(shù)結(jié)構(gòu)設(shè)計(jì)藝術(shù)函數(shù)(function)是結(jié)構(gòu)設(shè)計(jì)的最基本單位“一個程序應(yīng)該是輕靈自由的,它的子過程就象串在一根線上的珍珠?!薄狦eoffreyJames的《編程之道》函數(shù)是C語言的基本組成單元。每個函數(shù)用來完成某一特定的功能。把單一功能做成函數(shù)的方式,有利于軟件的復(fù)用。第七章函數(shù)函數(shù)概述C程序的函數(shù)有兩種:標(biāo)準(zhǔn)庫函數(shù):由系統(tǒng)提供,如:sqrt(x),exp(x)。自定義函數(shù):用戶自定義函數(shù)第七章函數(shù)7.1函數(shù)定義和函數(shù)的調(diào)用

返回值類型

函數(shù)名

(參數(shù)表)

{

函數(shù)體

return表達(dá)式;

}返回值類型與return語句配合

如果不需要返回值,則應(yīng)該用void

定義返回值類型。當(dāng)函數(shù)執(zhí)行到return語句時,就中止函數(shù)的執(zhí)行,返回到調(diào)用它的地方。函數(shù)內(nèi)部可以定義只能自己使用的變量,稱內(nèi)部變量。參數(shù)表里的變量也是內(nèi)部變量第七章函數(shù)函數(shù)名命名Windows風(fēng)格函數(shù)名命名用大寫字母開頭的單詞組合而成變量名形式“名詞”或者“形容詞+名詞”如變量名OldValue與NewValue等函數(shù)名形式“動詞”或者“動詞+名詞”(動賓詞組)如函數(shù)名GetMax()等第七章函數(shù)對函數(shù)接口加以注釋說明/*函數(shù)功能:實(shí)現(xiàn)××××功能

函數(shù)參數(shù):參數(shù)1,表示×××××

參數(shù)2,表示×××××

函數(shù)返回值:×××××*/

返回值類型函數(shù)名

(參數(shù)表){

函數(shù)體

return表達(dá)式;}第七章函數(shù)【例7.1a】計(jì)算兩個整數(shù)的平均數(shù)/*

函數(shù)功能:計(jì)算平均數(shù)

函數(shù)入口參數(shù):整型x,存儲第一個運(yùn)算數(shù)整型y,存儲第二個運(yùn)算數(shù)

函數(shù)返回值:平均數(shù)*/intAverage(intx,inty){ intresult; result=(x+y)/2;

returnresult;}第七章函數(shù)函數(shù)調(diào)用(call)單向值傳遞調(diào)用函數(shù)時,必須提供所有的參數(shù)提供的參數(shù)個數(shù)、類型、順序與定義時相同有返回值時放到一個數(shù)值表達(dá)式中,如c=max(a,b);

作為另一個函數(shù)調(diào)用的參數(shù),如

c=max(max(a,b),c);printf("%d\n",max(a,b));無返回值時函數(shù)調(diào)用表達(dá)式,如display(a,b);第七章函數(shù)【例7.1b】

使用了Average函數(shù)的main()

#include<stdio.h>intAverage(intx,inty){

intresult; result=(x+y)/2;

returnresult;}main(){

inta=12;

intb=24;

intave; ave=Average(a,b); printf("Averageof%dand%dis%d.\n",a,b,ave);}intAverage(intx,inty){intresult;result=(x+y)/2;returnresult;}main(){inta=12;intb=24;intave;ave=Average(a,b);

printf(……);}數(shù)據(jù)傳遞執(zhí)行順序第七章函數(shù)函數(shù)原型(prototype)調(diào)用一個函數(shù)之前,先要對其返回值類型、函數(shù)名和參數(shù)進(jìn)行聲明(declare)

不對函數(shù)進(jìn)行聲明是非常危險的聲明時不要省略參數(shù)以及返回值的類型第七章函數(shù)#include<stdio.h>intAverage(intx,inty){ intresult; result=(x+y)/2; returnresult;}main(){ inta=12; intb=24; intave=Average(a,b); printf("Averageof%dand%dis%d.\n",a,b,ave);}【例7.1】第七章函數(shù)#include<stdio.h>int

Average(intx,inty);/*聲明Average()函數(shù)*/main(){

inta=12;

intb=24;

intave=Average(a,b);

printf("Averageof%dand%dis%d.\n",a,b,ave);}intAverage(intx,inty)/*計(jì)算兩個整數(shù)的平均數(shù)*/{

intresult; result=(x+y)/2;

returnresult;}【例7.1】第七章函數(shù)7.2.1函數(shù)的嵌套調(diào)用

在被調(diào)函數(shù)中,又調(diào)用了函數(shù)----嵌套調(diào)用7.2函數(shù)的嵌套調(diào)用和遞歸調(diào)用

main(){……...}a函數(shù){……}b函數(shù){………}①③④⑤⑥⑦②第七章函數(shù)【例7.7】

編寫程序,輸入n,m,求組合數(shù)#include<stdio.h>voidmain(){intm,n;longcmn(int,int);

scanf("%d%d",&m,&n);printf("cmn=%ld\n",cmn(m,n));}longJc(intn){inti;longt=1;for(i=1;i<=n;i++)t*=i;return(t);}longcmn(intm,intn){return(Jc(m)/(Jc(n)*Jc(m-n)));}第七章函數(shù)7.2.2函數(shù)的遞歸調(diào)用

當(dāng)一個函數(shù)直接或間接的調(diào)用它自身時,稱為函數(shù)的遞歸調(diào)用。前者稱為直接遞歸,后者稱為間接遞歸第七章函數(shù)7.7.2函數(shù)的遞歸調(diào)用遞歸方法:兩步:遞推、回歸。例如:求4!4!=4*3!→3!=3*2!→2!=2*1!→1!=1*0!→0!=14!=4*6←3!=3*2←2!=2*1←1!=1*1←0!=1第七章函數(shù)【例7.8】

用遞歸計(jì)算n!#include<stdio.h>longJc(intn){longf;

if(n==1||n==0)f=1;elsef=n*Jc(n-1);returnf;}voidmain(){longy;intn;scanf("%d",&n);y=Jc(n);printf("%d!=%ld",n,y);}main函數(shù)y=Jc(3)jc函數(shù)f=3*Jc(2)jc函數(shù)f=2*Jc(1)jc函數(shù)f=1return1jc函數(shù)f=2*Jc(1)return2jc函數(shù)f=3*Jc(2)return6第七章函數(shù)【例7.9】

把十進(jìn)制整數(shù)按相反的順序?qū)⒏魑粩?shù)字打印出來。如:print(123456);輸出:654321#include<stdio.h>voidprint(longn){if(n==0)return;

else

{printf("%d",n%10);

print(n/10);

return;

}}voidmain(){longn;scanf("%ld",&n);

print(n);}運(yùn)行結(jié)果如下:

123456↙654321第七章函數(shù)7.3局部變量和全局變量變量的分類作用域:變量的有效范圍(空間)局部變量全局變量生存期:變量存在的時間(時間)靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束第七章函數(shù)7.3.1局部變量(內(nèi)部變量)定義:在函數(shù)內(nèi)定義的變量。作用域:在本函數(shù)內(nèi)有效。

說明:(1)main函數(shù)中定義的變量只在

main函數(shù)中有效。(2)形參屬于局部變量。(3)不同函數(shù)中同名變量,占不同內(nèi)存單元。(4)在復(fù)合語句中定義的變量,只在本復(fù)合語句中有效。7.3局部變量和全局變量voidmain(){inta,b,c;a=1;b=2;

c=a+b;

{intc;

c=a-b;printf("%d\n",c);

}printf("%d\n",c);}輸出:-13第七章函數(shù)7.3.2全局變量(外部變量)定義:在函數(shù)外部定義的變量。作用域:從定義的位置到本文件結(jié)束。7.3局部變量和全局變量x,i,ja,b,c,dm,nc1,c2a1,a2inta1=1,a2=5;

floatf1(floatx){inti,j;......}charc1,c2;charf2(inta,intb){intc,d;......}voidmain(){intm,n;......}第七章函數(shù)注意:

(1)設(shè)置全局變量的作用是增加了函數(shù)間數(shù)據(jù)傳遞的通道。(2)全局變量定義時未初始化,系統(tǒng)為其賦初值0。(3)若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),同名的全局變量不起作用。7.3局部變量和全局變量【例7.10】編寫函數(shù)求兩個數(shù)的和與積。#include<stdio.h>floatadd,mult;voidfunc(floatx,floaty){add=x+y;

mult=x*y;}voidmain(){floata,b;scanf("%f%f",&a,&b);func(a,b);printf("%.2f%.2f\n",add,mult);}運(yùn)行情況如下:38↙11.0024.00第七章函數(shù)注意:

(4)當(dāng)全局變量定義在后,引用在前時,應(yīng)在引用它的函數(shù)中用extern

對此全局變量進(jìn)行聲明(說明)。7.3局部變量和全局變量【例7.11】用extern聲明外部變量,擴(kuò)展它在程序文件中的作用域#include<stdio.h>intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){

externA,B;

printf("%d",max(A,B));}intA=8,B=2;第七章函數(shù)

(5)當(dāng)一個程序由多個源文件組成時,如果想在一個文件中引用另一個文件中的已定義的外部變量,要用extern對該變量進(jìn)行聲明。文件a1.c中的內(nèi)容為:#include<stdio.h>inta;

main(){intpower(int);intd,m;printf("enteranumberanditspower:\n");scanf("%d,%d",&a,&m);d=power(m);printf("%d**%d=%d",a,m,d);}文件a2.c中的內(nèi)容為:externa;

intpower(intn){inti,y=1;for(i=1;i<=n;i++)y*=a;return(y);}【例7.12】用extern將外部變量的作用域擴(kuò)展到其他文件。第七章函數(shù)intx=1,y=2;voidsub(inty){

x++;y++;printf(“(1)x=%d,y=%d\n”,x,y);}voidmain(){intx=5;sub(x);printf(“(2)x=%d,y=%d\n”,x,y);}練習(xí):程序結(jié)果(1)x=2,y=6(2)x=5,y=2第七章函數(shù)#include<stdio.h>intm=10,n=100;voidde(){intn=100;

n-=20;

m-=2;}main(){intn=80;

for(;n>=60;){de();

n=n-20;

printf(“%d\n”,n+m);}}de()函數(shù)中局部變量n的作用域main()中局部變量n的作用域全局變量m,n的作用域運(yùn)行結(jié)果:6846全局變量可以與局部變量同名。在局部變量的作用范圍內(nèi),全局變量不起作用。第七章函數(shù)7.4變量的存儲類型變量的屬性:intx;

數(shù)據(jù)類型:如int,float等。

存儲類型:是指數(shù)據(jù)在內(nèi)存中的存儲方式。分兩大類:靜態(tài)存儲類動態(tài)存儲類用戶內(nèi)存空間靜態(tài)存儲區(qū)動態(tài)存儲區(qū)程序區(qū)具體包括四種:自動的(auto),靜態(tài)的(static),寄存器的(register),外部的(extern)。變量定義的形式:存儲類型標(biāo)識符類型標(biāo)識符變量名;例如:autointx;或intx;第七章函數(shù)7.4變量的存儲類型auto自動變量——動態(tài)存儲區(qū)

register寄存器變量——CPU中的寄存器

extern外部變量——靜態(tài)存儲區(qū)

static靜態(tài)變量——靜態(tài)存儲區(qū)存儲類型程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)形參、自動變量、函數(shù)調(diào)用的現(xiàn)場等全局變量、靜態(tài)變量存放數(shù)據(jù)第七章函數(shù)7.4變量的存儲類型局部變量的存儲方式(三種)自動變量靜態(tài)局部變量寄存器變量第七章函數(shù)1、自動變量(auto)

“自動”體現(xiàn)在進(jìn)入語句塊時自動申請內(nèi)存,退出時自動釋放內(nèi)存對它們分配和釋放存儲空間的工作由編譯系統(tǒng)自動處理,故稱其為自動變量標(biāo)準(zhǔn)定義格式

auto類型名變量名;動態(tài)局部變量缺省的存儲類型不初始化時,值是不確定的例如:intf(inta)/*形參a為自動變量,auto省略*/{autointb,c=3;/*定義b,c為自動變量*/……}第七章函數(shù)2、靜態(tài)局部變量

有時希望函數(shù)中局部變量的值在函數(shù)調(diào)用結(jié)束后不消失(以后一直存在,并總是保持它的最新值,即具有記憶性。)即不釋放存儲單元。此時可指定該變量為“靜態(tài)局部變量”,用關(guān)鍵字“static”說明。靜態(tài)局部變量系統(tǒng)自動初始化為0。存放在靜態(tài)存儲區(qū)中第七章函數(shù)2、靜態(tài)局部變量有時希望函數(shù)中局部變量的值在函數(shù)調(diào)用結(jié)束后不消失(以后一直存在,并總是保持它的最新值,即具有記憶性。)即不釋放存儲單元。此時可指定該變量為“靜態(tài)局部變量”,用關(guān)鍵字“static”說明。靜態(tài)局部變量系統(tǒng)自動初始化為0。存放在靜態(tài)存儲區(qū)中

靜態(tài)變量和全局變量都是靜態(tài)存儲類型

自動初始化為0

從靜態(tài)存儲區(qū)分配,生存期為整個程序運(yùn)行期間但作用域不同第七章函數(shù)【例7.13】考察靜態(tài)局部變量的值#include<stdio.h>intfunc(inta){intb=0;

staticintc

=

1;

b

=

b

+

1;

c

=

c

+

1;return(

a

+

b

+

c

);}voidmain(){inta=2,i;for(i=0;i<3;i++)printf("%d",func(a));}分析:i=0時:

a:2b:0

c:1b:1

c:2a+b+c=2+1+2=5;運(yùn)行結(jié)果:567分析:i=1時:

a:2b:0

c:2b:1

c:3a+b+c=2+1+3=6;第七章函數(shù)3、寄存器變量(register)對頻繁使用的變量,為減少存取變量花費(fèi)的時間,C語言允許將局部變量的值存放在CPU運(yùn)算器的寄存器中,稱為“寄存器變量”,用關(guān)鍵字“register”說明。說明:寄存器變量的類型一般只限于整型、字符型或指向整型、字符型的指針,且只用于局部變量和形參。因此,全局寄存器變量是非法的。不能定義任意多個寄存器變量,因?yàn)橐粋€計(jì)算機(jī)系統(tǒng)中寄存器的數(shù)目是有限的。不能取寄存器變量的地址第七章函數(shù)7.5內(nèi)部函數(shù)和外部函數(shù)1.

內(nèi)部函數(shù)

內(nèi)部函數(shù)只能被本文件中的其他函數(shù)所調(diào)用。

在定義函數(shù)時,在前面加static

即:

static

類型標(biāo)識符函數(shù)名(形參表)例如:

staticfloatfun(floatx,floaty){……}第七章函數(shù)7.5內(nèi)部函數(shù)和外部函數(shù)2.外部函數(shù)(1)在定義函數(shù)時,在前面加上extern,則表示該函數(shù)為外部函數(shù),可供其他文件調(diào)用。如

externfloatfun(floatx,floaty){……}

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論