C語言程序設(shè)計(jì)-第4章函數(shù)與編譯預(yù)處理課件_第1頁
C語言程序設(shè)計(jì)-第4章函數(shù)與編譯預(yù)處理課件_第2頁
C語言程序設(shè)計(jì)-第4章函數(shù)與編譯預(yù)處理課件_第3頁
C語言程序設(shè)計(jì)-第4章函數(shù)與編譯預(yù)處理課件_第4頁
C語言程序設(shè)計(jì)-第4章函數(shù)與編譯預(yù)處理課件_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章函數(shù)與編譯預(yù)處理C

語言程序設(shè)計(jì)1第4章函數(shù)與編譯預(yù)處理C語言程序設(shè)計(jì)1第4章函數(shù)與編譯預(yù)處理

4.1函數(shù)概述4.2函數(shù)定義與調(diào)用4.3局部變量和全局變量4.4變量的生存期和存儲(chǔ)類別4.5

編譯預(yù)處理2005年1月2第4章函數(shù)與編譯預(yù)處理4.1函數(shù)概述2004.1函數(shù)概述……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n4.1.1函數(shù)簡(jiǎn)介2005年1月34.1函數(shù)概述……C程序源程序文件n函數(shù)1函數(shù)m……源程【例】

#include<stdio.h>voidprint_line()/*函數(shù)定義*/{printf("*********************************\n");}voidprint_text()/*函數(shù)定義*/{printf("WelcometoBeijing\n");}voidmain(){print_line();/*函數(shù)調(diào)用*/print_text();/*函數(shù)調(diào)用*/print_line();/*函數(shù)調(diào)用*/}程序的執(zhí)行總是從main函數(shù)開始2005年1月4【例】#include<stdio.h>程序的執(zhí)voidmain函數(shù){

……

調(diào)用函數(shù)

print_line();

……}函數(shù)

print_line(){

……

}2005年1月5voidmain函數(shù)函數(shù)2005年1月5⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在對(duì)C源程序進(jìn)行編譯時(shí)是以文件為單位進(jìn)行的。⑵一個(gè)C源程序文件可以由一個(gè)或多個(gè)函數(shù)組成。所有函數(shù)都是獨(dú)立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個(gè)C程序中,有且僅有一個(gè)主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說明2005年1月6⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在⑷函數(shù)的種類從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄B列出了C的部分庫函數(shù)。②用戶自定義函數(shù)。如:例中的print_line()函數(shù)。2005年1月7⑷函數(shù)的種類從使用的角度看:2005年1月7由C編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)需要隨時(shí)調(diào)用常用函數(shù)如:fabs、sqrt、sin、pow、rand(常用數(shù)學(xué)函數(shù)參見教材P100表4-1和附錄B

)函數(shù)調(diào)用形式:函數(shù)名([參數(shù)表])例如:sqrt(x)4.1.2數(shù)學(xué)庫函數(shù)2022/11/218由C編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)例#include<math.h>#include<stdio.h>voidmain(){floatx=4.5;printf("%f,%f,%f\n",sqrt(x),pow(x,2),fabs(-x));}輸出結(jié)果:2.121320,20.250000,4.5000002022/11/219例#include<math.h>輸出結(jié)果:2022/14.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…

){說明語句

執(zhí)行語句}例如:求兩個(gè)數(shù)的最大值。

int

max(intx,inty){intz;z=x>y?x:y;return(z);}4.2函數(shù)定義及調(diào)用2005年1月104.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類#include<stdio.h>intcube(inty);/*函數(shù)原型聲明*/voidmain(){

intx,last,nowcb;last=1;printf("1~5之間,相鄰兩數(shù)的立方差是:\n");for(x=2;x<=5;x++){ nowcb=cube(x);/*函數(shù)調(diào)用*/printf("%d",nowcb-last);last=nowcb;}printf("\n");}/*函數(shù)定義*/int

cube(inty)/*函數(shù)首部*/{returny*y*y;}例4-1編寫一個(gè)函數(shù)cube,計(jì)算整數(shù)的立方。花括號(hào)中也可以為空,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。2022/11/2111#include<stdio.h>/*函數(shù)定義*/例4-1函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();/*函數(shù)調(diào)用語句*/②if(iabs(a)>max)max=iabs(a);

