




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、小結(jié): 1、for語句 for(i=1;i1)y=0; else y=1; 3、循環(huán)結(jié)構(gòu)(三種和嵌套), 例:while(x1) y+;x-;,基本結(jié)構(gòu)小結(jié): 例: x=3; y=1; if(x1)y=0; else y=1; while(x1) y+; x-; coutxy; 順序結(jié)構(gòu),第4章 函數(shù)與預(yù)處理,一般, 一個大的程序劃分為若干個程序模塊 (即程序文件), 每一個模塊實(shí)現(xiàn)一部分功能。 不同的程序模塊可以由不同的人來完成。 在程序進(jìn)行編譯時, 以程序模塊為編譯單位, 即分別對每一個編譯單位進(jìn)行編譯。 在分別通過編譯后, 才進(jìn)行連接, 把各模塊的目標(biāo)文件以及系統(tǒng)文件連接在一起 形成可執(zhí)
2、行文件。,4.1 概述,一個C程序是由若干個函數(shù)組成的, C語言被認(rèn)為是面向函數(shù)的語言。 C+面向過程的程序設(shè)計(jì)沿用了C語言使用函數(shù)的方法。 C+面向?qū)ο蟮某绦蛟O(shè)計(jì)中, 主函數(shù)以外的函數(shù)大多是被封裝在類中的。 主函數(shù)或其他函數(shù)可以通過類對象調(diào)用類中的函數(shù)。 程序編寫者要根據(jù)需要編寫一個個函數(shù), 每個函數(shù)用來實(shí)現(xiàn)某一功能。,函數(shù)= function。一個函數(shù)就是一個功能。 在實(shí)際應(yīng)用的程序中, 主函數(shù)寫得很簡單, 它的作用就是調(diào)用各個函數(shù), 程序各部分的功能全部都是由各函數(shù)實(shí)現(xiàn)的。 主函數(shù)相當(dāng)于總調(diào)度, 調(diào)動各函數(shù)依次實(shí)現(xiàn)各項(xiàng)功能。 程序開發(fā)人員要善于利用庫函數(shù), 以減少重復(fù)編寫程序段的工作量。
3、,1、一個較大的程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成。 主函數(shù):void main( ) 其它函數(shù) : 1)庫函數(shù):直接調(diào)用(標(biāo)準(zhǔn)函數(shù)) 2)用戶自己定義函數(shù)(編寫程序),2、主函數(shù)調(diào)用其它函數(shù), 其它函數(shù)也可以相互調(diào)用。,3、函數(shù)的作用:減少重復(fù)編寫程序段的工作量, 提高程序的可讀性。 (多次使用的程序段, 可單獨(dú)編寫成函數(shù)) 例4.1 用戶編寫的函數(shù): printstar( ); print_message( );,例4.1 在主函數(shù)中調(diào)用其他函數(shù)。 #include using namespace std; void printstar() cout* endl; void print_m
4、essage(void) cout Welcome to C+!endl; ,int main(void) printstar( ); print_message( ); printstar( ); return 0; ,運(yùn)行情況如下: * Welcome to C+! *,4、從函數(shù)的形式上分類: 1)無參函數(shù) 如:void print_message(void) 2)有參函數(shù) 如:int max(int x, int y). 5、從函數(shù)的返回值上分類 1)有值函數(shù) 如: int main(void) . return 0; 2)無值函數(shù) void print_message(void) ,
5、類型標(biāo)識符_函數(shù)名(void) 聲明部分 語句 說明:類型標(biāo)識符指定函數(shù)返回值的類型。,4.2 定義函數(shù)的一般形式 4.2.1 定義無參函數(shù)的一般形式,函數(shù)聲明部分,函數(shù)體,例:,int print_message( ) coutHow do you do!nendl; 函數(shù)類型:有值、無參、返回值為int型。 (返回值不確定)?,4.2.2、定義有參函數(shù)的一般形式 類型標(biāo)識符_函數(shù)名(形參說明表列) 函數(shù)說明部分 聲明部分 語句 函數(shù)體 ,例:,int max(int x, int y) int z; z=xy?x:y; return(z); 函數(shù)名max, 函數(shù)類型: 有參、有值 返回值類
6、型int 返回確定值(return語句),4.3函數(shù)參數(shù)和函數(shù)的值,4.3.1形式參數(shù)和實(shí)際參數(shù) 主調(diào)函數(shù) 函數(shù)之間的關(guān)系 被調(diào)用函數(shù) 主調(diào)函數(shù):調(diào)用其它函數(shù)的函數(shù) 被調(diào)用函數(shù):定義的函數(shù) 庫函數(shù),例4.2 調(diào)用函數(shù)時的數(shù)據(jù)傳遞。 #include using namespace std; int max(int x, int y) int z; z=xy?x:y; return(z); ,int main( ) int a, b, c; coutab; c=max(a, b); coutmax=cendl; return 0; ,運(yùn)行情況如下: please enter two intege
7、r numbers:2 3 max=3,圖4.2,1)實(shí)參傳給形參 2)返回值傳給主調(diào)函數(shù),1、形參 定義函數(shù)時, 函數(shù)名后面的變量稱為形參。 (formal parameter) 2、實(shí)參 在調(diào)用函數(shù)時, 函數(shù)后面括弧中的變量稱為實(shí)參。 (actual parameter),一些說明: 實(shí)參和其對應(yīng)形參各占用獨(dú)立的存儲單元。 (調(diào)用結(jié)束后, 形參內(nèi)存立即釋放) 例: int x, y, z; z=max(x, y); 函數(shù): int max(int x, int y) int z; z=xy?x:y; return(z); ,2)實(shí)參可以是常量、變量、表達(dá)式, 但要有確定值。 int x=1
8、, y=2, z, a=4, b=3; z=max(3+x, 3+y); z=max(a+x, b+y); 3) 在定義函數(shù)時, 必須在函數(shù)首部指定形參的類型。 int max(int x, int y) int z; z=xy?x:y; return(z); ,4)實(shí)參和其對應(yīng)形參類型一致。 例:float x, y, z; z=max(x, y);,5)在調(diào)用函數(shù)時, 將實(shí)參的數(shù)值傳遞給形參變量。 (單向傳遞) 例: int m1(int x, int y) /調(diào)用時分配 x=10;y=15; return(x+y); /此時, 釋放x, y內(nèi)存空間 void main( ) int a=
9、2, b=3, c; c= m1(a, b); coutcendl; /此時, 釋放a, b, c內(nèi)存空間,4.3.2函數(shù)的返回值(定義時明確),函數(shù)可以有返回值, 也可以無返回值 1) 返回值, 用return語句(有括號和無括號都可) 格式:1) return(z); 2) return z; (注意空格) 注意:return后面的值可以是一個表達(dá)式。 return(xy?x:y);,2)函數(shù)返回值的類型 在函數(shù)定義時, 用類型標(biāo)識符說明。 例1:int max(float x, float y) return(xy?x:y); 調(diào)用:int c c=max(1.5, 2.5) 值:2,3
10、) 如果函數(shù)值的類型和return語句中表達(dá)式的值不一致, 則以函數(shù)類型為準(zhǔn), 即函數(shù)類型決定返回值的類型。 對數(shù)值型數(shù)據(jù), 可以自動進(jìn)行類型轉(zhuǎn)換。 例1:int max(float x, float y) return(xy?x:y); 調(diào)用:int c ; c=max(1.5, 2.5); 值:2,例2:float max(float x, float y) return(xy?x:y); 調(diào)用:float d; d=max(1.5, 2.5); 值:2.5,4、為了明確表示不帶回值, 可以用void 定義無類型。 (無值) 例: void printstar( ) 調(diào)用:a=prints
11、tar( );,4.4函數(shù)的調(diào)用(主調(diào)函數(shù)中使用),4.4.1函數(shù)調(diào)用的一般形式 函數(shù)名(實(shí)參表列); 注意:1)實(shí)參與形參的個數(shù)應(yīng)相等, 類型應(yīng)一致, 但變量名可不相同。 2)實(shí)參與形參按順序?qū)?yīng)。 3)無參函數(shù), 則無實(shí)參, 但括號不可省略。,例:int max(int x, int y) return(xy?x:y); void main( ) int x=1, y=2, a=3, b=4, c; c=max(y, x); c=max(y, a); c=max(a, b); ,4.4.2函數(shù)調(diào)用方式(3種),1、函數(shù)語句 例:printsart( ); max(3, 5); 適合有值、無
12、值函數(shù)。 有值時, 此值不被需要。,2、函數(shù)表達(dá)式 例: c=2*max(a, b); 適合有值函數(shù)。帶值回來參與運(yùn)算。 3、函數(shù)的實(shí)參 例:m=max(a, max(x, y); 適合有值函數(shù)。帶值回來做實(shí)參。,1、調(diào)用函數(shù)的條件: 1) 函數(shù)必須是存在。 2) 函數(shù)如果是庫函數(shù), 用#include命令 包含到本文件中。 3) 函數(shù)如果是用戶定義的函數(shù), 則需聲明(在主調(diào)函數(shù)中)。 先聲明, 后使用(使用函數(shù)) 函數(shù)聲明(declare): 在函數(shù)尚在未定義的情況下, 事先將該函數(shù)的有關(guān)信息通知編譯系統(tǒng), 以便使編譯能正常進(jìn)行。,4.4.3 對被調(diào)用函數(shù)的聲明和函數(shù)原型,例4.3 對被調(diào)用
13、的函數(shù)作聲明。 #include using namespace std; int main( ) float add(float x, float y); float a, b, c; coutab; c=add(a, b); coutsum=cendl; return 0; ,float add(float x, float y) float z; z=x+y; return (z); ,運(yùn)行情況如下: please enter a, b:123.68 456.45 sum=580.13,注意: 對函數(shù)的定義和聲明不是同一件事情。 定義是指對函數(shù)功能的確立。 聲明則是把函數(shù)的名字、函數(shù)類型
14、以及形參的個數(shù)、類型和順序(注意, 不包括函數(shù)體)通知編譯系統(tǒng)。 (例如函數(shù)名是否正確, 實(shí)參與形參的類型和個數(shù)是否一致)。,2、聲明格式-函數(shù)原型(function prototype) 函數(shù)原型的一般形式為 (1) 函數(shù)類型 函數(shù)名(參數(shù)類型1, 參數(shù)類型2); (2) 函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1, 參數(shù)類型2 參數(shù)名2); 例: float add(float, float); float add(float a, float b); 參數(shù)名不用x、y, 而用a、b , 效果完全相同。 一般習(xí)慣用: float add(float, float);,3、可不用聲明的情況 1)
15、如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前, 可以不必加以聲明。 因?yàn)榫幾g系統(tǒng)已經(jīng)事先知道了已定義的函數(shù)類型, 會根據(jù)函數(shù)首部提供的信息對函數(shù)的調(diào)用作正確性檢查。 ( 有經(jīng)驗(yàn)的程序編制人員一般都把main函數(shù)寫在最前面, 這樣對整個程序的結(jié)構(gòu)和作用一目了然, 統(tǒng)覽全局, 然后再具體了解各函數(shù)的細(xì)節(jié)。 此外, 用函數(shù)原型來聲明函數(shù), 還能減少編寫程序時可能出現(xiàn)的錯誤。),2)在函數(shù)外部已做了函數(shù)聲明, 在主調(diào)函數(shù)中可以不必加以聲明。 例: char letter(char, char); float f(float, f loat); int i(float, float); int main( )
16、 char letter(char c1, char c2) float f(float x, float y) int i(float j, float k) (如果一個函數(shù)被多個函數(shù)所調(diào)用, 用這種方法比較好, 不必在每個主調(diào)函數(shù)中重復(fù)聲明。),調(diào)用函數(shù)時需要一定的時間和空間的開銷。圖4.5表示函數(shù)調(diào)用的過程: 圖4.5,*4.5 內(nèi)置函數(shù),內(nèi)置函數(shù)(inline function) 在編譯時將所調(diào)用函數(shù)的代碼直接嵌入到主調(diào)函數(shù)中, 而不是將流程轉(zhuǎn)出去。 這種嵌入到主調(diào)函數(shù)中的函數(shù)稱為內(nèi)置函數(shù)(inline function), 又稱內(nèi)嵌函數(shù)。內(nèi)聯(lián)函數(shù)。 指定內(nèi)置函數(shù)的方法很簡單, 只需在
17、函數(shù)首行的左端加一個關(guān)鍵字inline即可。,例4.4 函數(shù)指定為內(nèi)置函數(shù)。 #include using namespace std; inline int max(int, int, int); int main( ) int i=10, j=20, k=30, m; m=max(i, j, k); coutmax=mendl; return 0; ,編譯系統(tǒng)在遇到函數(shù)調(diào)用max(i, j, k)時, 就用max函數(shù)體的代碼代替max(i, j, k), 同時將實(shí)參代替形參。,程序第6行 m=max(i, j, k);就被置換成: if (ji) i=j; if(ki) i=k; m=i;
18、,inline int max(int a, int b, int c) if(ba) a=b; if(ca) a=c; return a; 注意: 可以在聲明函數(shù)和定義函數(shù)時同時寫inline, 也可以只在其中一處聲明inline。 使用內(nèi)置函數(shù)可以節(jié)省運(yùn)行時間, 但卻增加了目標(biāo)程序的長度。,規(guī)模很小(一般為5個語句以下) 、頻繁的函數(shù)(如定時采集數(shù)據(jù)的函數(shù))聲明為內(nèi)置函數(shù)。 內(nèi)置函數(shù)中不能包括復(fù)雜的控制語句, 如循環(huán)語句和switch語句。 對函數(shù)作inline聲明, 對編譯系統(tǒng)是建議性的, 而不是指令性的。,1、定義 同一函數(shù)名定義多個函數(shù), 這些函數(shù)的參數(shù)個數(shù)和參數(shù)類型不同。 調(diào)用時:
19、函數(shù)的重載(function overloading)。,*4.6 函數(shù)的重載,2、目的-在編程時, 有時我們要實(shí)現(xiàn)的是同一類的功能, 只是有些細(xì)節(jié)不同。 例: 1)希望從3個數(shù)中找出其中的最大者, 而每次求最大數(shù)時數(shù)據(jù)的類型不同, 可能是3個整數(shù)、3個雙精度數(shù)或3個長整數(shù)。 2)程序設(shè)計(jì)者不必分別設(shè)計(jì)出3個不同名的函數(shù)。 則使用函數(shù)重載, 對一個函數(shù)名重新賦予它新的含義, 使一個函數(shù)名可以多用。 函數(shù)重載, 其函數(shù)原型為: int max(int , int, int); double max(double a, double b, double c); long max(long a, l
20、ong b, long c);,例4.5 求3個數(shù)中最大的數(shù)。 (分別考慮整數(shù)、雙精度數(shù)、長整數(shù)的情況) #include using namespace std; int main( ) int max(int, int, int); double max(double, double, double); long max(long, long, long);,int i1, i2, i3, i; cini1i2i3; i=max(i1, i2, i3); coutd1d2d3; d=max(d1, d2, d3); coutg1g2g3; g=max(g1, g2, g3); coutg_
21、max=gendl; ,運(yùn)行情況如下: 1 2 3 i_max=3 1. 2. 3. d_max=3.00000 1 2 3 g_max=3,int max(int a, int b, int c) if(ba) a=b; if(ca) a=c; return a; double max(double a, double b, double c) if(ba) a=b; if(ca) a=c; return a; long max(long a, long b, long c) if(ba) a=b; if(ca) a=c; return a; ,例4.6 編寫一個程序, 用來求兩個整數(shù)或3個
22、整數(shù)中的最大數(shù)。如果輸入兩個整數(shù), 程序就輸出這兩個整數(shù)中的最大數(shù), 如果輸入3個整數(shù), 程序就輸出這3個整數(shù)中的最大數(shù)。 #include using namespace std; int main( ) int max(int , int b, int c); int max(int a, int b); int a=8, b=-12, c=27; coutmax(a, b, c)=max(a, b, c)endl; coutmax(a, b)=max(a, b)endl; ,運(yùn)行情況如下: max(a, b, c)=27 max(a, b)=8,int max(int a, int b,
23、 int c) if(ba) a=b; if(ca) a=c; return a; int max(int a, int b) if(ab) return a; else return b; ,說明: 1)參數(shù)的個數(shù)和類型可以都不同。 但不能只有函數(shù)的類型不同而參數(shù)的個數(shù)和類型相同。 例: int f(int); long f(int); void f(int); 在函數(shù)調(diào)用時都是同一形式, 如f(10)。 編譯系統(tǒng)無法判別應(yīng)該調(diào)用哪一個函數(shù)。無法重載。 2)在使用重載函數(shù)時, 同名函數(shù)的功能應(yīng)當(dāng)相同或相近, 不要用同一函數(shù)名去實(shí)現(xiàn)完全不相干的功能, 雖然程序也能運(yùn)行, 但可讀性不好, 使人莫
24、名其妙。,1、C+提供了函數(shù)模板(function template)。 2、函數(shù)模板 實(shí)際上是建立一個通用函數(shù), 其函數(shù)類型和形參類型不具體指定, 用一個虛擬的類型來代表。 這個通用函數(shù)就稱為函數(shù)模板。 凡是函數(shù)體相同的函數(shù)都可以用這個模板來代替, 不必定義多個函數(shù), 只需在模板中定義一次即可。 在調(diào)用函數(shù)時系統(tǒng)會根據(jù)實(shí)參的類型來取代模板中的虛擬類型, 從而實(shí)現(xiàn)了不同函數(shù)的功能。,*4.7 函數(shù)模板,例4.7 將例4.5程序改為通過函數(shù)模板來實(shí)現(xiàn) #include using namespace std; template T max(T a, T b, T c) if(ba) a=b; i
25、f(ca) a=c; return a; ,int main( ) int i1=185, i2=-76, i3=567, i; double d1=56.87, d2=90.23, d3=-3214.78, d; long g1=67854, g2=-912456, g3=673456, g; i=max(i1, i2, i3); d=max(d1, d2, d3); g=max(g1, g2, g3); couti_max=iendl; coutf_max=fendl; coutg_max=gendl; return 0; ,運(yùn)行情況如下: i_max=567 d_max=90.2300
26、g_max=673456,3、定義函數(shù)模板的一般形式 template 或 template (通用函數(shù)定義 ) 例1: template T max(T a, T b, T c) if(ba) a=b; if(ca) a=c; return a; 例2:類型參數(shù)可以不只一個, 可以根據(jù)需要確定個數(shù)。 template ,1、C+提供簡單的處理辦法, 給形參一個默認(rèn)值, 這樣形參就不必一定要從實(shí)參取值了。 例:有一函數(shù)聲明 float area(float r=6.5); 指定r的默認(rèn)值為6.5。 1)如果在調(diào)用此函數(shù)時, 確認(rèn)r的值為6.5, 則可以不必給出實(shí)參的值。 area( ); /相
27、當(dāng)于area(6.5); 2)如果不想使形參取此默認(rèn)值, 則通過實(shí)參另行給出。 area(7.5); /形參得到的值為7.5, 而不是6.5,*4.8 有默認(rèn)參數(shù)的函數(shù),2、這種方法比較靈活, 可以簡化編程, 提高運(yùn)行效率。 例如: 有一個求圓柱體體積的函數(shù), 形參h代表圓柱體的高, r為圓柱體半徑。 函數(shù)原型如下: float volume(float h, float r=12.5); /只對形參r指定默認(rèn)值12.5 函數(shù)調(diào)用可以采用以下形式: volume(45.6); /相當(dāng)于volume(45.6, 12.5) volume(34.2, 10.4) /h的值為34.2, r的值為10
28、.4,3、實(shí)參與形參的結(jié)合是從左至右順序進(jìn)行的。 因此指定默認(rèn)值的參數(shù)必須放在形參表列中的最右端, 否則出錯。 例: void f1(float a, int b=0, int c, char d=a); /不正確 void f2(float a, int c, int b=0, char d=a); /正確 調(diào)用f2函數(shù), 可以采取下面的形式: f2(3.5, 5, 3, x) f2(3.5, 5, 3) f2(3.5, 5),例4.8 求2個或3個正整數(shù)中的最大數(shù), 用帶有默認(rèn)參數(shù)的函數(shù)實(shí)現(xiàn)。 #include using namespace std; int main( ) int ma
29、x(int a, int b, int c=0); int a, b, c; cinabc; coutmax(a, b, c)=max(a, b, c)endl; coutmax(a, b)=max(a, b)endl; return 0; ,運(yùn)行情況如下: 14 -56 135 max(a, b, c)=135 max(a, b)=14,int max(int a, int b, int c) if(ba) a=b; if(ca) a=c; return a; ,注意: 如果函數(shù)的定義在函數(shù)調(diào)用之前, 則應(yīng)在函數(shù)定義中給出默認(rèn)值。 如果函數(shù)的定義在函數(shù)調(diào)用之后, 則在函數(shù)調(diào)用之前需要有函數(shù)聲
30、明, 此時必須在函數(shù)聲明中給出默認(rèn)值, 在函數(shù)定義時可以不給出默認(rèn)值(如例4.8)。 (3) 一個函數(shù)不能既作為重載函數(shù), 又作為有默認(rèn)參數(shù)的函數(shù)。 出現(xiàn)二義性, 系統(tǒng)無法執(zhí)行。,4.9 函數(shù)的嵌套調(diào)用,1、什么是嵌套調(diào)用? 在調(diào)用一個函數(shù)的過程中, 又調(diào)用另一個函數(shù)。 (或:在一個函數(shù)的定義中, 調(diào)用了另一個函數(shù)) 2、可嵌套調(diào)用函數(shù), 不可嵌套定義函數(shù)。 實(shí)參 形參,例4.9 用弦截法求方程f(x)=x3-5x2+16x-80=0的根。 這是一個數(shù)值求解問題, 需要先分析用弦截法求根的算法。根據(jù)數(shù)學(xué)知識, 可以列出以下的解題步驟: 取兩個不同點(diǎn)x1, x2, 如果f(x1)和f(x2)符號
31、相反, 則(x1, x2)區(qū)間內(nèi)必有一個根。 如果f(x1)與f(x2)同符號, 則應(yīng)改變x1, x2, 直到f(x1), f(x2)異號為止。 注意x1、x2的值不應(yīng)差太大, 以保證(x1, x2)區(qū)間內(nèi)只有一個根。,圖4.7,(2) 連接(x1, f(x1)和(x2, f(x2)兩點(diǎn), 此線(即弦)交x軸于x, 見圖4.7。 x點(diǎn)坐標(biāo)可用下式求出: x=x1f(x2)-x2f(x1) f(x2)-f(x1) 再從x求出f(x)。 (3) 若f(x)與f(x1)同符號, 則根必在(x, x2)區(qū)間內(nèi), 此時將x作為新的x1。如果f(x)與f(x2)同符號, 則表示根在( x1, x)區(qū)間內(nèi),
32、 將x作為新的x2。 (4) 重復(fù)步驟 (2) 和 (3), 直到 f(x)為止, 為一個很小的正數(shù), 例如10-6。此時認(rèn)為 f(x)0。,這就是弦截法的算法, 在程序中分別用以下幾個函數(shù)來 實(shí)現(xiàn)以上有關(guān)部分功能: 用函數(shù)f(x)代表x的函數(shù):x3-5x2+16x-80。 (2) 用函數(shù)xpoint (x1, x2)來求(x1, f(x1)和(x2, f(x2)的連線與x軸的交點(diǎn)x的坐標(biāo)。 (3) 用函數(shù)root(x1, x2)來求(x1, x2)區(qū)間的那個實(shí)根。 顯然, 執(zhí)行root函數(shù)的過程中要用到xpoint函數(shù), 而執(zhí)行xpoint函數(shù)的過程中要用到f函數(shù)。,根據(jù)以上算法, 可以編寫
33、出下面的程序: #include #include #include using namespace std; double f(double); double xpoint(double, double); double root(double, double);,int main( ) double x1, x2, f1, f2, x; do coutx1x2; f1=f(x1); f2=f(x2); while(f1*f2=0); x=root(x1, x2); coutsetiosflags(iosfixed)setprecision(7); coutA root of equatio
34、n is xendl; return 0; ,運(yùn)行情況如下: input x1, x2:2.5 6.7 A root of equation is 5.0000000,double f(double x) double y; y=x*x*x-5*x*x+16*x-80; return y; double xpoint(double x1, double x2) double y; y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return y; ,double root(double x1, double x2) double x, y, y1; y1=f(x1); d
35、o x=xpoint(x1, x2); y=f(x); if (y*y10) y1=y; x1=x; else x2=x; while(fabs(y)=0.00001); return x; ,注意數(shù)值傳遞性,小結(jié):1、函數(shù)定義時, 定義:1)函數(shù)名 2)形參 3)返回值 構(gòu)成: 有參、無參函數(shù) 有值、無值函數(shù) 返回值: 用return語句(有括號和無括號都可) 格式:1) return(z); 2) return z; (注意空格) 2、調(diào)用函數(shù)時:實(shí)參值 形參 函數(shù)值 主調(diào)函數(shù),小結(jié): 3、函數(shù) 1)函數(shù)的定義: 函數(shù)名, 函數(shù)的形參, 函數(shù)的返回值類型, 函數(shù)體 2)函數(shù)的使用 調(diào)用格式
36、:函數(shù)名(實(shí)參表列),調(diào)用方式:語句調(diào)用, 表達(dá)式調(diào)用, 實(shí)參調(diào)用,小結(jié): 4、函數(shù) 1)函數(shù)的定義: 2)函數(shù)的聲明: 函數(shù)原型;(可不聲明的情況) 3)函數(shù)的使用: 調(diào)用 5、內(nèi)置函數(shù)(inline) (形參用實(shí)參代替, 代碼直接嵌入) 6、函數(shù)的重載 多個函數(shù)名相同, 但形參不同, 為函數(shù)重載。 調(diào)用時按實(shí)參去選擇重載何個函數(shù)。 7、函數(shù)模板 template T max(T a, T b, T c) 調(diào)用:int x=1, y=2, z=3, c; c=max(x, y, z); 1,小結(jié): 8、有默認(rèn)參數(shù)的函數(shù) 函數(shù)聲明: float area(float r=6.5); 調(diào)用: a
37、rea( ); 或 area(7.5); 注意: void f2(float a, int c, int b=0, char d=a); /正確,小結(jié): 9、嵌套調(diào)用 定義函數(shù)時調(diào)用其他函數(shù)。 函數(shù)定義: float f(float x) return(x*x-2); float y(float x1, float x2) return(f(x1)-f(x2); ,1、遞歸調(diào)用 在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身, 稱為函數(shù)的遞歸(recursive)調(diào)用。 C+允許函數(shù)的遞歸調(diào)用。 例: int f(int x) int y, z; z=f(y); return (2*)
38、; 以上是直接調(diào)用本函數(shù), 見圖4.9。,4.10 函數(shù)的遞歸調(diào)用,圖4.9 圖4.10 圖4.10表示的是間接調(diào)用本函數(shù)。 在調(diào)用f1函數(shù)過程中要調(diào)用f2函數(shù), 而在調(diào)用f2函數(shù)過程中又要調(diào)用f1函數(shù)。,2、遞歸調(diào)用注意 防止無終止的自身調(diào)用。 int f(int x) int y, z; z=f(y); return (2*); 可以用if語句來控制, 只有在某一條件成立時才繼續(xù)執(zhí)行遞歸調(diào)用, 否則就不再繼續(xù)。 3、包含遞歸調(diào)用的函數(shù)稱為遞歸函數(shù)。,例4.10 有5個人坐在一起, 問第5個人多少歲?他說比第4個人大兩歲。問第4個人歲數(shù), 他說比第3個人大兩歲。問第3個人, 又說比第2個人大
39、兩歲。問第2個人, 說比第1個人大兩歲。最后問第1個人, 他說是10歲。請問第5個人多大? 每一個人的年齡都比其前1個人的年齡大兩歲。即 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10 可以用式子表述如下: age(n)=10 (n=1) age(n)=age(n-1)+2 (n1),可以看到, 當(dāng)n1時, 求第n個人的年齡的公式是相同的。因此可以用一個函數(shù)表示上述關(guān)系。圖4.11表示求第5個人年齡的過程。 圖4.11,用age函數(shù)實(shí)現(xiàn)上述遞歸過程。 #include using namespa
40、ce std; int age(int); int main( ) coutage(5)endl; return 0; int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return c; ,運(yùn)行結(jié)果如下: 18,函數(shù)調(diào)用過程如圖4.12所示。 圖4.12,例4.11 用遞歸方法求!。 求n!可以用遞推方法, 即從1開始, 乘2, 再乘3一直乘到n。 求n!也可以用遞歸方法, 即5!=4!5, 而4!3!4, , 1!=。 可用下面的遞歸公式表示: n!=1(n=0, 1) n(n-1)!(n1),#include using nam
41、espace std; long fac(int); int main( ) int n; long y; coutn; y=fac(n); coutn!=yendl; return 0; ,long fac(int n) long f; if(n0) coutn0, data error!endl; f=-1; else if (n=0|n=1) f=1; else f=fac(n-1)*n; return f; ,運(yùn)行情況如下: please input an integer:10 10!=3628800,1、局部變量(local variable)定義 在一個函數(shù)內(nèi)部定義的變量是局部變量
42、。 在復(fù)合語句中定義的變量也是局部變量。 2、局部變量有效范圍 函數(shù)內(nèi)部定義的變量只在本函數(shù)范圍內(nèi)有效。 在復(fù)合語句中定義的變量只在本復(fù)合語句范圍內(nèi)有效。,4.11 局部變量和全局變量 4.11.1 局部變量(內(nèi)部變量),float f1(int a) /函數(shù)f1 int b, c; b、c有效a有效 char f2(int x, int y) /函數(shù)f2 int i, j; i、j有效x、y有效 int main( ) /主函數(shù) int m, n; int p, q; p、q在復(fù)合語句中有效 m、n有效 ,說明: (1) 主函數(shù)main中定義的變量只在主函數(shù)中有效。 (2) 不同函數(shù)中可以使
43、用同名的變量, 它們代表不同的對象, 互不干擾。 (3) 可以在一個函數(shù)內(nèi)的復(fù)合語句中定義變量, 這些變量只在本復(fù)合語句中有效。 (這種復(fù)合語句也稱為分程序或程序塊。) (4) 形式參數(shù)也是局部變量。,(5) 在函數(shù)聲明中出現(xiàn)的參數(shù)名, 其作用范圍只在本行的括號內(nèi)。 實(shí)際上, 編譯系統(tǒng)對函數(shù)聲明中的變量名是忽略的, 即使在調(diào)用函數(shù)時也沒有為它們分配存儲單元。 例: int max(int a, int b); /函數(shù)聲明中出現(xiàn)a、b int max(int x, int y) /函數(shù)定義, 形參是x、y coutxyendl; /合法, x、y在函數(shù)體中有效 coutabendl; /非法,
44、a、b在函數(shù)體中無效 編譯時認(rèn)為max函數(shù)體中的a和b未經(jīng)定義。,1、全局變量定義 (global variable, 也稱全程變量) 在函數(shù)之外定義的變量是外部變量, 稱為全局變量。 2、全局變量的有效范圍 從定義變量的位置開始到本源文件結(jié)束。 例:,4.11.2 全局變量(外部變量),int p=1, q=5;/全局變量 全局變量p、q的作用范圍 float f1(int a)/定義函數(shù)f1 int b, c; char c1, c2; /全局變量 char f2 (int x, int y) /定義函數(shù)f2 int i, j; 全局變量c1、c2的作用范圍 int main ( )/主函
45、數(shù) int m, n; ,3、全局變量的作用 增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道 4、建議不在必要時不要使用全局變量。 原因: 全局變量在程序的全部執(zhí)行過程中都占用存儲單元, 而不是僅在需要時才開辟單元。 它使函數(shù)的通用性降低。 降低程序的清晰性,5、如果在同一個源文件中, 全局變量與局部變量同名, 則在局部變量的作用范圍內(nèi), 全局變量被屏蔽, 即它不起作用。 例:int a=3, b=5; int max(int a, int b) int c; c=ab?a:b; return( c ) ; void main( ) int a=8; coutmax(a, b)=(max(a, b)endl; ,變
46、量的有效范圍稱為變量的作用域(scope)。 變量有4種不同的作用域: 文件作用域(file scope) 函數(shù)作用域(function scope) 塊作用域(block scope) 函數(shù)原型作用域(function prototype scope)。 文件作用域是全局的, 其他三者是局部的。 除了變量之外, 任何以標(biāo)識符代表的實(shí)體都有作用域, 概念與變量的作用域相似。,4.12變量的存儲類別,4.12.1 動態(tài)存儲方式與靜態(tài)存儲方式 從變量的作用域分為: 1)局部變量 2)全局變量 從變量值的生存期(存在的時間)來分: 1)靜態(tài)存儲變量 2)動態(tài)存儲變量,1、C+的用戶存儲空間,1)程序
47、區(qū):,函數(shù)調(diào)用時, 分配動態(tài)內(nèi)存空間, 函數(shù)結(jié)束時, 釋放內(nèi)存空間。 此次調(diào)用和下次調(diào)用分配的 內(nèi)存空間可能不同。,固定的存儲單元, 程序全部執(zhí)行完, 釋放內(nèi)存空間。,3)動態(tài)存儲區(qū):,2)靜態(tài)存儲區(qū):,2、變量放入何種存儲區(qū)?,靜態(tài)存儲區(qū):,1)局部變量(無特別說明的) 2)形參(局部變量) 3)函數(shù)調(diào)用時的現(xiàn)場保護(hù)和返回地址等,1) 全局變量存放在此 2) 靜態(tài)變量也存放在此,動態(tài)存儲區(qū):,3、變量和函數(shù)的兩個屬性,1)數(shù)據(jù)類型 float int char 2) 存儲類別 靜態(tài)存儲類: 靜態(tài)局部變量(static) 靜態(tài)全局變量(static) 全局變量(非靜態(tài)) 動態(tài)存儲類: 自動變量
48、(auto) (非靜態(tài)局部變量) 寄存器變量(register) 形參(auto, register),4.12.2 auto 變量(自動變量),auto變量: 函數(shù)中不做專門說明的局部變量。 1)定義方式: auto int b, c=3; auto float a; 注:auto 可省略。 如: int b, c=3; float a;,2) 存儲方式(值存放的位置): 動態(tài)存儲類 3)作用域: 離開函數(shù), 值就消失 4)值的生存期: 本函數(shù)有效,4.12.3 靜態(tài)局部變量(static),靜態(tài)局部變量: 函數(shù)中用static聲明的局部變量。 1)定義方式: static int b, c
49、=3; static float a; 2) 存儲方式: 靜態(tài)存儲類: 編譯時, 賦初值(分配內(nèi)存), 如無初值, 系統(tǒng)自動賦 0 或0。 (自動變量系統(tǒng)不賦初值),viod main( ) int a=2, i; for(i=0;i3;i+) cout(f(a) ; ,例1: int f(int a) int b=0; static int c=3; b=b+1; c=c+1; return(a+b+c); ,3)作用域: 離開函數(shù), 值仍保留, 但其他函數(shù)不能引用。 4)值的生存期: 本函數(shù)有效,例4.12 靜態(tài)局部變量的值。 #include using namespace std; i
50、nt f(int a) int b=0; static int c=3; b=b+1; c=c+1; return a+b+c; int main( ) int a=2, i; for(i=0;i3;i+) coutf(a) ; coutendl; return 0; ,運(yùn)行結(jié)果為 7 8 9,例4.13 輸出的階乘值(即1!, 2!, 3!, 4!, 5!)。 #include using namespace std; int fac(int); int main( ) int i; for(i=1;i=5;i+) couti!=fac(i)endl; return 0; int fac(i
51、nt n) static int f=1; f=f*n; return f; ,運(yùn)行結(jié)果為 1!=1 2!=2 3!=6 4!=24 5!=120,4.12.4 register變量,1、變量的存取形式 控制器將內(nèi)存上的值傳遞給運(yùn)算器, 計(jì)算結(jié)果由運(yùn)算器傳遞給內(nèi)存。 2、什么是寄存器變量? 當(dāng)有一些變量頻繁使用(如多次循環(huán)), 為了避免多次從內(nèi)存存取變量值, 提高效率, 而將局部變量的值存放在運(yùn)算器中的寄存器中, 這種變量稱為寄存器變量。,3、定義方式 register int i, f; register float a=3.3; 例1: register static int c; 錯誤,4、存儲方式 動態(tài)存儲類 5、作用域 離開函數(shù), 值就消失 6、生存期 本函數(shù)有效 說明: 計(jì)算機(jī)系統(tǒng)寄存器數(shù)目有限, 不能定義任意多個寄存器變量。,例4.13 輸出的階乘值(即1!, 2!, 3!, 4!, 5!)。 #include using namespace std; int fac(int); int main( ) int i; cout5!=fac(5)endl; return 0; int fac(int n) register int i, f=1; for(i=1;i=n;i+) f=f*i; return f; ,運(yùn)行結(jié)果為
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 惠州布袋風(fēng)管施工方案
- 武漢學(xué)校智能地暖施工方案
- 隧洞豎井管棚施工方案
- 云浮無塵車間凈化施工方案
- 衛(wèi)生間防水上墻施工方案
- 2012年7月國家開放大學(xué)漢語言文學(xué)本科《中國現(xiàn)代文學(xué)專題》期末紙質(zhì)考試試題及答案
- 提升農(nóng)業(yè)生產(chǎn)技術(shù)的創(chuàng)新與應(yīng)用實(shí)施方案
- 綠色就業(yè)與勞動市場轉(zhuǎn)型策略
- 加強(qiáng)污染防治和生態(tài)建設(shè)未來展望與持續(xù)改進(jìn)措施
- 加強(qiáng)跨部門協(xié)作與整合資源的策略及實(shí)施路徑
- 2017華東六省一市優(yōu)質(zhì)課課件連乘問題11月29日
- 部編版(統(tǒng)編)一年級語文下冊每課練習(xí)題(全冊全套)
- DB62∕T 4134-2020 高速公路服務(wù)區(qū)設(shè)計(jì)規(guī)范
- 中電朝陽250兆瓦智慧風(fēng)儲一體化風(fēng)電項(xiàng)目環(huán)評報告書
- 做一個幸福教師
- 海上風(fēng)電場+風(fēng)機(jī)基礎(chǔ)介紹
- 國家自然科學(xué)基金申請標(biāo)書模板
- GB T 20219-2015 絕熱用噴涂硬質(zhì)聚氨酯泡沫塑料(高清版)
- 車間斷針記錄表
- 人人有事做事事有人做
- MT_T 693-2019-礦用無線電波透視儀通用技術(shù)條件_(高清版)
評論
0/150
提交評論