《c程序設(shè)計(jì)授課》課件-第06章 函數(shù)與預(yù)處理_第1頁
《c程序設(shè)計(jì)授課》課件-第06章 函數(shù)與預(yù)處理_第2頁
《c程序設(shè)計(jì)授課》課件-第06章 函數(shù)與預(yù)處理_第3頁
《c程序設(shè)計(jì)授課》課件-第06章 函數(shù)與預(yù)處理_第4頁
《c程序設(shè)計(jì)授課》課件-第06章 函數(shù)與預(yù)處理_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第6章函數(shù)與預(yù)處理*重點(diǎn)與難點(diǎn)6.1模塊化軟件與C程序的模塊結(jié)構(gòu)6.2函數(shù)定義、參數(shù)和返回值6.3函數(shù)調(diào)用6.4函數(shù)中使用的變量6.5內(nèi)部函數(shù)與外部函數(shù)6.6多文件的程序運(yùn)行6.7預(yù)處理命令*本章小結(jié)*作業(yè)重點(diǎn)與難點(diǎn)重點(diǎn):函數(shù)的定義、聲明、參數(shù)傳遞和調(diào)用;函數(shù)的嵌套調(diào)用;變量的作用域與生存期。難點(diǎn):參數(shù)傳遞和函數(shù)的嵌套調(diào)用。6.1模塊化軟件與C程序的模塊結(jié)構(gòu)6.1.1模塊化軟件6.1.2C語言的模塊結(jié)構(gòu)6.1.1模塊化軟件模塊化:就是將一個(gè)較為復(fù)雜的、大型的項(xiàng)目按其功能與結(jié)構(gòu),劃分為若干個(gè)功能相對(duì)獨(dú)立的模塊(Module),每個(gè)模塊實(shí)現(xiàn)一個(gè)功能。C語言:是一種結(jié)構(gòu)化程序設(shè)計(jì)語言,結(jié)構(gòu)化程序設(shè)計(jì)的基本思想之一就是程序的“模塊化”。每個(gè)模塊在C語言中可以用函數(shù)來實(shí)現(xiàn)。6.1.2C語言的模塊結(jié)構(gòu)mainabcdefeghhiC程序的組成C程序:可以由一個(gè)或多個(gè)C源程序文件組成。在C語言中,一個(gè)C語言的源程序文件就是一個(gè)編譯單位。函數(shù):它是C源程序的基本模塊。函數(shù)分類從用戶使用的角度

標(biāo)準(zhǔn)庫函數(shù)與用戶自定義函數(shù)從有無函數(shù)返回值的角度

有返回值函數(shù)與無返回值函數(shù)從有無參數(shù)的角度

有參函數(shù)與無參函數(shù)6.2函數(shù)定義、參數(shù)和返回值6.2.1函數(shù)定義的一般形式6.2.2函數(shù)參數(shù)與參數(shù)傳遞6.2.3函數(shù)返回值6.2.1函數(shù)定義的一般形式1、無參函數(shù)2、有參函數(shù)3、空函數(shù)1、無參函數(shù)

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

類型說明語句

}voidprintmessage(){printf("\nHello!");}2、有參函數(shù)

類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)列表)

{

類型說明語句

}intmax(intx,inty){return(x>y?x:y);}3、空函數(shù)

類型說明符函數(shù)名()

{}

調(diào)用這種函數(shù)沒有任何實(shí)際作用,但在系統(tǒng)規(guī)劃的初期用于標(biāo)示各個(gè)部分,使得程序結(jié)構(gòu)清楚,可讀性好,以后擴(kuò)充新的功能方便。6.2.2函數(shù)參數(shù)與參數(shù)傳遞1、分類:形式參數(shù)和實(shí)際參數(shù)。2、形參:在函數(shù)定義的時(shí)候聲明的參數(shù)稱為形式參數(shù),簡(jiǎn)稱形參。形參是變量名。3、實(shí)參:在函數(shù)調(diào)用的時(shí)候使用到的參數(shù)稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參。實(shí)參是表達(dá)式。參數(shù)傳遞1、參數(shù)傳遞是實(shí)參傳遞給形參。2、傳遞要求:在參數(shù)傳遞的過程中,實(shí)參的個(gè)數(shù)必須與形參的個(gè)數(shù)一樣多,并且類型應(yīng)相同或保持兼容,否則系統(tǒng)會(huì)給出錯(cuò)誤。3、分類