/*函數(shù)調(diào)用構(gòu)成表達(dá)式*/

③m=max(c,max(a,b));/*函數(shù)調(diào)用作為函數(shù)參數(shù)*/4.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:2005年1月12函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}4.2.3函數(shù)參數(shù)傳遞與返回值1.函數(shù)的參數(shù)傳遞(值傳遞)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)【例】編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞2005年1月13voidswap(intx,inty)4.2.3有關(guān)形參和實(shí)參的說明:

①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。③實(shí)參與形參類型要一致,字符型與整型兼容。④實(shí)參與形參的個(gè)數(shù)必須相等。在函數(shù)調(diào)用時(shí),實(shí)參的值賦給與之相對(duì)應(yīng)的形參。“單向值傳遞”。2022/11/2114有關(guān)形參和實(shí)參的說明:①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運(yùn)行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達(dá)式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,系統(tǒng)自動(dòng)將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。2.函數(shù)的返回值return語句格式:return;或return表達(dá)式

;2005年1月15函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止【例】計(jì)算并輸出圓的面積。#include<stdio.h>s(intr){return3.14*r*r;}voidmain(){intr;scanf("%d",&r);printf("%d\n",s(r));}自動(dòng)轉(zhuǎn)換為int型程序運(yùn)行情況如下:2'12說明:①函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認(rèn)其為int型。②無返回值的函數(shù)應(yīng)將其類型定義為void(空)類型。2005年1月16【例】計(jì)算并輸出圓的面積。#include<stdio.h【例4-8】編寫函數(shù)實(shí)現(xiàn)兩組變量的顯示定義2組,共8個(gè)整型變量a1……a4,b1……b4,要求:輸入字符a和整數(shù)1,顯示a1變量的值,輸入字符b和整數(shù)1,顯示b1變量的值……2022/11/2117【例4-8】編寫函數(shù)實(shí)現(xiàn)兩組變量的顯示定義2組,共8個(gè)整型#include<stdio.h>intArrayOperating(inti,charch){inta1=1,a2=0,a3=3,a4=5;intb1=2,b2=0,b3=4,b4=3;switch(i){case1: switch(ch) {case'a':returna1;case'b':returnb1; }case2:……case3:……case4:……}}voidmain(){inti;charch;printf("輸入顯示的變量,形式如:a1或b4:");scanf("%c%d",&ch,&i);printf("%c%d=%d\n",ch,i,ArrayOperating(i,ch));}2022/11/2118#include<stdio.h>voidmain()24.2.4函數(shù)的嵌套調(diào)用main函數(shù){

……

調(diào)用函數(shù)A;

……}函數(shù)A{……

調(diào)用函數(shù)B;

……}函數(shù)B{

……

……

……}2005年1月194.2.4函數(shù)的嵌套調(diào)用main函數(shù)函數(shù)A函數(shù)B200【例】函數(shù)的嵌套調(diào)用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結(jié)果:92005年1月20【例】函數(shù)的嵌套調(diào)用main()sub1(intn)su

4.2.5對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)的定義要出現(xiàn)在主調(diào)函數(shù)的定義之前。如swap函數(shù).voidswap(intx,inty){…}main(){…

swap(a,b);

}main(){…c=max(a,b);}max(intx,inty){…}允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù).2005年1月214.2.5對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式

