C語言函數(shù)與編譯預(yù)處理市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第1頁
C語言函數(shù)與編譯預(yù)處理市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第2頁
C語言函數(shù)與編譯預(yù)處理市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第3頁
C語言函數(shù)與編譯預(yù)處理市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第4頁
C語言函數(shù)與編譯預(yù)處理市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第7章 函數(shù)與預(yù)處理命令C 語言程序設(shè)計(jì)第1頁2第7章 函數(shù)與預(yù)處理命令7.1 概述7.2 函數(shù)定義與調(diào)用7.3 變量作用域與存放方式7.4 編譯預(yù)處理第2頁37.1 概述 程序結(jié)構(gòu)清楚,可讀性好。 降低重復(fù)編碼工作量。 可多人共同編制一個(gè)大程序,縮短程序設(shè)計(jì)周期,提升程序設(shè)計(jì)和調(diào)試效率。使用函數(shù)好處C程序源程序文件n函數(shù)1函數(shù)m 源程序文件1函數(shù)1函數(shù)n第3頁4【例7.1】求一個(gè)整數(shù)立方。int cube (int x) /* 函數(shù)定義 */ return (x * x * x); main( ) int f, a; printf(nEnter an integer number:); sc

2、anf(%d, &a); f = cube (a); printf(%d * %d * %d = %dn, a, a, a, f);程序運(yùn)行情況以下:Enter an integer number: 2 2 * 2 * 2 = 8函數(shù)調(diào)用程序執(zhí)行總是從main函數(shù)開始第4頁5 一個(gè)C源程序能夠由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在對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ù),在

3、main函數(shù)中結(jié)束整個(gè)程序運(yùn)行。說明第5頁6 函數(shù)種類從函數(shù)定義形式分: 有參函數(shù)在主調(diào)(用)函數(shù)和被調(diào)(用)函數(shù)之間經(jīng)過參數(shù)進(jìn)行數(shù)據(jù)傳遞, 如: int cube (int x) 無參函數(shù)如:getchar( )在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)不需要將數(shù)據(jù)傳遞給無參函數(shù)。從使用角度看: 標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供。如:getchar( )、sin(x)等。在程序中能夠直接調(diào)用它們。附錄A列出了C部分庫函數(shù)。 用戶自定義函數(shù)如:例7.1中cube函數(shù)。第6頁7【例7.2】無參函數(shù)定義與調(diào)用。void welcome ( ) printf(*n); printf( Welcome to Ch

4、ina n); printf(*n);main( ) welcome( ); 程序輸出結(jié)果以下:* Welcome to China*第7頁87.2.1 函數(shù)定義函數(shù)定義普通形式函數(shù)類型 函數(shù)名(類型名 形式參數(shù)1, ) 說明語句 執(zhí)行語句比如:求兩個(gè)數(shù)最大值。 int max(int x, int y) int z; z = x y ? x : y; return( z );類型省略時(shí)默認(rèn)為int類型有形式參數(shù),max為有參函數(shù) 第8頁9int max(x,y)int x,y; int z; z = x y ? x : y; return( z );int max(x,y) int x,y;