值傳遞與地址傳遞值傳遞方式

一般采用的是單向的值傳遞,即將實(shí)參的值拷貝給形參。形參在調(diào)用前和調(diào)用后都是不存在的,只有函數(shù)被調(diào)用時(shí)形參才被分配相應(yīng)的存儲(chǔ)單元。實(shí)參與形參即使是同名的變量,它們也代表不同的存儲(chǔ)單元,互不影響。值傳遞圖示c=min(a,b);22ax33by函數(shù)調(diào)用開始28ax35by函數(shù)調(diào)用結(jié)束復(fù)制地址傳遞方式

如果形參是地址方式,實(shí)參傳遞給形參采用地址傳遞方式,即形參共用實(shí)參的地址,這樣,形參的改變也會(huì)間接地改變形參的值。6.2.3函數(shù)返回值函數(shù)的返回值是通過return語句返回主調(diào)函數(shù)。該語句的形式如下:return表達(dá)式;一個(gè)函數(shù)至多只能返回一個(gè)值。返回值類型

return語句的表達(dá)式的計(jì)算結(jié)果的類型常常與函數(shù)定義的返回類型不一致。這時(shí)應(yīng)該以哪一個(gè)為準(zhǔn)呢?(1)C語言規(guī)定,函數(shù)的返回值的類型以函數(shù)定義的類型為準(zhǔn)。(2)如果return語句中的表達(dá)式是數(shù)值型的,系統(tǒng)自動(dòng)進(jìn)行類型轉(zhuǎn)換。如果系統(tǒng)不能自動(dòng)轉(zhuǎn)換的,則需要編程人員進(jìn)行強(qiáng)制轉(zhuǎn)換。函數(shù)默認(rèn)類型

如果在函數(shù)定義時(shí)沒有指定返回值的類型,系統(tǒng)默認(rèn)為int型的。無return語句如果被調(diào)用函數(shù)中沒有return語句,是不是沒有返回值呢?

其實(shí)不是,函數(shù)仍然返回一個(gè)值,只不過這個(gè)值是不確定的、也不是用戶所希望得到的。如果一個(gè)函數(shù)沒有返回值,最好是用void明確地表示出來。這樣,可以保證函數(shù)正確調(diào)用,減少出錯(cuò)。6.3函數(shù)調(diào)用6.3.1函數(shù)的一般調(diào)用6.3.2函數(shù)的嵌套調(diào)用6.3.3函數(shù)的遞歸調(diào)用6.3.1函數(shù)的一般調(diào)用函數(shù)名(實(shí)參表列)函數(shù)調(diào)用形式(1)函數(shù)語句

printf("WelcometoClanguage.");(2)函數(shù)表達(dá)式

c=max(a,b);(3)函數(shù)作參數(shù)

d=max(a,max(b,c));

6.3.2函數(shù)的嵌套調(diào)用main函數(shù)調(diào)用a函數(shù)結(jié)束①②⑨a函數(shù)③調(diào)用b函數(shù)⑦⑧④b函數(shù)⑤⑥舉例:用弦截法求方程的根。

xy自定義函數(shù)1、f(x)=2、xpoint(,)=3、root(x1,x2)函數(shù)調(diào)用關(guān)系main函數(shù)root輸出根x結(jié)束rootxpointxpointff函數(shù)root函數(shù)floatroot(floatx1,floatx2){floatx,y,y1=f(x1);do{x=point(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0001);return(x);}6.3.3函數(shù)的遞歸調(diào)用f函數(shù)調(diào)用f函數(shù)1)直接調(diào)用自身f1函數(shù)調(diào)用f2函數(shù)f2函數(shù)調(diào)用f1函數(shù)2)間接調(diào)用自身遞歸的兩個(gè)階段回推和遞推回推到可以確定值(即遞歸結(jié)束條件)時(shí)結(jié)束;遞推從起初值開始進(jìn)行迭代。