函數(shù)類型函數(shù)名(參數(shù)類型1

參數(shù)名1,…);或函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…);第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對(duì)被調(diào)函數(shù)進(jìn)行聲明。2005年1月22對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式函數(shù)類型函數(shù)名(參#include<stdio.h>voidmain(){floatcalc(floatx,floaty,charopr);floata,b;charopr;printf("\n輸入四則運(yùn)算表達(dá)式:");scanf("%f%c%f",&a,&opr,&b);if(opr=='+'||opr=='-'||opr=='*'||opr=='/')printf("%5.2f%c%5.2f=%6.2f\n",a,opr,b,calc(a,b,opr));elseprintf("非法運(yùn)算符!\n");}floatcalc(floatx,floaty,charopr){switch(opr){case'+':return(x+y); case'-':return(x-y); case'*':return(x*y); case'/':return(x/y);}}}對(duì)被調(diào)函數(shù)的聲明【例4-12】計(jì)算并輸出兩個(gè)數(shù)的和、差、積、商。2005年1月23#include<stdio.h>對(duì)被調(diào)函數(shù)的聲明【例4-4.3局部變量和全局變量變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)。4.3.1局部作用域和局部變量【例】分析下面程序的運(yùn)行結(jié)果及變量的作用域。2005年1月244.3局部變量和全局變量變量的作用域:變量在程序中可以被使voidsub(inta,intb){intc;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部變量voidmain(){inta=1,b=1,c=1; printf("main:\ta=%db=%dc=%d\n",a,b,c);sub(a,b);printf("main:\ta=%db=%dc=%d\n",a,b,c);

{inta=2,b=2;printf("comp:\ta=%db=%dc=%d\n",a,b,c);}printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部變量局部變量“分程序”或“程序塊”程序輸出結(jié)果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=12005年1月25voidsub(inta,intb)局部4.3.2全局作用域和全局變量全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時(shí)不起作用。【例】全局變量和局部變量的作用域。2005年1月264.3.2全局作用域和全局變量全局變量(外部變量):在inta=5; voidf(intx,inty) {intb,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部變量main(){intb=6,c=7; f(b,c);printf("%d\t%d\t%d\n",a,b,c);

{inta=9,b=8; printf("%d\t%d\t%d\n",a,b,c);

{

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

}printf("%d\t%d\t%d\n",a,b,c);

}printf("%d\t%d\t%d\n",a,b,c);}局部變量局部變量程序輸出結(jié)果:511-2567987981098105610全局變量“分程序”或“程序塊”int2005年1月27inta=5; 局部變量main()局部變量局部4.4變量的生存期和存儲(chǔ)類別4.4.1變量的生存期變量的生存期:變量在內(nèi)存中占據(jù)存儲(chǔ)空間的時(shí)間。程序代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)存儲(chǔ)分配動(dòng)態(tài)存儲(chǔ)變量靜態(tài)存儲(chǔ)變量2005年1月284.4變量的生存期和存儲(chǔ)類別4.4.1變量的生存期變4.4.2變量的存儲(chǔ)類別變量的屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元的長度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲(chǔ)類別:決定了變量的生存期,給它分配在哪個(gè)存儲(chǔ)區(qū)。2005年1月294.4.2變量的存儲(chǔ)類別變量的屬性數(shù)據(jù)類型:存儲(chǔ)類別:20變量定義語句的一般形式存儲(chǔ)類別數(shù)據(jù)類型變量名1,…,變量名n;auto(自動(dòng)的)register(寄存器的)static(靜態(tài)的)

extern(外部的)2005年1月30變量定義語句的一般形式存儲(chǔ)類別數(shù)據(jù)類型變量名1,1.自動(dòng)變量(auto類別)main()

{intx,y;…}main()

{autointx,y;…}自動(dòng)變量等價(jià)可省局部變量可以定義為自動(dòng)變量。2005年1月311.自動(dòng)變量(auto類別)main()

{intx,y;main(){inta,b,c;

printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}sum(inta,intb){intc=0;

c=a+b;return(c);}printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%d\n”,c);main()Entera,b:內(nèi)存用戶區(qū)靜態(tài)存儲(chǔ)區(qū)am

不定bm

不定cm

不定12<回車>as=1bs=2cs=0bm=2am=1sum(inta,intb)Sum=3程序程序區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)觀察下列程序運(yùn)行時(shí)變量的存儲(chǔ)情況單擊開始運(yùn)行as=1bs=2cs=3運(yùn)行結(jié)束cm=3