5、或int max(int x,y) 或int max(x,y)int x,y,z; z = x y ? x : y; return( z );花括號中也可認(rèn)為空,這種函數(shù)叫空函數(shù) 。 例如:null( ) 不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。形參也能夠這么定義以下定義都是錯(cuò)誤 第9頁10函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表示式。所以凡是表示式能夠出現(xiàn)地方都能夠出現(xiàn)函數(shù)調(diào)用。比如: welcome( ); if (iabs (a)max) max=iabs(a); m=max(c,max(a,b);7.2.2 函數(shù)調(diào)用函數(shù)調(diào)用普通形式:第10頁11int sum( )

6、 int i,t=0; for (i=1; i=100; i+) t+=i; return (t);main( ) int s; s=sum( ); printf(%dn, s);程序輸出結(jié)果:5050int sum ( int x ) int i,t=0; for (i=1; iy?x:y; return (z); /* 返回z值 */main( ) int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(max is %dn,c);第15頁16函數(shù)返回值是經(jīng)過return語句帶回到主調(diào)函數(shù)。功效:終止函數(shù)運(yùn)行,返回主調(diào)函數(shù),若有返回值,將返回值帶

7、回主調(diào)函數(shù)。說明: 若函數(shù)沒有返回值,return語句能夠省略。 return語句中表示式類型普通應(yīng)和函數(shù)類型一致,假如不一致,VC系統(tǒng)警告同時(shí)自動將表示式類型轉(zhuǎn)換為函數(shù)類型。 函數(shù)返回值return 語句格式:return (表示式) ; return 表示式 ;return ;第16頁17【例7.8】計(jì)算并輸出圓面積。s(int r) return 3.14*r*r; main( ) int r,area; scanf(%d,&r); printf(%dn,s(r);自動轉(zhuǎn)換為int型 思索:若要得到雙精度實(shí)型圓面積,程序應(yīng)怎樣修改程序運(yùn)行情況以下:212?第17頁18 7.2.4 對被調(diào)

8、函數(shù)申明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)定義要出現(xiàn)在主調(diào)函數(shù)定義之前。如swap函數(shù):允許整型函數(shù)(且參數(shù)也是整型)定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù):假如非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對被調(diào)函數(shù)進(jìn)行申明。void swap(int x, int y) main( ) swap(a,b); main( ) c=max(a,b);max(int x, int y) 第18頁19對被調(diào)用函數(shù)說明 假如使用庫函數(shù),應(yīng)在文件開頭用#include命令將調(diào)用庫函數(shù)所需信息包含到文件中來。如: #include “stdio.h” stdio.h是開頭文

9、件,其中存放了I/O庫函數(shù)所用到一些宏定義信息。 #include“math.h” 使用數(shù)學(xué)庫函數(shù)應(yīng)用這條命令。假如使用用戶自己定義函數(shù),普通應(yīng)在主調(diào)函數(shù)中對被調(diào)用函數(shù)作類型說明。main( ) float add (float x, float y); float a,b,c; scanf(“%f,%f”,&a,&b); c=add(a,b); printf(“sum is %f”,c);float add (float x, float y) float z; z=x+y; return(z);float add (float x, float y);第19頁20對被調(diào)函數(shù)進(jìn)行申明普通形式

10、 函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1,);或 函數(shù)類型 函數(shù)名(參數(shù)類型1,參數(shù)類型2,);思索:以下哪種情況需要在主調(diào)函數(shù)中對被調(diào)函數(shù)申明被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后。主調(diào)函數(shù)定義在前,被調(diào)函數(shù)定義在后,且被調(diào)函數(shù)類型不是整型。被調(diào)函數(shù)定義在后,但被調(diào)函數(shù)類型是整型。第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)原型。?第20頁217.2.5 數(shù)組作函數(shù)參數(shù)1. 一維數(shù)組元素作函數(shù)參數(shù)main( ) int a5,i,m ; for (i=0; i5; i+) scanf(%d,&ai); m=a0; for (i=1; i5; i+) m=min(m,ai); printf(%dn,

11、 m);【例】求5個(gè)數(shù)中最小值。int min(int x, int y) return (xy?x:y); 用打擂臺方法求最小值。m相當(dāng)于擂主第21頁221. 一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中起始地址。 比如:數(shù)組a在內(nèi)存中從地址開始存放,則a值為。是地址值,是指針類型數(shù)據(jù)(第8中將介紹指針類型),不能把它看成是整型或其它類型數(shù)據(jù)。實(shí)參是數(shù)組名,形參也應(yīng)定義為數(shù)組形式,形參數(shù)組長度能夠省略,但 不能省,不然就不是數(shù)組形式了。 【例】用冒泡法將10個(gè)整數(shù)排序。第22頁23void sort(int b ,int n); void printarr(int b ); main( ) i