1(n=0,1)/*遞歸結(jié)束條件*/f(n)=n*f(n-1)(n>1)4!的回推與遞推舉例回推

f(4)=4*f(3)=4*3*f(2)=4*3*2*f(1)

遞推

f(1)=1f(2)=2*f(1)=2f(3)=3*f(2)=3*2=6f(4)=4*f(3)=4*6=24遞歸調(diào)用實(shí)質(zhì)在不能計(jì)算出結(jié)果時(shí),先壓棧;在能夠計(jì)算時(shí),逐個(gè)出棧。例6.8利用遞歸算法求Fibonacci數(shù)列

0(n=0)f(n)=1(n=1)f(n-1)+f(n-2)(n>1)longf(intn){longc;if(n==0)c=0;elseif(n==1)c=1;elsec=f(n-1)+f(n-2);return(c);}課堂訓(xùn)練自定義兩個(gè)函數(shù)實(shí)現(xiàn):(1)判斷一個(gè)整數(shù)是否為完數(shù);(2)在屏幕上顯示完數(shù)的因子。要求:在main函數(shù)中輸入整數(shù),并調(diào)用上述兩個(gè)函數(shù)進(jìn)行測(cè)試。6.4函數(shù)中使用的變量6.4.1局部變量與全局變量6.4.2變量的存儲(chǔ)方式6.4.3變量的存儲(chǔ)類別6.4.1局部變量與全局變量1、局部變量2、全局變量1、局部變量在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量,也稱局部變量。局部變量只在定義它的函數(shù)范圍內(nèi)有效(即可以使用),在其他函數(shù)不能使用。局部變量舉例floatf1(inta){intb,c;...}charf2(intx,inty){inti,j;....}main(){inta,b;...{intc;c=a+b;}}a,b,c有效x,y,i,j有效c有效a,b有效2、全局變量程序的編譯單位是源程序文件,一個(gè)源文件可以包含一個(gè)或若干個(gè)函數(shù)。在函數(shù)內(nèi)定義的變量是局部變量;而在函數(shù)外定義的變量是外部變量,也稱全局變量。全局變量的有效范圍:從定義變量的位置開始到本源文件結(jié)束。全局變量舉例intp=1,q=5;floatf1(a){intb,c;...}chara,b;charf2(intx,inty){inti,j;....}main(){inta,b;......{charc;c=a+b;}....}a,b,c有效x,y,i,j有效c有效a,b有效全局變量a,b有效全局變量p,q有效例6.9全局變量ainta=10;fun(inti){a+=2*i;returna;}main(){inta=10;printf("\n%d,%d",fun(a),a);printf("\n%d,%d",fun(a),a);}運(yùn)行結(jié)果:20,1040,10例6.10有一個(gè)數(shù)組存放10個(gè)學(xué)生的成績(jī),編一個(gè)函數(shù)求出10個(gè)學(xué)生的平均成績(jī)、最高分和最低分。floatmax=0,min=0;floataveragescore(floata[],intn){inti;floatsum=a[0];max=min=a[0];for(i=1;i<n;i++)if(a[i]>max)max=a[i];elseif(a[i]<min)min=a[i];sum=sum+a[i];return(sum/n);}地址傳遞全局變量應(yīng)慎用全局變量在程序執(zhí)行過程中一直占用內(nèi)存。降低了函數(shù)的通用性。使用全局變量過多,會(huì)降低程序的可讀性。建議不在必要時(shí)不要使用全局變量。6.4.2變量的存儲(chǔ)方式用戶區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)靜態(tài)存儲(chǔ)方式靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。全局變量和靜態(tài)(static)變量全部存放在靜態(tài)存儲(chǔ)區(qū)。靜態(tài)存儲(chǔ)方式在程序執(zhí)行過程中一直占據(jù)固定的存儲(chǔ)單元,直到程序執(zhí)行完畢才釋放。動(dòng)態(tài)存儲(chǔ)方式動(dòng)態(tài)存儲(chǔ)方式:是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)分配存儲(chǔ)空間的方式。在動(dòng)態(tài)存儲(chǔ)區(qū)存放如下數(shù)據(jù):形參、非靜態(tài)變量、堆棧(函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)和返回地址)。動(dòng)態(tài)存儲(chǔ)方式根據(jù)函數(shù)調(diào)用的需要,動(dòng)態(tài)地分配和釋放存儲(chǔ)空間。6.4.3變量的存儲(chǔ)類別在C語言中,每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和存儲(chǔ)類別。存儲(chǔ)類別分四類存儲(chǔ)類別含義auto自動(dòng),動(dòng)態(tài)存儲(chǔ)方式,可以省略static靜態(tài),靜態(tài)存儲(chǔ)方式register寄存器,CPU的寄存器extern外部,聲明外部變量auto變量autointb,c=3;intb,c=3;兩者等價(jià)staticf(inta){autointb=0;

staticintc=3;b=b+1;c=c+1;

return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf("%d",f(a));}運(yùn)行結(jié)果:789為何結(jié)果不是:777呢?