2005年1月32main()printf(“Entera,b:\n”);s⑴內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時(shí)在動(dòng)態(tài)存儲(chǔ)區(qū)為其分配存儲(chǔ)單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。⑵變量的初值定義變量時(shí)若沒賦初值,變量的初值不確定;如果賦初值則每次函數(shù)被調(diào)用時(shí)執(zhí)行一次賦值操作。⑶生存期在函數(shù)或分程序執(zhí)行期間。⑷作用域自動(dòng)變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動(dòng)變量2005年1月33⑴內(nèi)存分配自動(dòng)變量2005年1月332.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。staticinta;main(){floatx,y;…}f(){staticintb=1;……}全局靜態(tài)變量局部靜態(tài)變量自動(dòng)變量不能省2005年1月342.靜態(tài)變量(static類別)除形參外,局部變量和全局變量⑴內(nèi)存分配編譯時(shí),將其分配在內(nèi)存的靜態(tài)存儲(chǔ)區(qū)中,程序運(yùn)行結(jié)束釋放該單元。⑵靜態(tài)變量的初值若定義時(shí)未賦初值,在編譯時(shí),系統(tǒng)自動(dòng)賦初值為0;若定義時(shí)賦初值,則僅在編譯時(shí)賦初值一次,程序運(yùn)行后不再給變量賦初值。⑶生存期整個(gè)程序的執(zhí)行期間。⑷作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結(jié)束。靜態(tài)變量2005年1月35⑴內(nèi)存分配靜態(tài)變量2005年1月35staticintb=0;main(){int a=2,i;for(i=0;i<2;i++)printf("%4d",f(a));printf("\n");}intf(inta){staticintc=3;b++;c++;return(a+b+c);}【例】靜態(tài)變量的使用。main()for(i=0;i<2;i++)printf("%4d",f(a));intf(inta)b++;c++;return(a+b+c);for(i=0;i<2;i++)printf("%4d",f(a));intf(inta)b++;c++;return(a+b+c);printf("\n");for(i=0;i<2;i++)2005年1月36staticintb=0;intc;staticinta;main(){floatx,y;…}chars;f(){staticintb=1;……}3.外部變量(extern類別)在函數(shù)外定義的變量若沒有用static說明,則是外部變量。外部變量只能隱式定義為extern類別,不能顯式定義。全局靜態(tài)變量自動(dòng)變量局部靜態(tài)變量外部變量2005年1月37intc;3.外部變量(extern類別)在函數(shù)外定義的變外部變量聲明的一般格式

extern

數(shù)據(jù)類型變量名1,…,變量名n;或

extern

變量名1,…,變量名n;注意:①外部變量聲明用關(guān)鍵字extern,而外部變量的定義不能用extern,只能隱式定義。②定義外部變量時(shí),系統(tǒng)要給變量分配存儲(chǔ)空間,而對(duì)外部變量聲明時(shí),系統(tǒng)不分配存儲(chǔ)空間,只是讓編譯系統(tǒng)知道該變量是一個(gè)已經(jīng)定義過的外部變量,與函數(shù)聲明的作用類似。2005年1月38外部變量聲明的一般格式externintp=1,q=5;floatf1(inta){externcharc1,c2;……}charc1,c2;charf2(intx,inty){……}main(){……}外部變量聲明定義外部變量定義外部變量思考:在f1函數(shù)中聲明c1、c2的作用是什么?如何修改程序使所有函數(shù)都可以使用外部變量而又不需要聲明?【例】在一個(gè)文件內(nèi)聲明外部變量。2005年1月39intp=1,q=5;外部變量聲明定義外部變量定義外部變⑴內(nèi)存分配編譯時(shí),將其分配在靜態(tài)存儲(chǔ)區(qū),程序運(yùn)行結(jié)束釋放該單元。⑵變量的初值若定義變量時(shí)未賦初值,在編譯時(shí),系統(tǒng)自動(dòng)賦初值為0。⑶生存期整個(gè)程序的執(zhí)行期間。⑷作用域從定義處開始到本源文件結(jié)束。此外,還可以用extern進(jìn)行聲明,以使其作用域擴(kuò)大到該程序的其它文件中。外部變量2005年1月40⑴內(nèi)存分配外部變量2005年1月404.寄存器變量(register類別)只有函數(shù)內(nèi)定義的變量或形參可以定義為寄存器變量。寄存器變量的值保存在CPU的寄存器中。受寄存器長度的限制,寄存器變量只能是char、int和指針類型的變量。

2005年1月414.寄存器變量(register類別)只有函數(shù)內(nèi)定義的變量或歸納變量的分類1.按照變量的作用域?qū)ψ兞糠诸悽啪植孔兞竣迫肿兞?.按照變量的生存期對(duì)變量分類⑴靜態(tài)存儲(chǔ)變量包括:局部靜態(tài)變量和全局變量⑵動(dòng)態(tài)存儲(chǔ)變量包括:自動(dòng)變量2005年1月42歸納變量的分類1.按照變量的作用域?qū)ψ兞糠诸?005年1月44.5編譯預(yù)處理(自學(xué))2005年1月434.5編譯預(yù)處理(自學(xué))2005年1月43第4章函數(shù)與編譯預(yù)處理C

