![函數(shù)以及編譯預(yù)處理_第1頁(yè)](http://file4.renrendoc.com/view/15c11f7df0f662859933c26289df3b0c/15c11f7df0f662859933c26289df3b0c1.gif)
![函數(shù)以及編譯預(yù)處理_第2頁(yè)](http://file4.renrendoc.com/view/15c11f7df0f662859933c26289df3b0c/15c11f7df0f662859933c26289df3b0c2.gif)
![函數(shù)以及編譯預(yù)處理_第3頁(yè)](http://file4.renrendoc.com/view/15c11f7df0f662859933c26289df3b0c/15c11f7df0f662859933c26289df3b0c3.gif)
![函數(shù)以及編譯預(yù)處理_第4頁(yè)](http://file4.renrendoc.com/view/15c11f7df0f662859933c26289df3b0c/15c11f7df0f662859933c26289df3b0c4.gif)
![函數(shù)以及編譯預(yù)處理_第5頁(yè)](http://file4.renrendoc.com/view/15c11f7df0f662859933c26289df3b0c/15c11f7df0f662859933c26289df3b0c5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、關(guān)于函數(shù)和編譯預(yù)處理第1頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.1 概述函數(shù): function,功能。 執(zhí)行或承擔(dān)某一功能的程序段,解答某問(wèn)題的一段程序。 它有特定的組織格式和使用方式。 函數(shù) 與 程序的關(guān)系: 一個(gè)復(fù)雜的C語(yǔ)言程序包含多個(gè)函數(shù)。(主函數(shù)main)它們可存放在多個(gè)文件中。模塊化程序設(shè)計(jì)思想: 劃分程序功能,每個(gè)子功能用子函數(shù)(主函數(shù)之外的函數(shù))來(lái)承擔(dān),而讓 主函數(shù) 去 調(diào)用(使用) 這些子函數(shù) 從而實(shí)現(xiàn)程序的所有功能。每個(gè)函數(shù)單獨(dú)設(shè)計(jì)調(diào)試,而且可以重復(fù)使用。第2頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四main( )func1()func2(
2、)func3()func5()func4()主調(diào)函數(shù)、調(diào)用被調(diào)函數(shù)(子函數(shù))、被調(diào)用參數(shù)返回值主調(diào)函數(shù) 和 被調(diào)函數(shù) 的關(guān)系: 上下級(jí) 關(guān)系請(qǐng)問(wèn):main( ) 被 誰(shuí)調(diào)用?一個(gè)程序中 函數(shù) 調(diào)用 的示意圖:第3頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四#include void main( ) int n; cinn; if (n1) cout“the sum is:” sum( n )endl; /調(diào)用 sum()函數(shù) int sum( int n) 例3.1 編寫(xiě)函數(shù)求前 n 個(gè)自然數(shù)之和,n 的值從鍵盤(pán)輸入。函數(shù)首部、函數(shù)頭函數(shù)首部/函數(shù)頭函數(shù)體 int k,s=0; f
3、or (k=1;ky)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ; cout“The max is” cy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a , b) ; cout“The max is” cendl; ab23調(diào)用處(表達(dá)式中)3xy23zc=3不要將函數(shù)名做變量用!不能寫(xiě)成 max=z;第14頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(2)自定義函數(shù)的聲明函數(shù)類(lèi)型關(guān)鍵字 函數(shù)名( 參數(shù)
4、1 類(lèi)型 , 參數(shù)1名稱(chēng) ,參數(shù)2 類(lèi)型 , 參數(shù)2名稱(chēng) ); 什么時(shí)候需要聲明? 聲明的含義、作用? 聲明的格式、位置?(1)庫(kù)函數(shù)的聲明 對(duì)庫(kù)函數(shù)的聲明已經(jīng)寫(xiě)在有關(guān) 包含文件(頭文件) 中了,因此只要在程序文件首部用 include 指令將這些 包含文件 包含到本程序中來(lái),就完成了對(duì)庫(kù)函數(shù)的聲明。 #include 3.2.2 函數(shù)的聲明(補(bǔ)述)函數(shù)的聲明形式也叫做函數(shù)原型(function prototype) 。 它說(shuō)明了函數(shù)的類(lèi)型、函數(shù)名、函數(shù)各形式參數(shù)類(lèi)型。函數(shù)類(lèi)型關(guān)鍵字 函數(shù)名( 參數(shù)1 類(lèi)型 ,參數(shù)2 類(lèi)型 );修改p68名稱(chēng)任意,可省略第15頁(yè),共97頁(yè),2022年,5月20
5、日,11點(diǎn)1分,星期四【例3.2】輸入圓柱體的底面半徑和高,求底面圓面積和體積。設(shè)函數(shù) area()和 volum()分別求圓面積和圓柱體體積。#include using namespace std;void main() double volum(float, float); /聲明 double area(float r); /聲明 float r,h; double s,v; coutrh; s= area(r); /調(diào)用 v= volum(r,h); /調(diào)用 couts=s,v=vab; c=add (a , 3.5) ; cout“The sum is” cendl; (2)實(shí)參
6、與 形參的類(lèi)型應(yīng)相同或賦值兼容。第18頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四 值傳遞: 調(diào)用函數(shù)時(shí),計(jì)算機(jī)將函數(shù)調(diào)用處的實(shí)參值傳給被調(diào)函數(shù)的形參,在被調(diào)函數(shù)執(zhí)行過(guò)程中,形參可以被改變,但不影響函數(shù)調(diào)用處的實(shí)參值。換一句話說(shuō),這種參數(shù)傳遞機(jī)制是單向影響。3.3.1 參數(shù)的 值傳遞 (前面已介紹)第19頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四 除了3.3.2小節(jié)介紹的值傳遞參數(shù)方式外,函數(shù)調(diào)用還有一種特殊的值傳遞形式,即傳遞的值不是一般的數(shù)值,而是一些內(nèi)存單元地址編號(hào)(即地址),這時(shí),一般稱(chēng)之為參數(shù)的地址傳遞。在這種參數(shù)傳遞形式中,無(wú)論在函數(shù)的定義中出現(xiàn)的形參還是
7、在調(diào)用語(yǔ)句中出現(xiàn)的實(shí)參,都是代表一些內(nèi)存單元地址編號(hào)(即地址數(shù)值),而不是一般的數(shù)值。 C+中的參數(shù)地址傳遞情況一般有如下幾種:實(shí)參可以是一個(gè)有確定值的普通變量的地址,或者是一個(gè)已經(jīng)初始化的指針變量;或者是一個(gè)初始化的數(shù)組名;或者是一個(gè)具體的函數(shù)名。而形參可以是一個(gè)任意普通變量的地址,或是一個(gè)任意指針變量,或是一個(gè)任意的數(shù)組名,或是一個(gè)指向函數(shù)的指針變量(對(duì)應(yīng)于實(shí)參是具體函數(shù)名)。 3.3.2 參數(shù)的 地址傳遞(4章)第20頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四 實(shí)際上,這種參數(shù)傳遞機(jī)制就是在函數(shù)調(diào)用時(shí)把一個(gè)內(nèi)存單元地址傳遞給形參,使形參也具有實(shí)參的內(nèi)存單元地址(即兩者對(duì)應(yīng)同
8、一個(gè)內(nèi)存單元),稱(chēng)作形參和實(shí)參地址結(jié)合,兩者合二為一。這樣一來(lái),任何時(shí)候形參的值等于實(shí)參的值;而實(shí)參的值也等于形參的值。因此,形參在函數(shù)中發(fā)生變化后,也會(huì)引起實(shí)參跟著變化(因?yàn)樗鼈兪抢壴谝黄鸬模惑w化的)。這就意味著按地址傳遞的方式,在調(diào)用剛開(kāi)始時(shí)實(shí)參的值影響了形參;而在被調(diào)函數(shù)執(zhí)行過(guò)程中形參值若發(fā)生了變化,它也會(huì)影響實(shí)參的值變化。即機(jī)制是雙向影響,這與普通值傳遞方式的單向影響機(jī)制形成對(duì)比。第21頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.5】 延遲函數(shù)的使用。#include void delay(int loop); /聲明void main( ) coutbegin
9、endl; delay( 1000 ); /調(diào)用 coutendendl;void delay(int loop) /定義 if (loop=0) return; for(int i=0;iloop;i+) coutiendl; 3.3.3 帶 默認(rèn)值 的參數(shù) (C+) C+語(yǔ)言中,允許在函數(shù)定義或聲明時(shí)給一個(gè)或多個(gè)形參指定默認(rèn)值。這樣,后面的函數(shù)調(diào)用中,可以不給具有默認(rèn)值的形參設(shè)定相應(yīng)的實(shí)參。void delay(int loop=1000); void delay(int x=1000); delay( ); /調(diào)用 第22頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四 對(duì)于教材
10、【例3.2】的求圓柱體體積的函數(shù)volume( ),如下聲明:float volume(float r, float h=8.5); /只對(duì)形參h指定默認(rèn)值8.5這時(shí)函數(shù)調(diào)用形式:volume(6.0); /相當(dāng)于volume(6.0, 8.5)volume(6.0,7.2); / r的值為6.0,h的值為7.2 如果函數(shù)有多個(gè)形參,可以對(duì)每個(gè)或部分形參指定默認(rèn)值。 指定默認(rèn)值的形參必須放在參數(shù)列表中的 最 右 邊。第23頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四課堂總結(jié)第24頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四a 函數(shù)b 函數(shù)main 函數(shù)結(jié)束(2)(3)(
11、4)(5)(6)(7)(8)(9)C語(yǔ)言不允許對(duì)函數(shù)作嵌套定義!3.4.1 嵌套調(diào)用:在一個(gè)函數(shù)定義中,可以調(diào)用另一個(gè)函數(shù)。 程序執(zhí)行時(shí),在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。 例如:3.4 函數(shù)的 嵌套調(diào)用 和 遞歸調(diào)用調(diào)用 a 函數(shù)調(diào)用 b 函數(shù)main( )函數(shù) 直接地 調(diào)用了 a函數(shù),main( )函數(shù) 嵌套地 調(diào)用了 b函數(shù)(間接調(diào)用)。第25頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四long comb(int n, int m) /定義組合函數(shù)long c; c=fac(m)/(fac(n)*fac(m-n);/ 嵌套調(diào)用階乘函數(shù) return c;void ma
12、in() int n,m; long c;coutplease input two integer numbers:m,nmn;c= comb (n,m); / 調(diào)用組合函數(shù)combcoutc=cendl;main()分析:定義函數(shù)long comb(int n,int m) 求組合數(shù)。定義函數(shù)long fac(int k)求k的階乘。comb()fac()#include using namespace std;long fac(int k) / 定義求階乘的函數(shù)long f=1; int i; for(i=1;i=k;i+) f = f*i; return f;【例3.6】編程求組合數(shù),第
13、26頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.4.2 函數(shù)的 遞歸調(diào)用 在調(diào)用一個(gè)函數(shù)的過(guò)程中,被調(diào)用函數(shù)又直接或間接地調(diào)用 自身,這種調(diào)用過(guò)程稱(chēng)為函數(shù)的遞歸(recursive)調(diào)用。直接遞歸 調(diào)用 函數(shù) 的代碼形式:int f ( ) / 函數(shù)f1的定義 / 函數(shù)其它部分 z=f ( ); / 直接調(diào)用自身 / 函數(shù)其它部分 在函數(shù)f ( ) 中,又直接調(diào)用了f ( )函數(shù)。第27頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四間接遞歸 調(diào)用 函數(shù) 可以表現(xiàn)為如下:int f1 ( ) / 函數(shù)f1的定義 / f1的其他部分x=f2 ( ); / 調(diào)用f2 ( )
14、 / f1的其他部分 int f2 ( ) / 函數(shù)f2的定義 / f2的其他部分y=f1 ( ); / 調(diào)用f1 ( ) / f2的其他部分 第28頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四函數(shù)的直接遞歸調(diào)用 函數(shù)的間接遞歸調(diào)用 圖中調(diào)用過(guò)程特點(diǎn):這兩種遞歸調(diào)用都是無(wú)終止的自身調(diào)用?! 程序中不應(yīng)出現(xiàn)這種無(wú)終止的遞歸調(diào)用,而只應(yīng)出現(xiàn)有限次數(shù)的、有終止的遞歸調(diào)用! 解決:用if語(yǔ)句來(lái)控制,只有在某一條件成立時(shí)才繼續(xù)執(zhí)行遞歸調(diào)用,否則就不再繼續(xù)。包含遞歸調(diào)用的函數(shù)稱(chēng)為遞歸函數(shù)。第29頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.7】 用遞歸計(jì)算 n!。求n!,應(yīng)先
15、求(n-1)??;而求(n-1)!,又需要先求(n-2)!,而求(n 2)!;又可以變成求(n-3)!,如此繼續(xù),直到最后變成求1!的問(wèn)題,而根據(jù)公式有1!=1(這就是本問(wèn)題的遞歸終止條件)。由終止條件得到1!結(jié)果后,再反過(guò)來(lái) 依次求出2!,3!直到最后求出n!。第30頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.7】 用遞歸計(jì)算n!。 n!本身就是以遞歸的形式定義的:#include using namespace std;long fac(int n)long f; if (n=1) f=1; else f=n*fac(n-1); / 遞歸調(diào)用,求(n-1)! return
16、 f;void main( )long y; int n; coutplease input a integer n n; y=fac(n); /調(diào)用fac(n)求n!coutn=n,y=y1)long fibonacci(int n)if( n=0|n=1 )return n;elsereturn fibonacci(n-1)+fibonacci(n-2);程序如下所示: 實(shí)驗(yàn)教程P19 三 實(shí)驗(yàn)思考 1:求Fibonacci數(shù)列 大于t的最小項(xiàng) 的值。第34頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四void main()int n=0,t;long result,t;cint
17、;result=fibonacci(n);whlie (result=t) n+; result=fibonacci(n); coutresult;方法:1.遞歸函數(shù)實(shí)驗(yàn)教程: P19 三 實(shí)驗(yàn)思考 1 2.用循環(huán)做 實(shí)驗(yàn)教程: p90.四,1 3. 數(shù)組 教材:p140,3第35頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四求兩個(gè)數(shù)最大公約數(shù)的方法1. 輾轉(zhuǎn)相除法 (p57)2. 短除法3. 試探法4. 遞歸方法 (用 函數(shù)遞歸調(diào)用 做)用 g(m,n) 表示m、n的最大公約數(shù),請(qǐng)寫(xiě)出則其遞歸定義。第36頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四遞歸邊界(終止)條件使
18、問(wèn)題向遞歸邊界(終止)條件轉(zhuǎn)化的規(guī)則類(lèi)似例題習(xí)題:強(qiáng)調(diào):上述問(wèn)題的遞歸定義具備兩個(gè)成分:第37頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四遞推方法程序描述繁雜,可讀性差;主要采用 循環(huán)結(jié)構(gòu);逐步執(zhí)行;當(dāng)前值的求得總建立在前面求解的基礎(chǔ)上;遞歸方法描述與原始問(wèn)題(遞歸公式)比較接近;書(shū)寫(xiě)簡(jiǎn)潔、易讀易寫(xiě);易于分析算法的復(fù)雜性和證明算法的正確性;在問(wèn)題轉(zhuǎn)化時(shí),需要花時(shí)間和存儲(chǔ)空間將有關(guān)的“現(xiàn)場(chǎng)信息”保存起來(lái);當(dāng)達(dá)到終止條件時(shí),系統(tǒng)又需要花時(shí)間將有關(guān)的“現(xiàn)場(chǎng)信息”恢復(fù)以便處理未曾處理完的函數(shù)調(diào)用 。占用存儲(chǔ)空間少,執(zhí)行速度快。遞歸 與 遞推 算法遞歸函數(shù)的適應(yīng)場(chǎng)合:待求解的問(wèn)題含有遞歸關(guān)系
19、。第38頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.8】 漢諾塔問(wèn)題abc漢諾塔(Tower of Hanoi)問(wèn)題據(jù)說(shuō)來(lái)源于布拉瑪神廟。該問(wèn)題的裝置如圖3.6所示(圖上僅畫(huà)三個(gè)金片以簡(jiǎn)化問(wèn)題的原理,原問(wèn)題有64個(gè)金片),底座上有三根金鋼石的針,第一根針a上放著從大到小64個(gè)金片。解決該問(wèn)題就是要想法把所有金片從第一根針a上移到第三根針c上,第二根針b作為中間過(guò)渡。要求是每次只能移動(dòng)一個(gè)金片,并且任何時(shí)候不允許大的金片壓在小的金片上面。 圖3.6 三個(gè)金片的漢諾塔問(wèn)題裝置第39頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四1. 本問(wèn)題的遞歸終止條件。如果只有1個(gè)盤(pán)
20、,顯然問(wèn)題的解就很明顯是:直接把金片從a移到c。因此終止條件是n = 1;終止條件對(duì)應(yīng)的操作是直接把金片從a移到c,示意ac。2. 本問(wèn)題的遞歸分析:移動(dòng)n個(gè)金片從a到c,必須先將n-1個(gè)金片從a借助c移動(dòng)到b,移動(dòng)n-1個(gè)金片與原問(wèn)題相同,但規(guī)模變小,即向終止條件接近,因此,此問(wèn)題可以用遞歸過(guò)程完成。遞歸過(guò)程可以用如下步驟表示:(1)將n-1個(gè)金片從a經(jīng)過(guò)c移動(dòng)到b。(2)將第n個(gè)金片從a直接移動(dòng)到c。(3)再將n-1個(gè)金片從b經(jīng)過(guò)a移動(dòng)到c。 第40頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四一般地,設(shè)將n個(gè)金片從x針借助y針移動(dòng)到z針的函數(shù)原形為:void hanoi(int
21、 n,char x,char y,char z)根據(jù)解題步驟,可以寫(xiě)出求解n個(gè)金片的漢諾塔函數(shù)如下:#include /*ex3_8.cpp*using namespace std;void hanoi(int n,char x,char y,char z) if (n=1) /n=1時(shí),直接將金片從x移動(dòng)到z cout x z 1時(shí) hanoi(n-1,x,z,y); /先將n-1個(gè)金片從借助z移動(dòng)到y(tǒng) cout x z 1時(shí),就遞歸調(diào)用hanoi(),每次n減1。最后當(dāng)n=1時(shí),直接移動(dòng)該金片就可以了。 主函數(shù)如下: void main() int n; cout input n: n;
22、hanoi(n,a,b,c); / n個(gè)金片從a針借助b針移動(dòng)到c針 雖然遞歸調(diào)用在寫(xiě)程序時(shí)很簡(jiǎn)單,但執(zhí)行起來(lái)卻很復(fù)雜(時(shí)間、存儲(chǔ)空間都開(kāi)銷(xiāo)大)。對(duì)于漢諾塔問(wèn)題程序的執(zhí)行過(guò)程分析比較復(fù)雜,有興趣的讀者可參閱教材對(duì)3個(gè)盤(pán)情景的分析(圖3.7 及其相應(yīng)文字?jǐn)⑹觯?第42頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.5 內(nèi)置函數(shù) (C+,選講)一般函數(shù)調(diào)用的過(guò)程:調(diào)用前:參數(shù)傳遞,保存下條指令地址信息,和CPU狀態(tài)信息,執(zhí)行流程轉(zhuǎn)入被調(diào)函數(shù)。調(diào)用完畢:傳回函數(shù)值,執(zhí)行流程回到主調(diào)函數(shù)。函數(shù)調(diào)用花費(fèi)額外的時(shí)間和空間!如果函數(shù)頻繁地被調(diào)用,如調(diào)用出現(xiàn)在循環(huán)中,則開(kāi)銷(xiāo)大,影響效率(缺點(diǎn))。
23、函數(shù)的優(yōu)點(diǎn)之一:便于實(shí)現(xiàn)模塊化/結(jié)構(gòu)化程序設(shè)計(jì)的方法。發(fā)揮其優(yōu)點(diǎn),克服其缺點(diǎn),采用內(nèi)置函數(shù)第43頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.5 內(nèi)置函數(shù) (C+,選講)一般函數(shù)調(diào)用的過(guò)程:C+編譯時(shí)將被調(diào)函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中,程序執(zhí)行時(shí)不必將流程轉(zhuǎn)出去。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱(chēng)為內(nèi)置函數(shù)(inline function),又稱(chēng)內(nèi)嵌函數(shù) 或 內(nèi)聯(lián)函數(shù)。第44頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.5.1 內(nèi)置函數(shù)的作用 提高程序中函數(shù)調(diào)用的效率;并保持程序的可讀性。 適應(yīng)場(chǎng)合:如果函數(shù)頻繁地被調(diào)用.指定內(nèi)置函數(shù)的方法:在函數(shù)定義首行(或函數(shù)說(shuō)明)
24、的左端加一個(gè)關(guān)鍵字inline即可。第45頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四#include int is_number(char); /函數(shù)聲明void main( ) char c; while (c= cin.get() !=n) if ( is_number(c) ) /調(diào)用一個(gè)小函數(shù)coutyou enter a digit n;else cout=0& ch=9)?1:0 ; 【例3.9】 判斷用戶從鍵盤(pán)輸入的系列字符是數(shù)字字符還是其它字符的函數(shù)is_number()。第46頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四程序中不斷到設(shè)備中讀取數(shù)據(jù),頻
25、繁調(diào)用is_number()函數(shù)。為了避免頻繁調(diào)用函數(shù),提高執(zhí)行效率,可以將【例3.9】程序改為:#include /*ex3_9b.cpp*void main() char c; while (c=cin.get()!=n) if ( (c=0& c=9)?1:0 ) /修改處:直接計(jì)算表達(dá)式 coutyou enter a digit n; else coutyou enter a non-digit n; 第47頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四修改后的程序在if語(yǔ)句中用表達(dá)式替換了函數(shù)調(diào)用。在程序運(yùn)行上,提高了一些執(zhí)行效率,因?yàn)槊馊チ舜罅康暮瘮?shù)調(diào)用開(kāi)銷(xiāo)。但是,由于
26、is_number函數(shù)比相應(yīng)的表達(dá)式可讀性好,所以修改后的代碼可讀性降低,尤其若程序中多處出現(xiàn)is_number的替換時(shí),會(huì)大大降低可讀性。我們希望既要用函數(shù)調(diào)用來(lái)體現(xiàn)其結(jié)構(gòu)化和可讀性,又要使效率盡可能地高。為了盡量做到兩全其美,C+中引入內(nèi)置函數(shù)這個(gè)方法。第48頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四內(nèi)置函數(shù)的定義格式如下: inline 類(lèi)型名 函數(shù)名(形參列表) /函數(shù)體 內(nèi)置函數(shù)的聲明格式如下:inline 類(lèi)型名 函數(shù)名(形參類(lèi)型表);其實(shí),內(nèi)置函數(shù)只要在開(kāi)頭一次性聲明為inline即可,而后面的函數(shù)定義仍可寫(xiě)成一般函數(shù)定義的形式,編譯器也會(huì)將函數(shù)視為內(nèi)置函數(shù)。3.5
27、.2 定義 和 使用 內(nèi)置函數(shù)第49頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四對(duì)【例3.9】使用內(nèi)置函數(shù)來(lái)解決,代碼可以寫(xiě)成下列形式:#include /*ex3_9c.cpp*inline int is_number(char);/inline函數(shù)聲明void main( ) char c; while (c=cin.get()!=n) if (is_number(c) /調(diào)用一個(gè)小函數(shù)coutyou enter a digit n;else cout=0& ch=9)?1:0; 第50頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(1)內(nèi)置函數(shù)與一般函數(shù)的區(qū)別在于函
28、數(shù)調(diào)用的處理。一般函數(shù)進(jìn)行調(diào)用時(shí),要將程序執(zhí)行到被調(diào)用函數(shù)中,然后返回到主調(diào)函數(shù)中;而內(nèi)置函數(shù)在調(diào)用時(shí),是將調(diào)用部分用內(nèi)置函數(shù)體來(lái)替換。(2)若函數(shù)定義部分在調(diào)用之后,則內(nèi)置函數(shù)必須先聲明后調(diào)用。因?yàn)槌绦蚓幾g時(shí)要對(duì)內(nèi)置函數(shù)替換,所以在內(nèi)置函數(shù)調(diào)用之前必須聲明是內(nèi)置的(inline),否則將會(huì)像一般函數(shù)那樣產(chǎn)生調(diào)用而不是進(jìn)行替換操作。(3)在內(nèi)置函數(shù)中,不能含有復(fù)雜的結(jié)構(gòu)控制語(yǔ)句,如switch、for和while。如果內(nèi)置函數(shù)有這些語(yǔ)句,則編譯器將該函數(shù)視同一般函數(shù)那樣產(chǎn)生函數(shù)調(diào)用。(4)遞歸函數(shù)不能用作內(nèi)置函數(shù)。(5)以后講到的類(lèi)中,所有定義在說(shuō)明內(nèi)部的函數(shù)都是內(nèi)置函數(shù)。關(guān)于內(nèi)置函數(shù)的說(shuō)明:
29、第51頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.6 變量 和 函數(shù) 的屬性變量的屬性:類(lèi)型、名稱(chēng)、作用域、生存期 3.6.1 變量的作用域 作用域:指變量在 空間上 的有效范圍。1局部變量局部變量:在函數(shù)或程序塊(復(fù)合語(yǔ)句)內(nèi)定義的變量。其作用域:相應(yīng)的函數(shù)體 或 程序塊,從定義點(diǎn)到相應(yīng)的函數(shù)體 或 程序塊的尾部。void f( int t ) / t為函數(shù)級(jí)的局部變量。 int x1 ; / x1為函數(shù)級(jí)的局部變量。 int y1 ; / y1為語(yǔ)句塊級(jí)的局部變量, int y2 ; / y2為語(yǔ)句塊級(jí)的局部變量, int x2 ; / x2為函數(shù)級(jí)的局部變量。 第52頁(yè),
30、共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.10】 局部變量的使用。#include double fun1(double a, double b) double c; /fun1函數(shù)中3個(gè)局部變量a、b、cc=a+b; return c; void main() /main函數(shù)中3個(gè)局部變量a、b、cdouble a,b,c; coutab; c=fun1(a,b); couta+b=cendl; c=fun2(a,b); couta*b=cendl;局部變量同名現(xiàn)象:不同范圍的局部變量可以同名,不同范圍的同名局部變量表示不同的數(shù)據(jù)。但同一范圍內(nèi)不允許兩變量同名出現(xiàn)。doub
31、le fun2(double a,double b) double c; /fun2函數(shù)中3個(gè)局部變量a、b、cc=a*b; return c;第53頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四注意: 在函數(shù)聲明中出現(xiàn)的參數(shù)名,其作用范圍只在本行的括號(hào)內(nèi)。例如:int max(int a,int b); /函數(shù)聲明中出現(xiàn)的a、b,它們的作用范圍只在本行有效。 int max(int, int); 第54頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四 定義在函數(shù)以外的變量(外部變量,靜態(tài)全局變量)。作用域:從變量定義處到該文件結(jié)尾處。 通過(guò)聲明后, 對(duì)本程序的其它文件中的函
32、數(shù)也可見(jiàn)。 2全局變量第55頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四#include int a; /a的作用域?yàn)檎麄€(gè)文件void fun1( ); /聲明fun1函數(shù)void main( ) coutaendl; /main函數(shù)中使用了全局變量afun1( ); /調(diào)用fun1函數(shù)coutaendl; /main函數(shù)中再次使用全局變量avoid fun1( ) a=5; / fun1函數(shù)中使用全局變量a 程序運(yùn)行結(jié)果如下:05沒(méi)有設(shè)定初始值的全局變量,編譯默認(rèn)其初值為0?!纠?.11】 全局變量 的使用第56頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四說(shuō)明:(1)
33、沒(méi)有人為設(shè)定初始值的全局變量,編譯將其初值設(shè)為0(全局變量默認(rèn)初始值為0)。 (2)全局變量可以定義在任何位置,但其作用域是從定義的位置開(kāi)始到文件的末尾。 而定義在文件中間的全局變量就只能被其下面的函數(shù)所使用,全局變量定義之前的所有函數(shù)不會(huì)知道該變量。 (3)全局變量 為函數(shù)之間 數(shù)據(jù)的傳遞 提供了通道。由于全局變量可以被其定義后的函數(shù)所使用,所以可以使用全局變量進(jìn)行函數(shù)間數(shù)據(jù)的傳遞。而且這種傳遞數(shù)據(jù)的方法可以傳遞多個(gè)數(shù)據(jù)的值。第57頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四gcd(a, b) maxlcm(a, b)main( ) min分析:由于求最小公倍數(shù)要依賴(lài)于最大公約數(shù)
34、,所以應(yīng)先求最大公約數(shù)。故應(yīng)將求最大公約數(shù)的函數(shù)寫(xiě)在前面,求最小公倍數(shù)的函數(shù)放在后面。int gcd(int, int);/聲明求最大公約數(shù)的函數(shù)int lcm(int, int); /聲明求最小公倍數(shù)的函數(shù)int max , min; /全局變量分別存放 最大公約數(shù)、最小公倍數(shù)void main( )【例3.12】 分別寫(xiě)兩個(gè)函數(shù)求給定兩個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)。其中,要求用全局變量存放最大公約數(shù)和最小公倍數(shù)。第58頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四分析:由于求最小公倍數(shù)要依賴(lài)于最大公約數(shù),所以應(yīng)先求最大公約數(shù)。故應(yīng)將求最大公約數(shù)的函數(shù)寫(xiě)在前面,求最小公倍數(shù)的函數(shù)放
35、在后面。#include int gcd(int, int);/聲明求最大公約數(shù)的函數(shù)int lcm(int, int); /聲明求最小公倍數(shù)的函數(shù)int max , min; /全局變量分別存放最大公約數(shù)、最小公倍數(shù)void main( ) int a; int b; coutab; gcd (a,b); lcm(a,b); cout the greatest common divisor is :maxendl; /使用全局變量 max cout the lease common multiple is :minendl; /使用全局變量 min【例3.12】 分別寫(xiě)兩個(gè)函數(shù)求給定兩個(gè)數(shù)的
36、最大公約數(shù)和最小公倍數(shù)。其中,要求用全局變量存放最大公約數(shù)和最小公倍數(shù)。第59頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四int gcd(int x,int y) int t;int r; if (xy) t=x;x=y;y=t; r=x%y; while(r!=0) x=y; y=r; r=x%y; max=y; return max;/使用全局變量maxint lcm(int x,int y) min=x*y/max; /使用全局變量max求全局變量min, return min; /返回全局變量min void gcd(int x,int y) int t;int r; if
37、 (xy) t=x;x=y;y=t; r=x%y; while(r!=0) x=y; y=r; r=x%y; max=y;第60頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(4) 全局變量降低了函數(shù)的通用性,建議不在必要時(shí)不要使用全局變量(缺點(diǎn))。因?yàn)槿绻瘮?shù)在執(zhí)行的時(shí)候使用了全局變量,那么其他程序使用該函數(shù)時(shí)也必須將該全局變量一起移過(guò)去。另外,全局變量在程序執(zhí)行的全部過(guò)程都占用存儲(chǔ)空間,而不是需要時(shí)才開(kāi)辟存儲(chǔ)空間。 第61頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3不同作用域的同名變量引用規(guī)則 程序運(yùn)行結(jié)果是:1,2,3,5 【例3.13】不同作用域的同名變量引用規(guī)
38、則示例。int a=5; /全局變量aint fun(); /聲明一個(gè)函數(shù)main() int a; /函數(shù)級(jí)局部變量a a=1; /引用是函數(shù)級(jí)局部變量a couta”,”; /此處引用的是函數(shù)級(jí)局部變量a int a; /程序塊級(jí)局部變量a a=2; /此處引用是程序塊級(jí)局部變量a couta”,”; /此處引用的是程序塊級(jí)局部變量a a=3; /此處引用的a是函數(shù)級(jí)局部變量a couta”,”; /此處引用的a是函數(shù)級(jí)局部變量a coutfun()endl;int fun() return a; /全局變量a 重名變量作用域規(guī)則:在某個(gè)作用域范圍內(nèi)定義的變量,在該范圍的子范圍內(nèi)可以定義重
39、名變量,這時(shí)原定義的變量在子范圍內(nèi)是不可見(jiàn)的,但是它還存在,只是在子范圍內(nèi)由于出現(xiàn)了重名的變量而被暫時(shí)隱藏起來(lái),過(guò)了子范圍后,它又是可見(jiàn)的。第62頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.6.2 變量的生存期(較難)變量存儲(chǔ)期(生命期) :變量(值)在內(nèi)存中存在的時(shí)間。動(dòng)態(tài)存儲(chǔ)區(qū)(堆棧)靜態(tài)(全局)存儲(chǔ)區(qū)寄存器(CPU中)數(shù)據(jù)存儲(chǔ)區(qū)(變量存儲(chǔ)區(qū))1短生存期變量動(dòng)態(tài)存儲(chǔ)方式2長(zhǎng)生存期變量靜態(tài)存儲(chǔ)方式變量存儲(chǔ)期長(zhǎng)短 由變量的 存儲(chǔ)方式 決定。動(dòng)態(tài)存儲(chǔ)方式:在程序運(yùn)行期間動(dòng)態(tài)地分配存儲(chǔ)空間給變量的方式。 包括:函數(shù)的形參,函數(shù)或程序塊中定義的局部變量(未用static聲明)。 具體
40、有兩種:自動(dòng)變量、寄存器類(lèi)變量。靜態(tài)存儲(chǔ)方式:在程序運(yùn)行期間分配固定的存儲(chǔ)空間給變量的方式。 存儲(chǔ)位置:靜態(tài)(全局)存儲(chǔ)區(qū),生存期:為程序運(yùn)行期間。包括:全局變量(含外部變量、靜態(tài)全局變量)、靜態(tài)局部變量。存儲(chǔ)位置:在動(dòng)態(tài)存儲(chǔ)空間(堆或棧)或寄存器中。存儲(chǔ)期:為函數(shù)或程序塊的運(yùn)行期間。 第63頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四存儲(chǔ)位置:在動(dòng)態(tài)數(shù)據(jù)存儲(chǔ)區(qū);生存期:函數(shù) 或 程序塊 執(zhí)行期間;作用域:其所在函數(shù)或程序塊。用關(guān)鍵字auto作為存儲(chǔ)類(lèi)別的聲明。例如:int fun() auto int a; /a為自動(dòng)類(lèi)變量 關(guān)鍵字“auto”可以省略。上述自動(dòng)變量也可聲明為 i
41、nt a;(1)自動(dòng)變量:函數(shù)中的局部變量默認(rèn)是自動(dòng)變量。(2)寄存器變量:局部變量。存儲(chǔ)位置:在CPU的通用寄存器中;生存期: 作用域:特點(diǎn):訪問(wèn)效率高,數(shù)量較少;用關(guān)鍵字register作為存儲(chǔ)類(lèi)別的聲明。例如:void main() register int i; 第64頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四1)寄存器變量不宜定義過(guò)多。計(jì)算機(jī)中寄存器數(shù)量是有限的,不能允許所有的變量都為寄存器變量。如果寄存器變量過(guò)多或通用寄存器被其他數(shù)據(jù)使用,那么系統(tǒng)將自動(dòng)把寄存器變量轉(zhuǎn)換成自動(dòng)變量。2)寄存器變量的數(shù)據(jù)長(zhǎng)度與通用寄存器的長(zhǎng)度相當(dāng)。一般是char型和int型變量。 寄存器
42、變量 的使用應(yīng)注意以下問(wèn)題:第65頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四2長(zhǎng)生存期變量靜態(tài)存儲(chǔ)方式全局變量(含外部變量、靜態(tài)全局變量)和 靜態(tài)局部變量。(1)外部變量:未用static關(guān)鍵字定義的全局變量。如果不對(duì)外部變量另加聲明,則它的作用域是從定義點(diǎn)到所在文件的末尾。第66頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四用extern關(guān)鍵詞加以聲明后將外部變量作用域擴(kuò)展到聲明位置,聲明語(yǔ)句格式為extern 類(lèi)型符 外部變量名; /int 類(lèi)型符可省 改具體方式: 提前引用聲明。擴(kuò)展 外部變量 作用域 的方式【例3.14】 對(duì)定義在同一文件中外部變量,作提前引用聲
43、明 可以擴(kuò)展其使用范圍到文件前面的 聲明 位置。#include void main() x=4; coutxendl;int x; /外部變量x的定義 extern int x; /提前引用聲明第67頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四 跨文件引用聲明。 擴(kuò)展 外部變量 作用域 的方式【例3.15 】對(duì)定義在另一文件中的外部變量,作跨文件引用聲明以擴(kuò)展其作用域到 本文件。文件 file1.cpp 的內(nèi)容:#include void main() coutwendl; /使用file2.cpp文件中定義的變量w 文件 file2.cpp 的內(nèi)容:int w=10; / 外部
44、變量 w 的定義程序運(yùn)行結(jié)果如下:10 extern int w; / 跨文件引用聲明用途:用于多個(gè)文件中的函數(shù)共享數(shù)據(jù)! 兩個(gè)文件中不能出現(xiàn) 同名的外部變量! 第68頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(2)靜態(tài)變量:靜態(tài)全局變量、靜態(tài)局部變量 靜態(tài)全局變量:在定義全局變量時(shí)開(kāi)頭再添加一個(gè)static關(guān)鍵字所定義的全局變量。作用域:定義點(diǎn)至定義所在文件的末尾;可以通過(guò)提前引用聲明擴(kuò)展其作用域;不能通過(guò)跨文件引用聲明擴(kuò)展其作用域(只對(duì)本文件有效)。一個(gè)文件中定義的靜態(tài)全局變量與別的文件中定義的同名靜態(tài)全局變量或同名外部變量沒(méi)有牽連,互不影響!默認(rèn)初值:0。第69頁(yè),共97頁(yè)
45、,2022年,5月20日,11點(diǎn)1分,星期四【例3.17】 靜態(tài)全局變量 的演示。文件file1.cpp的內(nèi)容:#include static int u=10; /定義靜態(tài)全局變量 void fun() cout”This is file1” 文件file2.cpp的內(nèi)容:#include extern int u; / 試圖對(duì)u 作跨文件引用聲明,此時(shí)行不通void main() coutuendl; /出現(xiàn)“變量u未定義”錯(cuò)誤第70頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(2)靜態(tài)變量:靜態(tài)全局變量、靜態(tài)局部變量 靜態(tài)局部變量:在定義局部變量時(shí)開(kāi)頭再添加一個(gè)static關(guān)
46、鍵字所定義的局部變量。生命周期:作用域:默認(rèn)初值:0。第71頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.16】使用靜態(tài)局部變量的例子。#include void fun();void main() int i; for(i=0;i3;i+) fun( ); void fun() int a=0; /定義局部變量 static int b=0; /定義靜態(tài)局部變量 a=a+1; b=b+1; couta,bendl;程序運(yùn)行結(jié)果如下:1,11,21,3 第72頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四變量屬性 總結(jié)根據(jù)需要設(shè)置變量的屬性!第73頁(yè),共97頁(yè),20
47、22年,5月20日,11點(diǎn)1分,星期四3.6.3 內(nèi)部函數(shù) 和 外部函數(shù)( 選講 )存儲(chǔ)屬性(作用域) 分別 類(lèi)似 靜態(tài)全局變量、外部變量1 內(nèi)部函數(shù) (存儲(chǔ)屬性 類(lèi)似靜態(tài)全局變量)如果一個(gè)函數(shù)只能被 本文件 中 其他函數(shù)所調(diào)用,它稱(chēng)為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類(lèi)型的前面加static。函數(shù)首部的一般格式為static 類(lèi)型標(biāo)識(shí)符 函數(shù)名(形參表)如static int fun(int a,int b)內(nèi)部函數(shù)又稱(chēng) 靜態(tài)(static)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件。不同文件中的同名內(nèi)部函數(shù)互不干擾。第74頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四
48、【例3.18】 靜態(tài)函數(shù)的例子。文件 file1.cpp 中的內(nèi)容:#include static void fun( ); void main( ) fun( ); static void fun( ) /文件file1中定義靜態(tài)函數(shù),名稱(chēng)為fun coutthis in file1 endl; 文件 file2.cpp 中的內(nèi)容:#include static void fun() /文件file2中定義靜態(tài)函數(shù),名稱(chēng)也為fun coutthis in file2 endl; 程序運(yùn)行結(jié)果如下: this in file1 第75頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四2
49、外部函數(shù)(存儲(chǔ)屬性 類(lèi)似外部變量)外部函數(shù)是可以被 整個(gè)程序 各文件中函數(shù) 調(diào)用的函數(shù)。(1)外部函數(shù)的定義。在函數(shù)類(lèi)型前加存儲(chǔ)類(lèi)型關(guān)鍵字extern,或缺省存儲(chǔ)類(lèi)型關(guān)鍵字,定義格式如下:extern 函數(shù)類(lèi)型 函數(shù)名(參數(shù)列表) 函數(shù)體 extern可缺省,即系統(tǒng)默認(rèn)為extern型。(2)外部函數(shù)的(跨文件引用)聲明。文件A 在需要調(diào)用 文件B 中所定義的外部函數(shù)時(shí),需要在文件A中用關(guān)鍵字extern對(duì)被調(diào)函數(shù)提出聲明,聲明格式如下:extern 函數(shù)類(lèi)型 函數(shù)名(參數(shù)類(lèi)型列表)第76頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四【例3.19】 文件file1.cpp利用別的文件
50、(file2.cpp)中的外部函數(shù)實(shí)現(xiàn)求階乘。文件file1.cpp中的內(nèi)容:#include using namespace std; void main( ) extern double fac(int); / 聲明其他文件中定義的 外部函數(shù)int n;cout please input a integer to n :n;coutn!=fac(n)endl; 文件file2.cpp中的內(nèi)容:#include using namespace std; extern double fac(int m) / 定義fac函數(shù) extern 可以省略 int n; double s; s=1; f
51、or(n=1;nradius; length=2*PI*radius; /*引用無(wú)參宏名求周長(zhǎng)*/ area=PI*radius*radius; /*引用無(wú)參宏名求面積*/ cout length area; length=2* 3.1415926 *radius;例3.20 輸入圓的半徑,求圓的周長(zhǎng)、面積。要求使用無(wú)參宏定義圓周率。第80頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(1)可提高源程序的可維護(hù)性(2)可提高源程序的可移植性 (3)減少源程序中重復(fù)書(shū)寫(xiě)字符串的工作量使用宏定義的優(yōu)點(diǎn)第81頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四說(shuō)明:(1)在定義宏時(shí),“
52、宏名” 和 “字符串” 之間要用空格分開(kāi)。而“字符串”中的內(nèi)容不要有空格。(2)宏名通常用大寫(xiě)字母定義。(3)宏定義是在編譯前對(duì)宏進(jìn)行替換的,但對(duì)程序中用雙引號(hào)括起來(lái)的字符串內(nèi)容,如果其中有與 宏名 相同的部分,是 不進(jìn)行 文本替換的。例如:#include #define PI 3.14159 void main( ) coutPI=PIendl; 程序運(yùn)行結(jié)果如下:PI= 3.14159 第82頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(4)宏定義后,可以在本文件各個(gè)函數(shù)中使用。也可以使用#undef取消宏的定義。(5)宏定義可以嵌套,已被定義的宏可以用來(lái)定義新的宏。例如:#
53、include #define M 3 #define N M+2 /用已定義的宏M來(lái)定義新的宏N#define L 4*N +6 /用已定義的宏N來(lái)定義新的宏Lvoid main( ) coutLendl; 程序運(yùn)行結(jié)果如下:20 與 常變量 的區(qū)別 const double PI 3.14159第83頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四2 . 有參數(shù)宏定義 帶參數(shù)宏定義的一般格式 #define 宏名(形參表) 字符串 宏展開(kāi):不只是簡(jiǎn)單地將宏名用字符串替換,還要進(jìn)行參數(shù)替換。 #define PI 3.1415926#define S(r) PI*r*rmain()f
54、loat a,area; a=3.6; area=S(a); coutaarea;area=PI*a*aarea= 3.1415926*a*a第84頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四(1)定義有參宏時(shí),宏名與左圓括號(hào)之間不能留有空格。否則,編譯系統(tǒng)將空格以后的所有字符均作為替代字符串,而將該宏視為無(wú)參宏。(2)有參宏的展開(kāi),只是將宏名和參數(shù)進(jìn)行字符串替換。為了保證宏的展開(kāi)結(jié)果正確,在定義有參宏時(shí),在所有 形參外 和 整個(gè)字符串 外,均加一對(duì)圓括號(hào)。 area=S(a+5);預(yù)期的替換 的結(jié)果:area= 3.1415926*(a+5)*(a+5)宏展開(kāi) (字符串替換) 的
55、實(shí)際結(jié)果:area= 3.1415926*a+5*a+5d=1/S(a+5);預(yù)期的替換 的結(jié)果:d= 1/(3.1415926*(a+5)*(a+5)宏展開(kāi) (字符串替換) 的實(shí)際結(jié)果:d= 1/3.1415926*(a+5)*(a+5)#define S(r) PI*(r)*(r)#define S(r) (PI*(r)*(r)#define PI 3.1415926#define S(r) PI*r*r 說(shuō)明(3)帶參數(shù)宏定義可以用 C+內(nèi)置函數(shù) 實(shí)現(xiàn),但要注意它們的區(qū)別。第85頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四3.7.2 文件包含1文件包含文件包含是指,一個(gè)源文件 可以將 另一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái)。2文件包含處理命令的格式 include “包含文件名” 或 #include 路徑文件名 include 尖擴(kuò)號(hào):程序只到C+系統(tǒng)文件夾尋找被包含的文件,若找不到則給出錯(cuò)誤信息。雙引號(hào):文件名前可以帶路徑;程序先后到指定路徑位置、C+系統(tǒng)文件夾尋找被包含的文件,如果兩處都不存在該文件,就出錯(cuò)。第86頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四文件包含的作用可用下圖示意:第87頁(yè),共97頁(yè),2022年,5月20日,11點(diǎn)1分,星期四f ile1
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠色低碳分布式光儲(chǔ)充一體化綜合利用項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-申批備案
- 2025-2030全球草酸镥水合物行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)游戲插畫(huà)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球單通道凝血分析儀行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球EPROM 存儲(chǔ)器行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)3,4,5-三甲氧基甲苯行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)代謝物定制合成服務(wù)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球低扭矩滾子軸承行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)汽車(chē)差速器錐齒輪行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球高壓電動(dòng)車(chē)軸行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 湖南省長(zhǎng)沙市長(zhǎng)郡教育集團(tuán)2024-2025學(xué)年七年級(jí)上學(xué)期期末考試英語(yǔ)試題(含答案)
- 2024上海市招聘社區(qū)工作者考試題及參考答案
- 2024-2025學(xué)年人教版三年級(jí)(上)英語(yǔ)寒假作業(yè)(九)
- 《招標(biāo)投標(biāo)法》考試題庫(kù)200題(含答案)
- PSM工藝安全管理
- 7天減肥餐食譜給你最能瘦的一周減肥食譜
- 最新北師大版八年級(jí)數(shù)學(xué)下冊(cè)教學(xué)課件全冊(cè)
- 危險(xiǎn)化學(xué)品儲(chǔ)存柜安全技術(shù)及管理要求培訓(xùn)
- Q∕SY 06342-2018 油氣管道伴行道路設(shè)計(jì)規(guī)范
- 物業(yè)管理企業(yè)用工風(fēng)險(xiǎn)與防范對(duì)策
- 拜耳法氧化鋁生產(chǎn)工藝流程框圖
評(píng)論
0/150
提交評(píng)論