12、nt a10 = 11,22,63,97,58,80,45, 32,73,36; printf(Before sort:n); printarr(a); sort(a,10); printf(After sort:n); printarr(a);void printarr ( int b10 ) int i; for (i=0; i10; i+) printf(%5d,bi); printf(n);void sort ( int b , int n ) int i,j,t; for (i=1; in; i+) for (j=0; jbj+1) t=bj;bj=bj+1;bj+1=t; 第23頁

13、24 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 63 97 58 80 45 32 73 36(a) 排序前a0 a1 a2 a3 a4 a5 a6 a7 a8 a9b0 b1 b2 b3 b4 b5 b6 b7 b8 b911 22 32 36 45 58 63 73 80 97(b) 排序后圖7.3 調(diào)用sort函數(shù)b形參 b 實(shí)際是一個(gè)能夠存放地址變量a:實(shí)參賦給形參首地址: 首地址: 第24頁25#include stdio.hmain( ) void scat(char str1 ,char st

14、r2 ); char s150,s250; int i,k; printf(Input s1:); gets(s1); printf(Input s2:); gets(s2); scat(s1,s2); printf(Output s1:%sn,s1);void scat(char str1 ,char str2 ) int i=0,k=0; for ( ; str1i!=0 ; i+; ) ; for ( ; str2k!=0 ; i+, k+) str1i=str2k; str1i=0;scat函數(shù)還可簡化為:void scat(char str1 ,char str2 ) int i=0

15、,k=0; for ( ; str1i ; i+ ) ; for ( ; str1i+=str2k+ ; ) ;【例】編程序,實(shí)現(xiàn)字符串連接。第25頁26以二維數(shù)組為例。二維數(shù)組名作實(shí)參時(shí),對應(yīng)形參也應(yīng)該定義為一個(gè)二維數(shù)組形式。對形參數(shù)組定義時(shí)能夠指定每一維大小,也能夠省略第一維大小說明。【例】編程序,將矩陣轉(zhuǎn)置。設(shè)轉(zhuǎn)置前為a矩陣,轉(zhuǎn)置后為b矩陣,以下所表示: a=1 2 3 4 5 6 7 89 10 11 121 5 92 6 103 7 114 8 12b=思緒:將a00b00,a01 b10,a02b20,a10b01,aijbji,。2. 多維數(shù)組作函數(shù)參數(shù)第26頁27void tu

16、rn( ); main( ) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int i,j,b43; turn(a,b); printf(array b:n); for (i=0; i4; i+) for (j=0; j3; j+) printf(%5d,bij); printf(n); /* 矩陣轉(zhuǎn)置函數(shù) */void turn(int arra 4,int arrb 3) int r, c; for (r=0; r3;r+) for (c=0; c0; i-) a+=sub2(i); return a ; sub2(int n) return n+1; 程序輸出結(jié)

17、果:9 第29頁302. 函數(shù)遞歸調(diào)用(略)(1)遞歸基本概念遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。int sub(int x) int y,z; if( ) z=sub(y); else return ;比如:直接調(diào)用sub函數(shù)本身第30頁31(2)遞歸函數(shù)執(zhí)行過程【例7.16】編一遞歸函數(shù)求n!。思緒:以求4階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時(shí),n!=1。遞歸公式:n! =1 (n=0, 1)n(n-1)! (n1)第31頁32程序以下:float fac

18、t (int n) float f=0; if(n0) printf(n0,error!); else if (n=0 | n=1) f=1; else f=fact(n-1)*n; return (f);main( ) int n; float y; printf(nInput n:); scanf(%d,&n); y=fact(n); printf(%d!=%-10.0fn,n,y);運(yùn)行情況以下:Input a integer number:44!=24第32頁33遞歸調(diào)用過程 回 推main( ) fact(4) fact(3) fact(2) fact(1) y=fact(4); f