語言程序設(shè)計(jì)44第4章函數(shù)與編譯預(yù)處理C語言程序設(shè)計(jì)1第4章函數(shù)與編譯預(yù)處理

4.1函數(shù)概述4.2函數(shù)定義與調(diào)用4.3局部變量和全局變量4.4變量的生存期和存儲(chǔ)類別4.5

編譯預(yù)處理2005年1月45第4章函數(shù)與編譯預(yù)處理4.1函數(shù)概述2004.1函數(shù)概述……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n4.1.1函數(shù)簡(jiǎn)介2005年1月464.1函數(shù)概述……C程序源程序文件n函數(shù)1函數(shù)m……源程【例】

#include<stdio.h>voidprint_line()/*函數(shù)定義*/{printf("*********************************\n");}voidprint_text()/*函數(shù)定義*/{printf("WelcometoBeijing\n");}voidmain(){print_line();/*函數(shù)調(diào)用*/print_text();/*函數(shù)調(diào)用*/print_line();/*函數(shù)調(diào)用*/}程序的執(zhí)行總是從main函數(shù)開始2005年1月47【例】#include<stdio.h>程序的執(zhí)voidmain函數(shù){

……

調(diào)用函數(shù)

print_line();

……}函數(shù)

print_line(){

……

}2005年1月48voidmain函數(shù)函數(shù)2005年1月5⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在對(duì)C源程序進(jìn)行編譯時(shí)是以文件為單位進(jìn)行的。⑵一個(gè)C源程序文件可以由一個(gè)或多個(gè)函數(shù)組成。所有函數(shù)都是獨(dú)立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個(gè)C程序中,有且僅有一個(gè)主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說明2005年1月49⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在⑷函數(shù)的種類從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄B列出了C的部分庫函數(shù)。②用戶自定義函數(shù)。如:例中的print_line()函數(shù)。2005年1月50⑷函數(shù)的種類從使用的角度看:2005年1月7由C編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)需要隨時(shí)調(diào)用常用函數(shù)如:fabs、sqrt、sin、pow、rand(常用數(shù)學(xué)函數(shù)參見教材P100表4-1和附錄B

)函數(shù)調(diào)用形式:函數(shù)名([參數(shù)表])例如:sqrt(x)4.1.2數(shù)學(xué)庫函數(shù)2022/11/2151由C編譯系統(tǒng)定義的一種函數(shù),存放在系統(tǒng)函數(shù)庫中,用戶可以根據(jù)例#include<math.h>#include<stdio.h>voidmain(){floatx=4.5;printf("%f,%f,%f\n",sqrt(x),pow(x,2),fabs(-x));}輸出結(jié)果:2.121320,20.250000,4.5000002022/11/2152例#include<math.h>輸出結(jié)果:2022/14.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…

){說明語句

執(zhí)行語句}例如:求兩個(gè)數(shù)的最大值。

int

max(intx,inty){intz;z=x>y?x:y;return(z);}4.2函數(shù)定義及調(diào)用2005年1月534.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類#include<stdio.h>intcube(inty);/*函數(shù)原型聲明*/voidmain(){

intx,last,nowcb;last=1;printf("1~5之間,相鄰兩數(shù)的立方差是:\n");for(x=2;x<=5;x++){ nowcb=cube(x);/*函數(shù)調(diào)用*/printf("%d",nowcb-last);last=nowcb;}printf("\n");}/*函數(shù)定義*/int

cube(inty)/*函數(shù)首部*/{returny*y*y;}例4-1編寫一個(gè)函數(shù)cube,計(jì)算整數(shù)的立方。花括號(hào)中也可以為空,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。2022/11/2154#include<stdio.h>/*函數(shù)定義*/例4-1函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();/*函數(shù)調(diào)用語句*/②if(iabs(a)>max)max=iabs(a);

/*函數(shù)調(diào)用構(gòu)成表達(dá)式*/