原因:static型變量是在編譯時(shí)賦初值的,只賦值一次,即在程序運(yùn)行時(shí)它已有初值。

舉例打印1~5的階乘值intfac(intn){staticintf=1;f=f*n;return(f);}main(){inti;for(i=1;i<=5;i++)printf("\n%d!=%d",i,fac(i));}運(yùn)行結(jié)果1!=12!=23!=64!=245!=120慎用static變量static變量長期占用內(nèi)存,直到程序執(zhí)行完才釋放。降低了程序的可讀性。register變量寄存器的存取時(shí)間比內(nèi)存要快C語言允許頻繁使用的局部變量的值存放在cpu的寄存器中。registerinti;Turboc將register變量作auto變量處理。用extern聲明外部變量編譯時(shí),將外部變量(即全局變量)分配在靜態(tài)存儲(chǔ)區(qū)。如果外部變量定義處在后或在其他文件中并且使用在前時(shí),則需要對(duì)它進(jìn)行聲明。聲明分為:1、在一個(gè)文件內(nèi)聲明外部變量2、在多文件的程序中聲明外部變量聲明與定義定義:是定義性聲明,需要建立存儲(chǔ)空間。定義只能有一次。聲明:是引用性聲明。聲明可以出現(xiàn)多次。聲明的作用是一個(gè)已在后面定義的外部變量,僅僅是為了“提前”引用該變量而作的“聲明”。聲明要求外部變量已經(jīng)定義。例6.13外部變量聲明main(){externx,y;intz;z=x*y;printf(\nz=%d",z);}intx=2,y=3;例6.14在多文件的程序中聲明外部變量*eg0614a.cinta=4;intmax(intx,inty){return(x>y?x:y);}*eg0614b.cexterna;main(){intx=2,y=3,z;z=x*a+a*y*max(x,y);printf("\nz=%d",z);}6.5內(nèi)部函數(shù)與外部函數(shù)1、內(nèi)部函數(shù)2、外部函數(shù)1、內(nèi)部函數(shù)如果一個(gè)函數(shù)只能被本文件中的其他函數(shù)調(diào)用,而不能被其他文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)(或稱靜態(tài)函數(shù))。定義內(nèi)部函數(shù)的一般形式是(函數(shù)頭):static

類型說明符函數(shù)名(形參表)2、外部函數(shù)若一個(gè)函數(shù)除了可以被本文件中的其他函數(shù)調(diào)用外,還可以被程序中的其他源文件的函數(shù)調(diào)用,這樣的函數(shù)稱為外部函數(shù)。它的定義一般形式:extern

類型說明符函數(shù)名(形參表)注意:extern可以省略例6.15內(nèi)部函數(shù)與外部函數(shù)*eg0615a.cexterninta;externintmax(intm,intn);staticintz=12;staticintmin(intx,inty){return(x<y?x:y);}main(){intx=2,y=3;printf("max=%d,min=%d",max(x,y),min(a,z));}*eg0615b.cinta=10;intmax(intm,intn){if(m>=n)return(m);elsereturn(n);}6.6多文件的程序運(yùn)行1、工程方法2、文件包含方法1、工程方法2、文件包含方法在eg0615.c的開始添加一行:

#include<eg0615b.c>在文件包含方式中,由于最終生成一個(gè)目標(biāo)文件。所以關(guān)于變量、函數(shù)的聲明都不必要了。6.7預(yù)處理命令在前面章節(jié)已經(jīng)使用了如下形式:

#definePI3.14#include<stdio.h>預(yù)處理命令A(yù)NSIC標(biāo)準(zhǔn)規(guī)定可以在C源程序中加入一些“預(yù)處理命令”,以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。預(yù)處理命令不是C語言本身的組成部分,必須在正式編譯前進(jìn)行處理。C提供的預(yù)處理功能主要有一下3種:1、宏定義2、文件包含3、條件編譯6.7.1宏定義1、不帶參數(shù)的宏定義2、帶參數(shù)的宏定義1、不帶參數(shù)的宏定義一般形式

#define標(biāo)識(shí)符字符串不帶參數(shù)的宏常用來表示符號(hào)常量舉例

#definePI3.1415926宏定義的作用宏定義是用宏名代替一個(gè)字符串,即只作簡(jiǎn)單的置換,不作正確性檢查。也不分配存儲(chǔ)空間。舉例

#definePI3.14;area=PI*r*r;展開后如下:

area=3.14;*r*r;/*error*/宏定義的作用域宏名的有效范圍為定義命令之后到本源文件結(jié)束。可以用#undef命令終止宏定義的作用域。宏的作用域舉例#defineG9.8main(){....}#undefGf1(){.....}G的作用范圍宏的層層置換#defineR3.0#definePI3.14#defineL2*PI*R#defineSPI*R*Rmain(){printf("\nL=%f\nS=%f",L,S);}注意:雙括號(hào)括起來的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換。9.1.2帶參數(shù)的宏定義一般形式

#define宏名(參數(shù)表)字符串帶參數(shù)宏舉例(例6.17)#definePI3.14#defineS(r)PI*r*rmain(){floata,area;a=3.6;area=S(a);printf("\nr=%farea=%f",a,area);}area=S(a+3);是否代表圓的面積?帶參數(shù)宏與函數(shù)形式相同,容易混淆不同之處主要有:(1)函數(shù)調(diào)用需要參數(shù)檢查;宏只作簡(jiǎn)單置換。(2)函數(shù)調(diào)用在程序運(yùn)行時(shí)處理,分配內(nèi)存單元;宏展開在正式編譯前進(jìn)行,不分配存儲(chǔ)單元,無返回值概念。(3)函數(shù)調(diào)用占運(yùn)行時(shí)間,源程序保持不變;宏展開只占編譯時(shí)間,展開后源程序變長。舉例:可以得到多個(gè)結(jié)果的宏#definePI3.14#defineCIRCLE(R,L,S)L=2*PI*R;S=PI*R*R;main(){floatr,l,s;printf("\nr=");scanf("%f",&r);CIRCLE(r,l,s);printf("r=%f,l=%f,s=%f",r,l,s);}同時(shí)得到了l,s的結(jié)果6.7.2“文件包含”處理“文件包含”處理是指一個(gè)源文件可以將另外一個(gè)源文件的全部包含進(jìn)來。一般形式

#include"文件名"或

#include<文件名>兩種包含形式比較#include<file2.c>:系統(tǒng)到存放C庫函數(shù)文件所在的目錄中尋找要包含的文件,這種稱為標(biāo)準(zhǔn)方式。#include"file2.c":系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含的文件,如果找不到,再按標(biāo)準(zhǔn)方式查找?!拔募钡暮xfile1.c#include<file2.c>file2.cBAfile1.cAB“文件包含”的實(shí)質(zhì)被包含的文件與其所在的文件,在預(yù)編譯后已經(jīng)成為同一個(gè)文件(而不是兩個(gè)文件)。被包含的文件的外部變量作用域擴(kuò)展到了包含文件,所以不必用extern聲明。6.7.3條件編譯一般情況下,源程序中所有的行都參加編譯。但如果對(duì)其中一部分內(nèi)容只在滿足一定條件才進(jìn)行編譯,這就是“條件編譯”。條件編譯形式1)#ifdef標(biāo)識(shí)符程序段1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論