版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第六章函數(shù)與編譯預(yù)處理
6.1模塊化程序設(shè)計(jì)與函數(shù)6.2函數(shù)的定義與調(diào)用6.3函數(shù)的遞歸調(diào)用6.4變量作用域與存儲(chǔ)方式
6.5編譯預(yù)處理6.6函數(shù)設(shè)計(jì)舉例
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
模塊化程序設(shè)計(jì)求解較小問題的算法和程序稱作“功能模塊”?;舅枷耄簩⒁粋€(gè)大的程序按功能分割成一些小模塊特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計(jì)的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充開發(fā)方法:自上向下,逐步分解,分而治之6.1模塊化程序設(shè)計(jì)與函數(shù)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理模塊與函數(shù)
C語言程序由基本語句和函數(shù)組成,每個(gè)函數(shù)可完成相對(duì)獨(dú)立的任務(wù),依一定的規(guī)則調(diào)用這些函數(shù),就組成了解決某個(gè)特定問題的程序。把大任務(wù)分解成若干功能模塊,用多個(gè)函數(shù)來實(shí)現(xiàn)這些功能模塊。通過函數(shù)的調(diào)用來實(shí)現(xiàn)完成大任務(wù)的全部功能。任務(wù)、模塊與函數(shù)的關(guān)系:
一個(gè)大任務(wù)分成多個(gè)功能模塊,功能模塊則由一個(gè)或多函數(shù)實(shí)現(xiàn)。模塊化的程序設(shè)計(jì)是靠設(shè)計(jì)函數(shù)和調(diào)用函數(shù)實(shí)現(xiàn)的。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理例ex1.c:分?jǐn)?shù)排序任務(wù):輸入三個(gè)數(shù),從大到小的順序的輸出。如果大于等于85,在該數(shù)后面輸出‘A’,
小于85且大于等于70,則輸出‘B’,
小于70且大于等于60,輸出‘C’,
如果小于60,則輸出‘D’。思路:輸入分?jǐn)?shù)
排序
判斷并輸出等級(jí)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
voidsortabc(floata,floatb,floatc){floatt;
if(a<b){t=a;a=b;b=t;}/*交換a,和b的值*/
if(b<c){t=b;b=c;c=t;}/*交換b,和c的值*/
if(a<b){t=a;a=b;b=t;}/*交換a,和b的值*/}
scanf("%f,%f,%f",&a,&b,&c);
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理(1)/*輸入*/(2)/*排序*/
chargrade(floatx){if(x>=85)
return('A');
elseif(x>=70)
return('B');else
if(x>=60)
return('C');else
return('D');
}(3)/*判斷并輸出等級(jí)*/
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理/*根據(jù)x的值,得到等級(jí)標(biāo)準(zhǔn)*//*判別等級(jí)并輸出*/
voidputabc(floata,floatb,floatc){charg;g=grade(a);
printf("%6.1f:%c",a,g);g=grade(b);
printf("%6.1f:%c",b,g);g=grade(c);
printf("%6.1f:%c",c,g);}
voidmain(){floata,b,c;
scanf("%f,%f,%f",&a,&b,&c);/*輸入*/
sortabc(a,b,c);/*排序*/
putabc(a,b,c);/*分等級(jí)并輸出a,b,c三個(gè)數(shù)*/}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理/*主函數(shù)*/模塊設(shè)計(jì)的原則模塊獨(dú)立規(guī)模適當(dāng)層次分明功能專一
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理獨(dú)立性原則表現(xiàn)在模塊完成獨(dú)立的功能,和其它模塊間的關(guān)系簡單,各模塊可以單獨(dú)調(diào)試。修改某一模塊,不會(huì)造成整個(gè)程序的混亂。每個(gè)模塊完成一個(gè)相對(duì)獨(dú)立的特定子功能。在對(duì)任務(wù)逐步分解時(shí),要注意對(duì)問題的綜合。例如,一些模塊的相似的子任務(wù),可以把它們綜合起來考慮,找出它們的共性,把它們做成一個(gè)完成特定任務(wù)的單獨(dú)模塊。每個(gè)模塊有特定功能1、模塊獨(dú)立
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理模塊之間最好只通過數(shù)據(jù)傳遞發(fā)生聯(lián)系,而不發(fā)生控制聯(lián)系。例如,C語言禁止goto語句作用到另一個(gè)函數(shù),就是為了保證函數(shù)的獨(dú)立性。每個(gè)模塊力求簡單模塊內(nèi)使用的數(shù)據(jù),對(duì)于不需要這些數(shù)據(jù)的其它模塊來說,應(yīng)該不允許使用;在一個(gè)模塊內(nèi)的變量的修改不會(huì)影響其它模塊的數(shù)據(jù)。即模塊的私有數(shù)據(jù)只屬于這個(gè)模塊。C語言的局部變量,就是滿足模塊獨(dú)立的的需要。每個(gè)模塊應(yīng)用獨(dú)立變量
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
模塊不能太大,但也不能太小。模塊的功能復(fù)雜,可讀性就不好,而且也違背獨(dú)立性原則。但如果做得太小,實(shí)際上也會(huì)復(fù)雜各個(gè)模塊間反復(fù)調(diào)用,可讀性也會(huì)降低。這點(diǎn)需要慢慢積累經(jīng)驗(yàn),好好把握。2、規(guī)模適當(dāng)3、層次分明要多層次的分解任務(wù),注意對(duì)問題進(jìn)行抽象化
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理算法簡介什么是算法?通俗地說,算法是解決一類特定問題的方法和步驟。算法是一個(gè)有限操作的序列。算法的每一步都是確定的。算法的每一步計(jì)算機(jī)都能操作。有一個(gè)或多個(gè)的輸入或輸出。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理6.2函數(shù)的定義與調(diào)用
在C語言中,函數(shù)(Function)是一個(gè)處理過程,可以進(jìn)行數(shù)值運(yùn)算、信息處理、控制決策,即一段程序的工作放在函數(shù)中進(jìn)行,函數(shù)結(jié)束時(shí)可以攜帶或不帶處理結(jié)果。從用戶使用函數(shù)的角度,函數(shù)有兩種:
庫函數(shù)(標(biāo)準(zhǔn)函數(shù)):系統(tǒng)提供
自定義函數(shù):用戶自己寫
從函數(shù)的形式看,函數(shù)分兩類:
無參函數(shù)、有參函數(shù)
注:C語言程序處理過程全部都是以函數(shù)形式出現(xiàn),最簡單的程序至少也有一個(gè)main函數(shù)。函數(shù)必須先定義和聲明后才能調(diào)用。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理標(biāo)準(zhǔn)庫函數(shù)
C語言有豐富的庫函數(shù),按功能分為:類型轉(zhuǎn)換函數(shù)、字符判別與轉(zhuǎn)換函數(shù)、字符串處理函數(shù)、標(biāo)準(zhǔn)I/O函數(shù)、文件管理函數(shù)、數(shù)學(xué)運(yùn)算函數(shù),這些函數(shù)的說明在不同的頭文件(*.h)中。想要調(diào)用標(biāo)準(zhǔn)的庫函數(shù),就必須include。
main()
{{putchar(‘a(chǎn)’);}
}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理調(diào)用putchar函數(shù)時(shí),
必須include<stdio.h>#include<stdio.h>
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理一般格式合法標(biāo)識(shí)符函數(shù)類型函數(shù)名(形參類型說明表){
說明部分 語句部分}函數(shù)的定義把完成一個(gè)子任務(wù)程序?qū)懗梢粋€(gè)函數(shù)函數(shù)返回值類型缺省int型無返回值void函數(shù)體
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理intmax(intx1,intx2,intx3)/*定義函數(shù)的返回值類型,函數(shù)名,形參*/{intmax;if(x1>x2)max=x1;elsemax=x2;if(max<x3)max=x3;/*通過比較得到三個(gè)數(shù)的最大值放到max中*/
return(max);/*返回運(yùn)算結(jié)果*/} 【例】編寫函數(shù),求三個(gè)整型參數(shù)的最大值。
函數(shù)分為兩大部分:1.函數(shù)的說明部分(函數(shù)首部)。2.函數(shù)體部分。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理1.函數(shù)的說明部分
函數(shù)的說明部分包括函數(shù)的類型、函數(shù)名、參數(shù)表及參數(shù)類型的說明。(1)函數(shù)的類型。函數(shù)的類型即函數(shù)的返回值類型。說明函數(shù)將給調(diào)用者提供什么類型的返回值。如果函數(shù)不提供返回值,可以定義函數(shù)類型為空??疹愋偷臉?biāo)識(shí)符:void
例:voidputdata(inta)函數(shù)的返回值可以是任何一種數(shù)據(jù)類型,但不能是數(shù)組型。當(dāng)返回值類型被省略時(shí),默認(rèn)為int型。函數(shù)的返回值將由return(表達(dá)式)語句返回給調(diào)用者(即調(diào)用這個(gè)函數(shù)的另一個(gè)函數(shù)),表達(dá)式的值即是函數(shù)的返回值。(2)函數(shù)名函數(shù)又稱為函數(shù)標(biāo)識(shí)符。對(duì)自定義函數(shù),其命名遵循C語言標(biāo)識(shí)符的規(guī)定。(3)參數(shù)表參數(shù)表寫在函數(shù)后的括號(hào)“()”內(nèi),參數(shù)表由一個(gè)或多個(gè)變量標(biāo)識(shí)符及類型標(biāo)識(shí)符組成。參數(shù)表中的變量也稱為形式參數(shù),簡稱為形參。如果沒有形參,稱作無參數(shù)函數(shù),無參數(shù)函數(shù)的括號(hào)“()”不能省略。例有參函數(shù)
intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)
intmax(intx,y){intz;z=x>y?x:y;return(z);}例無參函數(shù)
printstar(){printf(“**********\n”);}或
printstar(void){printf(“**********\n”);}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理2.函數(shù)體
函數(shù)定義的花括號(hào)“{}”里的部分是函數(shù)體,包括變量定義、執(zhí)行語句序列。函數(shù)所完成的工作在函數(shù)體中由一段程序完成。
例空函數(shù)
dummy(){}函數(shù)體為空如果函數(shù)有返回值,則需要返回語句return.
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理函數(shù)的返回值返回語句形式:return(表達(dá)式);
或:
return表達(dá)式;
或:
return;執(zhí)行時(shí)先計(jì)算出括號(hào)中表達(dá)式的值,再將該值返回給主調(diào)函數(shù)中的調(diào)用表達(dá)式。功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)說明:
函數(shù)中可有多個(gè)return語句,執(zhí)行到哪個(gè)return語句,那個(gè)語句起作用
若無return語句,遇到函數(shù)結(jié)束的“}”時(shí),自動(dòng)返回調(diào)用函數(shù)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理例:計(jì)算表達(dá)式的值
x2-x+1(x<0)x3+x+3(x>0)
Y=floaty(floatx){if(x<0)return(x*x-x+1);elsereturn(x*x*x+x+3);}在定義函數(shù)是對(duì)函數(shù)值說明的類型一般應(yīng)該與return語句中的表達(dá)式類型一致。若函數(shù)類型與return語句中表達(dá)式值的類型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換,即函數(shù)類型決定返回值的類型例如,
intf(){
floatf=7;
f/=2;
returnf;}注意:如果不將函數(shù)調(diào)用賦值給任何變量,它的返回值將被丟棄。函數(shù)返回值為:3,而不是3.5
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理如果被調(diào)用函數(shù)中沒有return語句,并不帶回一個(gè)確定的、用戶所希望得到的函數(shù)值,但實(shí)際上,函數(shù)并不是不帶回值,只是不帶回有用的值,帶回的是一個(gè)不確定的值。例:printstar(){printf(“****************\n”);}
盡管沒有要求printstar函數(shù)帶回值,但如果程序中出現(xiàn)下面的語句是合法的:
a=printstar();/*輸出*****************/
printf(“%d”,a);/*輸出16*/
注:a的值不一定有實(shí)際意義(printstar函數(shù)輸出16個(gè)字符,返回值是16)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理為了明確表示“不帶回值”,可以用“void”定義“無類型”(或稱“空類型”)即void型函數(shù):無返回值的函數(shù)
例:voidprintstar(){printf(“***********”);}
這樣,系統(tǒng)保證不帶回任何值,即禁止在調(diào)用函數(shù)中使用被調(diào)函數(shù)的返回值。此時(shí),若有:
a=printstar();
編譯時(shí)會(huì)給出錯(cuò)信息。注:一般,凡不要求帶回函數(shù)值的函數(shù),應(yīng)定義為void類型例無返回值函數(shù)
voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理函數(shù)的調(diào)用
一個(gè)c程序有一個(gè)主函數(shù)和多個(gè)函數(shù)組成。主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可相互調(diào)用。
C語言的函數(shù)調(diào)用遵循先定義,后引用的原則。如果對(duì)某函數(shù)的調(diào)用出現(xiàn)在該函數(shù)定義之前,必須用說明語句對(duì)函數(shù)進(jìn)行聲明。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理1.函數(shù)的聲明
在函數(shù)如果要調(diào)用某一已經(jīng)定義了的函數(shù)時(shí),一般還應(yīng)在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)進(jìn)行聲明(說明)。作用:告知編譯程序本函數(shù)將要調(diào)用某個(gè)函數(shù),并告知相關(guān)信息(函數(shù)類型、函數(shù)名、參數(shù)個(gè)數(shù)、參數(shù)類型)函數(shù)聲明語句的形式:
函數(shù)類型名函數(shù)名(參數(shù)類型說明列表)或
函數(shù)類型名函數(shù)名();
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理例ex2.c函數(shù)聲明舉例
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理main()
{floata,b,c;
scanf("%f,%f",&a,&b);c=add(a,b);
printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}定義add函數(shù)對(duì)被調(diào)用的add函數(shù)作聲明floatadd(floatx,floaty);/*functiondeclaration*/函數(shù)聲明與函數(shù)定義的區(qū)別:
函數(shù)定義是用來建立和實(shí)現(xiàn)函數(shù)的功能,包括指定函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,是一個(gè)完整的、獨(dú)立的單位。函數(shù)聲明的作用是把函數(shù)的名字、函數(shù)類型、形參的類型、個(gè)數(shù)、順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查,它僅僅給出函數(shù)的類型、函數(shù)名及其參數(shù)的類型。
注:函數(shù)聲明可寫為:函數(shù)首部:
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理在函數(shù)聲明中也可以不寫形參名,只寫形參的類型,但參數(shù)類型、次序和數(shù)目必須一致floatadd(float,float);下列情況下,可不作函數(shù)聲明被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,即先定義后調(diào)用;floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;
scanf("%f,%f",&a,&b);c=add(a,b);
printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)聲明Ex3.c已在所有函數(shù)定義之前,在函數(shù)外部作了聲明,則在各個(gè)主調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作聲明)(例ex1.c)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理charletter(char,char);floatf(float,float);intg(float,float);main(){……}charletter(charch1,charch2){……}floatf(floatx,floaty){……}intg(floatj,floatk){……}已在所有函數(shù)定義之前,在函數(shù)外部作了聲明函數(shù)聲明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外);若函數(shù)返值是型或void型事實(shí)上,int型函數(shù)定義之前使用也必須作函數(shù)聲明,否則系統(tǒng)不知max(a,b)是函數(shù),形參的值無法傳給實(shí)參,結(jié)果出錯(cuò)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理main(){
floata,b;
intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}Ex4.cintmax(floatx,floaty);
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理2、函數(shù)的調(diào)用
函數(shù)調(diào)用的一般形式:有參函數(shù)調(diào)用形式:
函數(shù)名(實(shí)參表)無參函數(shù)調(diào)用形式:函數(shù)名()函數(shù)調(diào)用的方式:函數(shù)語句:函數(shù)調(diào)用可單獨(dú)成為一個(gè)語句例output();
printf(“Hello,World!\n”);
函數(shù)表達(dá)式:調(diào)用函數(shù)后的返回值可參加表達(dá)式的計(jì)算,這時(shí)要求被調(diào)函數(shù)帶返回值。例sum=add(a,b);c=fac(n)/(fac(k)*fac(n-k));
函數(shù)參數(shù):帶返回值的函數(shù)調(diào)用亦可作為其它函數(shù)的參數(shù)(實(shí)際參數(shù))例printf(“%d”,max(a,b));m=max(a,max(b,c));在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)(可以是常量、變量、表達(dá)式)調(diào)用函數(shù)的過程是:
為函數(shù)的所有形參分配內(nèi)存單元。計(jì)算各個(gè)實(shí)參表達(dá)式的值,一一對(duì)應(yīng)的賦值給相應(yīng)形參(若是無參函數(shù),上述過程不執(zhí)行)。
進(jìn)入函數(shù)體,執(zhí)行函數(shù)中的語句,實(shí)現(xiàn)函數(shù)的功能執(zhí)行到return語句時(shí),計(jì)算return語句中表達(dá)式的值(若是無返回值函數(shù),本項(xiàng)不做),返回到主調(diào)函數(shù)。
釋放形參及本函數(shù)內(nèi)的局部變量所占內(nèi)存,繼續(xù)執(zhí)行主調(diào)函數(shù)中的后繼語句。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理C語言中,函數(shù)調(diào)用是值傳遞方式,即函數(shù)的實(shí)際參數(shù)和形式參數(shù)之間的數(shù)據(jù)傳遞方向是單向的,只能由實(shí)際參數(shù)傳遞給形式參數(shù),而不能由形式參數(shù)傳遞給實(shí)際參數(shù),是實(shí)際參數(shù)向形式參數(shù)單向賦值的關(guān)系。在內(nèi)存中,形式參數(shù)與實(shí)際參數(shù)占用不同的內(nèi)存單元。當(dāng)調(diào)用函數(shù)時(shí),給形式參數(shù)分配內(nèi)存單元,將實(shí)際參數(shù)的值賦值給形式參數(shù),調(diào)用后,形式參數(shù)單元釋放,實(shí)際參數(shù)仍保留調(diào)用前的值,形式參數(shù)值的變化不影響實(shí)際參數(shù)。函數(shù)參數(shù)及其傳遞方式形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例ex4.c比較兩個(gè)數(shù)并輸出大者main(){intmax(intx,inty);
inta,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);
printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實(shí)參
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
說明:實(shí)參必須有確定的值,形參必須指定類型形參與實(shí)參類型一致,個(gè)數(shù)相同,按順序一一對(duì)應(yīng)
若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換(按不同類型數(shù)據(jù)的賦值規(guī)則進(jìn)行轉(zhuǎn)換)
形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理例ex5.c計(jì)算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;
printf("Pleaseinputvalueofa:");
scanf("%f",&a);product=cube(a);
printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××28
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理參數(shù)傳遞方式
值傳遞方式方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值特點(diǎn):
形參與實(shí)參占用不同的內(nèi)存單元單向傳遞
地址傳遞方式方式:函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址作為參數(shù)傳遞給形參,當(dāng)然此時(shí)的行參只能是能存儲(chǔ)地址的變量(指針變量)。
特點(diǎn):雙向傳遞
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理35a:b:調(diào)用前:調(diào)用結(jié)束:35a:b:例ex6.c交換兩個(gè)數(shù)#include<stdio.h>main(){inta=3,b=5;
printf(“a=%d,\tb=%d\n",a,b);
printf("swapped:\n");
swap(a,b);
printf(“a=%d,\tb=%d\n",a,b);}swap(intx,inty){inttemp;temp=x;x=y;y=temp;}調(diào)用35x:y:35a:b:swap:temp35a:b:x:35y:
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理main(){inti=2,p;p=f(i,++i);
printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例ex7.c參數(shù)求值順序main(){inti=2,p;p=f(i,i++);
printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}運(yùn)行結(jié)果:0運(yùn)行結(jié)果:1實(shí)參的求值順序不確定,因系統(tǒng)而定(TurboC自右向左)
3.函數(shù)的嵌套調(diào)用
在某函數(shù)體中調(diào)用了另一個(gè)函數(shù),則在該函數(shù)被調(diào)用的過程中將發(fā)生另一次函數(shù)調(diào)用。這種調(diào)用現(xiàn)象稱為函數(shù)的嵌套調(diào)用。
intf1(){…
}
intf2(){…f1();
}
voidmain()
{…
f2();}f2()f1()main()f2()f1()
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理例ex8.c編程求組合Cnm=m!/n!(m-n)!longfac(intk)
/*定義求階乘的函數(shù)*/{longf=1;
inti;for(i=1;i<=k;i++)f=f*i;returnf;}longcomb(intm,intn)/*定義組合函數(shù)*/{longc;c=fac(m)/(fac(n)*fac(m-n));/*嵌套調(diào)用階乘函數(shù)*/returnc;}main(){intn,m;longc;scanf(“%d,%d”,&m,&n);c=comb(m,n);/*調(diào)用組合函數(shù)*/printf(“%ld”,c);}#include<stdio.h>
longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);
printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);
return(c1+c2);}
longfactorial(intn){longrtn=1;
inti;for(i=1;i<=n;i++)
rtn*=i;
return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預(yù)處理命令函數(shù)類型說明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參Ex9.c實(shí)現(xiàn):任意給定的兩個(gè)數(shù)n1,n2,計(jì)算:n1!+n2!
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
6.3遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說明C編譯系統(tǒng)對(duì)遞歸函數(shù)的自調(diào)用次數(shù)沒有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出intf(intx){inty,z;……
z=f(y);…….return(2*z);}intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理例ex10.c求n的階乘#include<stdio.h>int
fac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;
printf("Inputaintegernumber:");
scanf("%d",&n);
y=fac(n);
printf("%d!=%15d",n,y);}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
6.4變量的作用域和存儲(chǔ)類別內(nèi)存…….main(){inta;a=10;
printf(“%d”,a);}編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元1020002001程序中使用變量名對(duì)內(nèi)存操作
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲(chǔ)屬性存儲(chǔ)器類型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)作用域:變量在某區(qū)域內(nèi)有效(空間角度)-------局部變量與全局變量生存期:變量值存在的時(shí)間(時(shí)間角度)-------靜態(tài)存儲(chǔ)方式與動(dòng)態(tài)存儲(chǔ)方式變量的存儲(chǔ)類型auto-----自動(dòng)型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲(chǔ)類型]數(shù)據(jù)類型變量表;如:intsum;
auto
inta,b,c;
register
inti;
staticfloatx,y;
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理內(nèi)部變量---局部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量局部變量可用存儲(chǔ)類型:autoregisterstatic(默認(rèn)為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理復(fù)合語句中變量#defineN5main(){inti;
inta,b;
scanf(“%d,%d”,&a,&b);if(a<b)
{
inttemp; temp=a; a=b; b=temp;
}
printf("%d,%d",a,b);}例不同函數(shù)中同名變量main(){inta,b;a=3;b=4;
printf("main:a=%d,b=%d\n",a,b);sub();
printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;
printf("sub:a=%d,b=%d\n",a,b);}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理外部變量(全局變量)定義:在函數(shù)外面定義的變量。外部變量的作用域:對(duì)于只有一個(gè)源程序文件構(gòu)成的程序,外部變量的作用域是從定義它的位置開始,直至它所在源程序文件的結(jié)束。特點(diǎn):外部變量的使用增加了函數(shù)之間傳遞數(shù)據(jù)的途徑,在外部變量的作用域內(nèi)的任何函數(shù)都能引用該外部變量,一個(gè)函數(shù)對(duì)外部變量的修改,能影響到其它引用這個(gè)變量的函數(shù);因此對(duì)外部變量的使用不當(dāng),會(huì)產(chǎn)生意外的錯(cuò)誤。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理floatmax,min;floataverage(intn){inti;floatx;
scanf(“%f”,&x);max=min=x;for(i=2;i<n;i++){scanf(“%f”,&x);if(x>max)max=x;elseif(x<min)min=x;sum+=x;}return(sum/n);}main(){intn;floatave;
scanf(“%d”,&n);
ave=average(n);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;
printf(“a=%d\n,b=%d\n,max=%d\n",a,b,max(a,b));}外部變量與局部變量同名時(shí),在內(nèi)部變量的作用域中,外部變量被屏蔽。例:
運(yùn)行結(jié)果:a=8/*main中的a*/b=5/*全局變量的b*/max=8
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要引用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被引用的外部變量進(jìn)行說明。外部變量說明的一般形式為:extern數(shù)據(jù)類型外部變量[,外部變量2……];注意:外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍externcharc1,c2;c1,c2的作用范圍擴(kuò)展后c1,c2的作用范圍擴(kuò)展后externcharc1,c2;
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理intglobal;/*定義*/externfloatx;
/*說明*/main(){intlocal; . . .}externintglobal;/*說明*/intnumber;/*定義*/func2(){ . . .}floatx;/*定義*/intnumber;/*定義*/func3(){externintglobal;/*說明*/ . . .}file1.cfile2.cfile3.c
對(duì)于多文件程序,在一個(gè)源文件中定義的外部變量還可以在其它的文件中使用,這時(shí)需要在使用它的文件中用extern進(jìn)行說明,這樣的變量稱為程序級(jí)的變量。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理變量的存儲(chǔ)類別------動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式動(dòng)態(tài)存儲(chǔ)方式:程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)類別的變量當(dāng)進(jìn)入定義它的函數(shù)或復(fù)合語句時(shí)被分配存儲(chǔ)空間,當(dāng)離開時(shí)所占內(nèi)存空間被釋放。靜態(tài)存儲(chǔ)方式:程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。靜態(tài)存儲(chǔ)類別的變量在源程序編譯的時(shí)候被分配固定的存儲(chǔ)空間,從程序開始執(zhí)行到程序運(yùn)行結(jié)束,一直占用該內(nèi)存空間,直至程序運(yùn)行結(jié)束,才被釋放內(nèi)存空間。程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、局部靜態(tài)變量形參變量局部動(dòng)態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場(chǎng)保護(hù)和返回地址等1.靜態(tài)存儲(chǔ)──靜態(tài)內(nèi)部變量(1)定義格式:static數(shù)據(jù)類型內(nèi)部變量表;(2)存儲(chǔ)特點(diǎn)1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。2)定義但不初始化,則自動(dòng)賦以"0"(整型和實(shí)型)或'\0'(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值!(3)何時(shí)使用靜態(tài)內(nèi)部變量1)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。2)變量只被引用而不改變其值。內(nèi)部變量的存儲(chǔ)類別
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理2.動(dòng)態(tài)存儲(chǔ)──自動(dòng)局部變量(又稱自動(dòng)變量)(1)定義格式:[auto]數(shù)據(jù)類型變量表;
(2)存儲(chǔ)特點(diǎn)1)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的自動(dòng)變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯(cuò)誤。2)定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。3)由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語句),因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該函數(shù)內(nèi)部的復(fù)合語句中定義的自動(dòng)變量同名。建議:系統(tǒng)不會(huì)混淆,并不意味著人也不會(huì)混淆,所以盡量少用同名自動(dòng)變量!
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理[例]自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。
voidauto_static(void){intvar_auto=0;/*自動(dòng)變量:每次調(diào)用都重新初始化*/
staticintvar_static=0; /*靜態(tài)局部變量:只初始化1次*/
printf(“var_auto=%d,var_static=%d\n”,var_auto,var_static);++var_auto;++var_static;}main(){inti;for(i=0;i<5;i++)auto_static();}
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理3.寄存器存儲(chǔ)──寄存器變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存中的。為提高執(zhí)行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下:
register
數(shù)據(jù)類型變量表;(1)只有局部變量才能定義成寄存器變量,即全局變量不行。(2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理外部變量的存儲(chǔ)方式外部變量屬于靜態(tài)存儲(chǔ)方式:(1)靜態(tài)外部變量──只允許被本源文件中的函數(shù)引用其定義格式為:static數(shù)據(jù)類型外部變量表;;(2)非靜態(tài)外部變量──允許被其它源文件中的函數(shù)引用定義時(shí)缺省static關(guān)鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時(shí),需要在引用函數(shù)所在的源文件中進(jìn)行說明:extern數(shù)據(jù)類型外部變量表;注意:在函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量!而函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,但兩者區(qū)別較大:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為整個(gè)源程序,但其它函數(shù)是不能使用它的。靜態(tài)外部變量在函數(shù)外定義,其作用域?yàn)槎x它的源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)的值。而靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的“重復(fù)”初始化問題,其當(dāng)前值由最近1次給它賦值的操作決定。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它的存儲(chǔ)方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理6.5編譯預(yù)處理作用:對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C
源程序種類宏定義#define文件包含#include條件編譯#if--#else--#endif等格式:“#”開頭占單獨(dú)書寫行語句尾不加分號(hào)
C語言程序設(shè)計(jì)
函數(shù)與編譯預(yù)處理如if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展開后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);宏定義不帶參數(shù)宏定義一般形式:#define宏名[宏體]功能:用指定標(biāo)識(shí)符(宏名)表示字符序列(宏體)宏展開:預(yù)編譯時(shí),用宏體替換宏名---不作語法檢查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);定義位置:函數(shù)外面,通常寫在文件開頭、函數(shù)之前作用域:從定義命令到文件結(jié)束#undef可終止宏名作用域格式:
#undef宏名例#defineYES1main(){……..}#undefYES#defineYES0max(){……..}YES原作用域YES新作用域宏定義可嵌套,不能遞歸例#defineMAXMAX+10()引號(hào)中的內(nèi)容與宏名相同也不置換例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展開:
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 氧化鋁基負(fù)載型金屬催化劑鄰位氫中心構(gòu)筑及加氫性能研究
- 秸稈回收加工廠項(xiàng)目可行性研究報(bào)告
- 2025版物業(yè)管理區(qū)域綠化安全管理服務(wù)合同3篇
- 基于相似理論的船用耐壓設(shè)備縮比模型設(shè)計(jì)方法研究
- 2025版高校食堂營養(yǎng)膳食承包合作協(xié)議2篇
- 異地辦公與遠(yuǎn)程工作管理
- 二零二五年度倉儲(chǔ)物流用地買賣合同樣本3篇
- 2025版選礦廠承包合同附設(shè)備更新改造計(jì)劃書3篇
- 營銷行業(yè)助理職責(zé)概述
- 熱情溫暖的社區(qū)活動(dòng)中心三篇
- 超市連鎖行業(yè)招商策劃
- 醫(yī)藥高等數(shù)學(xué)智慧樹知到課后章節(jié)答案2023年下浙江中醫(yī)藥大學(xué)
- 城市道路智慧路燈項(xiàng)目 投標(biāo)方案(技術(shù)標(biāo))
- 初中英語-Unit2 My dream job(writing)教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 廣州市勞動(dòng)仲裁申請(qǐng)書
- 【公司利潤質(zhì)量研究國內(nèi)外文獻(xiàn)綜述3400字】
- 工行全國地區(qū)碼
- 新疆2022年中考物理試卷及答案
- 地暖工程監(jiān)理實(shí)施細(xì)則
- 頂部板式吊耳計(jì)算HGT-20574-2018
- 《內(nèi)證觀察筆記》
評(píng)論
0/150
提交評(píng)論