③m=max(c,max(a,b));/*函數(shù)調(diào)用作為函數(shù)參數(shù)*/4.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:2005年1月55函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}4.2.3函數(shù)參數(shù)傳遞與返回值1.函數(shù)的參數(shù)傳遞(值傳遞)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)【例】編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞2005年1月56voidswap(intx,inty)4.2.3有關(guān)形參和實(shí)參的說明:

①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。③實(shí)參與形參類型要一致,字符型與整型兼容。④實(shí)參與形參的個(gè)數(shù)必須相等。在函數(shù)調(diào)用時(shí),實(shí)參的值賦給與之相對(duì)應(yīng)的形參。“單向值傳遞”。2022/11/2157有關(guān)形參和實(shí)參的說明:①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運(yùn)行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達(dá)式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,系統(tǒng)自動(dòng)將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。2.函數(shù)的返回值return語句格式:return;或return表達(dá)式

;2005年1月58函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止【例】計(jì)算并輸出圓的面積。#include<stdio.h>s(intr){return3.14*r*r;}voidmain(){intr;scanf("%d",&r);printf("%d\n",s(r));}自動(dòng)轉(zhuǎn)換為int型程序運(yùn)行情況如下:2'12說明:①函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認(rèn)其為int型。②無返回值的函數(shù)應(yīng)將其類型定義為void(空)類型。2005年1月59【例】計(jì)算并輸出圓的面積。#include<stdio.h【例4-8】編寫函數(shù)實(shí)現(xiàn)兩組變量的顯示定義2組,共8個(gè)整型變量a1……a4,b1……b4,要求:輸入字符a和整數(shù)1,顯示a1變量的值,輸入字符b和整數(shù)1,顯示b1變量的值……2022/11/2160【例4-8】編寫函數(shù)實(shí)現(xiàn)兩組變量的顯示定義2組,共8個(gè)整型#include<stdio.h>intArrayOperating(inti,charch){inta1=1,a2=0,a3=3,a4=5;intb1=2,b2=0,b3=4,b4=3;switch(i){case1: switch(ch) {case'a':returna1;case'b':returnb1; }case2:……case3:……case4:……}}voidmain(){inti;charch;printf("輸入顯示的變量,形式如:a1或b4:");scanf("%c%d",&ch,&i);printf("%c%d=%d\n",ch,i,ArrayOperating(i,ch));}2022/11/2161#include<stdio.h>voidmain()24.2.4函數(shù)的嵌套調(diào)用main函數(shù){

……

調(diào)用函數(shù)A;

……}函數(shù)A{……

調(diào)用函數(shù)B;

……}函數(shù)B{

……

……

……}2005年1月624.2.4函數(shù)的嵌套調(diào)用main函數(shù)函數(shù)A函數(shù)B200【例】函數(shù)的嵌套調(diào)用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結(jié)果:92005年1月63【例】函數(shù)的嵌套調(diào)用main()sub1(intn)su

4.2.5對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)的定義要出現(xiàn)在主調(diào)函數(shù)的定義之前。如swap函數(shù).voidswap(intx,inty){…}main(){…

swap(a,b);

}main(){…c=max(a,b);}max(intx,inty){…}允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù).2005年1月644.2.5對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式