19、=4*fact(3); f=3*fact(2); f=2*fact(1); f=1; return 24 return 6 return 2 return 1 遞 推 第33頁347.3 局部變量和全局變量及其作用域7.3.1 變量作用域1. 局部變量及其作用域變量作用域:變量在程序中能夠被使用范圍。依據(jù)變量作用域能夠?qū)⒆兞糠譃榫植孔兞亢腿肿兞俊>植孔兞浚▋?nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)?!纠?.19】分析下面程序運(yùn)行結(jié)果及變量作用域。問題:一個(gè)變量在程序每個(gè)函數(shù)中都能使用嗎?第34頁35void sub(int a,int b) int c; a

20、=a+b; b=b+a; c=b-a;printf(sub:ta=%d b= %d c= %dn,a,b,c); 局部變量main( ) int a=1,b=1,c=1; printf(main:ta=%d b= %d c= %dn,a,b,c); sub(a,b); printf(main:ta=%d b= %d c= %dn,a,b,c); int a=2,b=2; printf(comp:ta=%d b= %d c= %dn,a,b,c); printf(main:ta=%d b= %d c= %dn,a,b,c); 局部變量局部變量程序輸出結(jié)果:main: a=1 b= 1 c= 1s

21、ub: a=2 b= 3 c= 1main: a=1 b= 1 c= 1comp: a=2 b= 2 c= 1main: a=1 b= 1 c= 1第35頁362. 全局變量及其作用域全局變量(外部變量):在函數(shù)外部定義變量。作用域:從定義變量位置開始到根源文件結(jié)束。如在其作用域內(nèi)函數(shù)或分程序中定義了同名局部變量,則在局部變量作用域內(nèi),同名全局變量暫時(shí)不起作用?!纠?.20】全局變量和局部變量作用域。第36頁37int a = 5;void f(int x, int y) int b,c; b=a+x; c=a-y;printf(%dt%dt%dn,a,b,c); 局部變量main( ) in

22、t b=6,c=7; f(b,c); printf(%dt%dt%dn,a,b,c); int a=9,b=8; printf(%dt%dt%dn,a,b,c); c=10; printf(%dt%dt%dn, a,b,c); printf(%dt%dt%dn,a,b,c); printf(%dt%dt%dn,a,b,c); 局部變量局部變量程序輸出結(jié)果:5 11 -25 6 79 8 79 8 109 8 105 6 10全局變量第37頁387.3.2 變量存放類別及變量生存期1. 變量生存期與變量存放分類變量生存期:變量在內(nèi)存中占據(jù)存放空間時(shí)間。思索:1. 何時(shí)為變量分配內(nèi)存單元? 2.

23、將變量分配在內(nèi)存什么區(qū)域? 3. 變量占據(jù)內(nèi)存時(shí)間(生存期)?程序代碼區(qū)靜態(tài)存放區(qū)動態(tài)存放區(qū)存放分配動態(tài)存放變量靜態(tài)存放變量第38頁392. 變量存放類別變量屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元長度;數(shù)據(jù)存放形式;數(shù)范圍。存放類別:決定了變量生存期;給它分配在哪個(gè)存放區(qū)。第39頁40變量定義語句普通形式存放類別 數(shù)據(jù)類型 變量名1, , 變量名n ;auto(自動) register(存放器)static(靜態(tài)) extern(外部)A. 自動變量(auto類別) 局部變量能夠定義為自動變量。main()int x,y; main()auto int x,y; 自動變量等價(jià)可省第40頁41 內(nèi)

24、存分配調(diào)用函數(shù)或執(zhí)行分程序時(shí)在動態(tài)存放區(qū)為其分配存放單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。 變量初值定義變量時(shí)若沒賦初值,變量初值不確定;假如賦初值則每次函數(shù)被調(diào)用時(shí)執(zhí)行一次賦值操作。 生存期 在函數(shù)或分程序執(zhí)行期間。 作用域自動變量所在函數(shù)內(nèi)或分程序內(nèi)。自動變量第41頁42B靜態(tài)變量(static類別)除形參外,局部變量和全局變量都能夠定義為靜態(tài)變量。局部靜態(tài)變量(或稱內(nèi)部靜態(tài)變量)全局靜態(tài)變量(或稱外部靜態(tài)變量)靜態(tài)變量靜態(tài)變量static int a; main( ) float x,y; f( ) static int b=1; 全局靜態(tài)變量局部靜態(tài)變量自動變量不能省第42