函數(shù)類型函數(shù)名(參數(shù)類型1

參數(shù)名1,…);或函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…);第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對(duì)被調(diào)函數(shù)進(jìn)行聲明。2005年1月65對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式函數(shù)類型函數(shù)名(參#include<stdio.h>voidmain(){floatcalc(floatx,floaty,charopr);floata,b;charopr;printf("\n輸入四則運(yùn)算表達(dá)式:");scanf("%f%c%f",&a,&opr,&b);if(opr=='+'||opr=='-'||opr=='*'||opr=='/')printf("%5.2f%c%5.2f=%6.2f\n",a,opr,b,calc(a,b,opr));elseprintf("非法運(yùn)算符!\n");}floatcalc(floatx,floaty,charopr){switch(opr){case'+':return(x+y); case'-':return(x-y); case'*':return(x*y); case'/':return(x/y);}}}對(duì)被調(diào)函數(shù)的聲明【例4-12】計(jì)算并輸出兩個(gè)數(shù)的和、差、積、商。2005年1月66#include<stdio.h>對(duì)被調(diào)函數(shù)的聲明【例4-4.3局部變量和全局變量變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)。4.3.1局部作用域和局部變量【例】分析下面程序的運(yùn)行結(jié)果及變量的作用域。2005年1月674.3局部變量和全局變量變量的作用域:變量在程序中可以被使voidsub(inta,intb){intc;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部變量voidmain(){inta=1,b=1,c=1; printf("main:\ta=%db=%dc=%d\n",a,b,c);sub(a,b);printf("main:\ta=%db=%dc=%d\n",a,b,c);

{inta=2,b=2;printf("comp:\ta=%db=%dc=%d\n",a,b,c);}printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部變量局部變量“分程序”或“程序塊”程序輸出結(jié)果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=12005年1月68voidsub(inta,intb)局部4.3.2全局作用域和全局變量全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時(shí)不起作用。【例】全局變量和局部變量的作用域。2005年1月694.3.2全局作用域和全局變量全局變量(外部變量):在inta=5; voidf(intx,inty) {intb,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部變量main(){intb=6,c=7; f(b,c);printf("%d\t%d\t%d\n",a,b,c);

{inta=9,b=8; printf("%d\t%d\t%d\n",a,b,c);

{

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

}printf("%d\t%d\t%d\n",a,b,c);

}printf("%d\t%d\t%d\n",a,b,c);}局部變量局部變量程序輸出結(jié)果:511-2567987981098105610全局變量“分程序”或“程序塊”int2005年1月70inta=5; 局部變量main()局部變量局部4.4變量的生存期和存儲(chǔ)類別4.4.1變量的生存期變量的生存期:變量在內(nèi)存中占據(jù)存儲(chǔ)空間的時(shí)間。程序代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)存儲(chǔ)分配動(dòng)態(tài)存儲(chǔ)變量靜態(tài)存儲(chǔ)變量2005年1月714.4變量的生存期和存儲(chǔ)類別4.4.1變量的生存期變4.4.2變量的存儲(chǔ)類別變量的屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元的長度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲(chǔ)類別:決定了變量的生存期,給它分配在哪個(gè)存儲(chǔ)區(qū)。2005年1月724.4.2變量的存儲(chǔ)類別變量的屬性數(shù)據(jù)類型:存儲(chǔ)類別:20變量定義語句的一般形式存儲(chǔ)類別數(shù)據(jù)類型變量名1,…,變量名n;auto(自動(dòng)的)register(寄存器的)static(靜態(tài)的)

extern(外部的)2005年1月73變量定義語句的一般形式存儲(chǔ)類別數(shù)據(jù)類型變量名1,1.自動(dòng)變量(auto類別)main()

{intx,y;…}main()

{autointx,y;…}自動(dòng)變量等價(jià)可省局部變量可以定義為自動(dòng)變量。2005年1月741.自動(dòng)變量(auto類別)main()

{intx,y;main(){inta,b,c;

printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);printf(“Sum=%d\n”,c);}sum(inta,intb){intc=0;

c=a+b;return(c);}printf(“Entera,b:\n”);scanf(“%d%d”,&a,&b);c=sum(a,b);c=a+b;return(c);printf(“Sum=%d\n”,c);main()Entera,b:內(nèi)存用戶區(qū)靜態(tài)存儲(chǔ)區(qū)am

不定bm

不定cm

不定12<回車>as=1bs=2cs=0bm=2am=1sum(inta,intb)Sum=3程序程序區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)觀察下列程序運(yùn)行時(shí)變量的存儲(chǔ)情況單擊開始運(yùn)行as=1bs=2cs=3運(yùn)行結(jié)束cm=3

2005年1月75main()printf(“Entera,b:\n”);s⑴內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時(shí)在動(dòng)態(tài)存儲(chǔ)區(qū)為其分配存儲(chǔ)單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。⑵變量的初值定義變量時(shí)若沒賦初值,變量的初值不確定;如果賦初值則每次函數(shù)被調(diào)用時(shí)執(zhí)行一次賦值操作。⑶生存期在函數(shù)或分程序執(zhí)行期間。⑷作用域自動(dòng)變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動(dòng)變量2005年1月76⑴內(nèi)存分配自動(dòng)變量2005年1月332.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。st

溫馨提示

  • 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)論