25、頁43 內(nèi)存分配編譯時(shí),將其分配在內(nèi)存靜態(tài)存放區(qū)中,程序運(yùn)行結(jié)束釋放該單元。 靜態(tài)變量初值若定義時(shí)未賦初值,在編譯時(shí),系統(tǒng)自動賦初值為0;若定義時(shí)賦初值,則僅在編譯時(shí)賦初值一次,程序運(yùn)行后不再給變量賦初值 。 生存期整個(gè)程序執(zhí)行期間。 作用域局部靜態(tài)變量作用域是它所在函數(shù)或分程序。全局靜態(tài)變量作用域是從定義處開始到根源文件結(jié)束。靜態(tài)變量第43頁44int c;static int a; main( ) float x,y; char s;f( ) static int b=1; 在函數(shù)外定義變量若沒有用 static說明,則是外部變量。外部變量只能隱式定義為extern類別,不能顯式定義。全局

26、靜態(tài)變量自動變量局部靜態(tài)變量外部變量第44頁45 extern 數(shù)據(jù)類型 變量名1,變量名n;或 extern 變量名1,變量名n;注意:外部變量申明用關(guān)鍵字extern,而外部變量定義不能用extern,只能隱式定義。定義外部變量時(shí),系統(tǒng)要給變量分配存放空間,而對外部變量申明時(shí),系統(tǒng)不分配存放空間,只是讓編譯系統(tǒng)知道該變量是一個(gè)已經(jīng)定義過外部變量,與函數(shù)申明作用類似。C. 外部變量(extern類別)第45頁46【例7.25】在多文件程序中申明外部變量。file1.c文件中程序以下:int i;main( ) void f1( ),f2( ),f3( ); i=1; f1( ); print

27、f(tmain: i=%d,i); f2( ); printf(tmain: i=%d,i); f3( ); printf(tmain: i=%dn,i);void f1( ) i+; printf(nf1: i=%d,i);file2.c文件中程序以下:extern int i; void f2( ) int i=3; printf(nf2: i=%d,i);void f3( ) i=3; printf(nf3: i=%d,i);程序輸出結(jié)果:f1: i=2 main: i=2f2: i=3 main: i=2f3: i=3 main: i=3申明外部變量定義外部變量第46頁47D. 存放器

28、變量(register類別)只有函數(shù)內(nèi)定義變量或形參能夠定義為存放器變量。存放器變量值保留在CPU存放器中。受存放器長度限制,存放器變量只能是char、int和指針類型變量。【例7.26】存放器變量使用。main( ) long int sum=0; register int i; for (i=1; i(Y)?(X):(Y)7.4 編譯預(yù)處理(續(xù))第55頁567.4 編譯預(yù)處理(續(xù))【例7.30】帶參數(shù)宏定義。#define MAX(x,y) (x)(y)?(x):(y)main( ) printf(%dn,a,b, MAX(a,b); printf(%dn,MAX(a+m,b+n);分兩次

29、替換:將宏名MAX(a,b) 替換成字符串 (x)(y)?(x):(y)。用實(shí)參a替換形參x,實(shí)參b替換形參y。程序中兩個(gè)printf語句被展開為:printf(%dn, (a)(b)?(a):(b); printf(%dn, (a+m)(b+n)?( a+m):( b+n);第56頁577.4 編譯預(yù)處理(續(xù))【例7.31】分析下面程序運(yùn)行后輸出結(jié)果。#define MA(x) x*(x-1)main( ) int a=1,b=2; printf(%dn, MA(1+a+b);分兩次替換: MA(1+a+b) 用x*(x-1) 替換。用1+a+b替換x。printf語句被展開為:printf(%dn, 1+a+b*(1+a+b-1);尤

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論