第3章 函數(shù)和程序結(jié)構(gòu)
《第3章 函數(shù)和程序結(jié)構(gòu)》由會員分享,可在線閱讀,更多相關(guān)《第3章 函數(shù)和程序結(jié)構(gòu)(46頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、Chapter 3 函數(shù)和程序結(jié)構(gòu)3.1 函數(shù)的組織3.2 局部變量和全局變量、命名空間std3.3 形參與實(shí)參3.4 引用和const3.5 缺省參數(shù)值3.6 函數(shù)重載3.7 內(nèi)聯(lián)函數(shù)3.8 編譯預(yù)處理3.1 函數(shù)的組織函數(shù)的組織結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)方法使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜的問題:分解大問題小問題更小問題求解(調(diào)用)main()函數(shù)函數(shù)一個函數(shù)是根據(jù)進(jìn)去的信息(輸入)和產(chǎn)生的東西(輸出結(jié)果)所定義的一個黑盒。函數(shù)用于把較大的計(jì)算任務(wù)分解成若干個較小的任務(wù),使程序人員可以在其他函數(shù)的基礎(chǔ)上構(gòu)造程序,而不需要從頭做起。一個設(shè)計(jì)得當(dāng)?shù)暮瘮?shù)可以把具體操作細(xì)節(jié)對程序中不需要知道它
2、們的那些部分隱藏掉,從而使整個程序結(jié)構(gòu)清楚,減輕了因修改程序所帶來的麻煩。程序示例程序示例計(jì)算計(jì)算(12+10)!/(12!+10!)for example:ch3/3-1-1.cpp for example:ch3/3-1-2.cpp2層結(jié)構(gòu),2個函數(shù),降低程序的構(gòu)思、編寫、調(diào)試的復(fù)雜度,可讀性好函數(shù)定義返回類型 函數(shù)名(參數(shù)聲明列表)函數(shù)體;double max(double d1,double d2)return(d1d2?d1:d2);return語句用于從被調(diào)用函數(shù)向調(diào)用者返回值。沒有返回值的函數(shù)、沒有參數(shù)的函數(shù),用關(guān)鍵字void修飾。void f(void)cout “aaaa”d
3、2?d1:d2);Void main()double f1,f2;cin f1 f2;cout max(f1,f2);cout max(67.4,23);形參實(shí)參實(shí)際參數(shù)可以是一個常量,變量,或甚至可以是一個表達(dá)式。3.2 局部變量和全局變量局部變量和全局變量變量作用范圍(作用域)在函數(shù)內(nèi)定義的變量(包括形參)局部變量 作用范圍:本函數(shù)內(nèi)部 定義在復(fù)合語句內(nèi)的變量 作用范圍:復(fù)合語句內(nèi)部全局變量 在函數(shù)以外定義的變量,不從屬于任一函數(shù) 作用范圍:從定義處到源文件結(jié)束3-4.cpp變量作用范圍示例int x=1;void main()int a=2;.int b=3;.f();.int t=4;
4、void f()int x=5,b=6;.int a=7;x=?a=?b=?b=?x=?b=?t=?a=?x=1 a=2 b=3b沒定義 x=5 b=6 t=4 a沒定義 若局部變量與全局變量同名,局部變量優(yōu)先變量作用范圍示例int x=1;int f(int x)return(x+);main()int y;y=f(2);x=f(x);printf(“%d%d”,y,x);x=1變量作用范圍l如果局部變量與全局變量同名,局部變量優(yōu)先。l不要濫用全局變量有副作用int x=1;void f1()x+;void f2()x=5;void main()x=10;f1();cout x;f2();c
5、out x;11 5 程序是變量(全局)定義和函數(shù)定義的集合。函數(shù)之間的通信可以通過參數(shù)、函數(shù)返回值以及外部變量進(jìn)行。函數(shù)可以以任意次序出現(xiàn)在源文件中。源程序可以分成多個文件,只要不把一個函數(shù)分在幾個文件中就行。關(guān)鍵字extern變量的定義與是聲明是有不同的意義。作用域運(yùn)算符:命名空間std 3-5-1.cpp 3-5-2.cpp3.3 形參與實(shí)參形參與實(shí)參函數(shù)的參數(shù) 函數(shù)的參數(shù)分為形參和實(shí)參兩種。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給
6、被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。函數(shù)的形參和實(shí)參具有以下特點(diǎn):1.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。2.實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。3.實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會發(fā)生“類型不匹配”的錯誤。值傳遞 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送
7、給實(shí)參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會變化。For example:ch3/3-6.cpp 如何實(shí)現(xiàn)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是雙向的。即修改了形參所指的單元,也就修改了實(shí)參。3.4 引用和引用和const引用就是給某一已存在的對象取一別名引用就是給某一已存在的對象取一別名(alias)(alias)。refcount is a reference of an intWhich int to reference exactly?is countas:int count=0;int&refcount=count;refcount=1;/here,count=1 count
8、+;/here,refcount=2;For example:ch3/3-8.cpprules when using references:1.A reference must be initialized when it is created.(Pointers can be initialized at any time.)2.int i;3.int&j;/4.j=i;5.2.Once a reference is initialized to an object,it cannot be changed to refer to another object.(Pointers can b
9、e pointed to another object at any time.)6.int i,k;7.int&j=i;8.int&j=k;/9.rules when using references:3.You cannot have NULL references.You must always be able to assume that a reference is connected to a legitimate piece of storage.int a=1;int&refint1=NULL;/References in functions int&fun(int&i)i+;
10、return i;用用constconst表示常量對象表示常量對象#define BUFSIZE 100 BUFSIZE只是一個名字,沒有存儲空間只是一個名字,沒有存儲空間問題:宏定義常量沒有類型信息;宏定義常量是問題:宏定義常量沒有類型信息;宏定義常量是全局的全局的(extern linkage);用宏定義常量編程,調(diào)用宏定義常量編程,調(diào)試時(shí),不能直接知道它的名字。試時(shí),不能直接知道它的名字。常量處理的老方法常量處理的老方法:C+C+中的常量處理方法中的常量處理方法:const:const的最初動機(jī)是的最初動機(jī)是取代預(yù)處理器取代預(yù)處理器definedefine進(jìn)行值替代進(jìn)行值替代For ex
11、ample:ch3/3-9.cppconst int bufsize=100;(1)有類型信息;有類型信息;const int i=20;chat chi;/正確正確 /以下程序錯:以下程序錯:int i;char chi;constconst用于函數(shù)參數(shù)和返回值用于函數(shù)參數(shù)和返回值intint f1(const f1(const intint&i)&i)i+;/Illegal-compile-time error,i+;/Illegal-compile-time error,Returning by const value例例1 1:const const intint g()g()retu
12、rn 1;return 1;例例2 2:const char*v()const char*v()return result of function v();return result of function v();3.5 缺省參數(shù)值缺省參數(shù)值在在C+C+中,函數(shù)聲明時(shí),可以為一個或多個參中,函數(shù)聲明時(shí),可以為一個或多個參數(shù)指定缺省參數(shù)值。數(shù)指定缺省參數(shù)值。例如:例如:/function definitionvoid delay(int k,int time)/function code body/function declarationvoid delay(int k,int time=30
13、0);/function calldelay(5);/等價(jià)與等價(jià)與delay(5,300);理解要點(diǎn):理解要點(diǎn):當(dāng)函數(shù)調(diào)用執(zhí)行時(shí),編譯器從左到右順序?qū)?shí)參與形參結(jié)合,當(dāng)函數(shù)調(diào)用執(zhí)行時(shí),編譯器從左到右順序?qū)?shí)參與形參結(jié)合,若未指定足夠的實(shí)參,則編譯器按同樣順序用函數(shù)聲明中的缺若未指定足夠的實(shí)參,則編譯器按同樣順序用函數(shù)聲明中的缺省值來補(bǔ)足所缺少的實(shí)參。省值來補(bǔ)足所缺少的實(shí)參。由于對缺省參數(shù)的處理是在函數(shù)調(diào)用表達(dá)式執(zhí)行時(shí)進(jìn)行的,由于對缺省參數(shù)的處理是在函數(shù)調(diào)用表達(dá)式執(zhí)行時(shí)進(jìn)行的,所以,在函數(shù)聲明中,所以,在函數(shù)聲明中,“=”后面可以是任意復(fù)雜的表達(dá)式,后面可以是任意復(fù)雜的表達(dá)式,甚至是函數(shù)調(diào)用。如
14、:甚至是函數(shù)調(diào)用。如:void delay(int k,int time=f(5);/其中其中f(5)是函數(shù)調(diào)用是函數(shù)調(diào)用所有帶缺省值的參數(shù)一律放在函數(shù)聲明中參數(shù)表的最右端。所有帶缺省值的參數(shù)一律放在函數(shù)聲明中參數(shù)表的最右端。void f(int,int y=1,int z);/因?yàn)椋汉瘮?shù)調(diào)用因?yàn)椋汉瘮?shù)調(diào)用f(2,4)將產(chǎn)生二義性:將產(chǎn)生二義性:4 y 還是還是 4 z void f(int,int y=1,int z=2);/在函數(shù)定義中,不再為參數(shù)指定缺省值。在函數(shù)定義中,不再為參數(shù)指定缺省值。(內(nèi)聯(lián)函數(shù)除外內(nèi)聯(lián)函數(shù)除外)3.6 函數(shù)重載函數(shù)重載一個函數(shù)名(標(biāo)識符)可以被用作多個函數(shù)抽一個
15、函數(shù)名(標(biāo)識符)可以被用作多個函數(shù)抽象的名字。編譯時(shí),根據(jù)這些函數(shù)的參數(shù)個數(shù)、象的名字。編譯時(shí),根據(jù)這些函數(shù)的參數(shù)個數(shù)、參數(shù)類型來區(qū)分(束定參數(shù)類型來區(qū)分(束定/綁定綁定binding)binding)For example:unit three:function_overloading.dsw二義性錯誤二義性錯誤Outline:要確保不同的參數(shù)類型確實(shí)不同。要確保不同的參數(shù)類型確實(shí)不同。例如:例如:typedef float real;float abs(float)/real abs(real)/函數(shù)的返回類型不能區(qū)分重載函數(shù)函數(shù)的返回類型不能區(qū)分重載函數(shù)例如:例如:int process
16、(int)/float process(int)/僅僅用了僅僅用了constconst而使參數(shù)類型有所不同,則而使參數(shù)類型有所不同,則不能區(qū)分。不能區(qū)分。例如例如:int process(int)/float process(const int)/Void Complex()apart=0.0;ipart=0.0;Void Complex(double d)apart=d;ipart=0.0;Void Complex(double a,double b)apart=a;ipart=b;Void Complex(double a=0.0,double b=0.0)apart=a;ipart=b;
17、When:Complex();/be equal to Complex(0.0,0.0)Complex(2);/Complex(2,0.0)3.7 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)function call need costs:involved from pushing arguments,making an assembly-language CALL,returning arguments,and performing an assembly-language RETURNFor example:ch3/3-10.cpp 在在C+C+中,用中,用inline functioninline functio
18、n來替換來替換帶參宏的使用。帶參宏的使用。C+C+的內(nèi)聯(lián)機(jī)制和的內(nèi)聯(lián)機(jī)制和C C中的帶中的帶參宏定義都是為了獲得較高的運(yùn)行速度。參宏定義都是為了獲得較高的運(yùn)行速度。使用宏和使用宏和內(nèi)聯(lián)函數(shù)增加了代碼空間,但減內(nèi)聯(lián)函數(shù)增加了代碼空間,但減少了程序執(zhí)行時(shí)間少了程序執(zhí)行時(shí)間。因?yàn)椴辉儆泻瘮?shù)調(diào)。因?yàn)椴辉儆泻瘮?shù)調(diào)用開銷。但用開銷。但C+C+的內(nèi)聯(lián)機(jī)制比的內(nèi)聯(lián)機(jī)制比C C中的帶參宏中的帶參宏定義更安全。定義更安全。#include inline float area(float r)return 3.14*r*r;int main()float f=2;float s=area(f+);coutfendl
19、sendl;return 0;inline function作用:在一個函數(shù)定義之前作用:在一個函數(shù)定義之前加上關(guān)鍵字加上關(guān)鍵字inline,則稱該則稱該函數(shù)為內(nèi)聯(lián)函數(shù)。每當(dāng)在其函數(shù)為內(nèi)聯(lián)函數(shù)。每當(dāng)在其它程序中有對該內(nèi)聯(lián)函數(shù)的它程序中有對該內(nèi)聯(lián)函數(shù)的調(diào)用,調(diào)用,C+編譯器都使用該編譯器都使用該內(nèi)聯(lián)函數(shù)的代碼替換該內(nèi)聯(lián)內(nèi)聯(lián)函數(shù)的代碼替換該內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式。函數(shù)的調(diào)用表達(dá)式。使用內(nèi)聯(lián)函數(shù)的優(yōu)點(diǎn):使用內(nèi)聯(lián)函數(shù)的優(yōu)點(diǎn):參數(shù)的類型和函數(shù)返回值的類型都在函數(shù)聲明中進(jìn)行明確的指定。參數(shù)的類型和函數(shù)返回值的類型都在函數(shù)聲明中進(jìn)行明確的指定。這便于編譯器發(fā)現(xiàn)函數(shù)調(diào)用中的類型不一致的錯誤。這便于編譯器發(fā)現(xiàn)函數(shù)
20、調(diào)用中的類型不一致的錯誤。如果傳入函數(shù)的是表達(dá)式,則此表達(dá)式僅求值一次。如果傳入函數(shù)的是表達(dá)式,則此表達(dá)式僅求值一次。內(nèi)聯(lián)函數(shù)只宜用于比較簡單的函數(shù)(不含循環(huán)語句和內(nèi)聯(lián)函數(shù)只宜用于比較簡單的函數(shù)(不含循環(huán)語句和switch語句)。語句)。如果內(nèi)聯(lián)函數(shù)的體很大,有可能使代碼的規(guī)模急劇增加。如果內(nèi)聯(lián)函數(shù)的體很大,有可能使代碼的規(guī)模急劇增加。編譯器如何內(nèi)聯(lián)編譯器如何內(nèi)聯(lián)?64.內(nèi)聯(lián)函數(shù)和編譯器內(nèi)聯(lián)函數(shù)和編譯器 (1)編譯器如何實(shí)現(xiàn)內(nèi)聯(lián)?編譯器如何實(shí)現(xiàn)內(nèi)聯(lián)?(2)內(nèi)聯(lián)的局限性內(nèi)聯(lián)的局限性:a)假如函數(shù)太復(fù)雜假如函數(shù)太復(fù)雜,編譯器將不能執(zhí)行內(nèi)聯(lián)編譯器將不能執(zhí)行內(nèi)聯(lián)(復(fù)雜的函數(shù)定義順序、構(gòu)造函數(shù)和復(fù)雜的函
21、數(shù)定義順序、構(gòu)造函數(shù)和析構(gòu)函數(shù)析構(gòu)函數(shù)).b)假如在程序中假如在程序中,隱含或顯式取該函數(shù)的地址隱含或顯式取該函數(shù)的地址,則則 c)在程序的在程序的Debug版本版本,不執(zhí)行內(nèi)聯(lián)不執(zhí)行內(nèi)聯(lián) 3.8 編譯預(yù)處理編譯預(yù)處理 在前面各章中,已多次使用過以“#”號開頭的預(yù)處理命令。如包含命令#include,宏定義命令#define等。在源程序中這些命令都放在函數(shù)之外,而且一般都放在源文件的前面,它們稱為預(yù)處理部分。所謂預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預(yù)處理是語言的一個重要功能,它由預(yù)處理程序負(fù)責(zé)完成。當(dāng)對一個源文件進(jìn)行編譯時(shí),系統(tǒng)將自動引用預(yù)處理程序?qū)υ闯绦蛑械?/p>
22、預(yù)處理部分作處理,處理完畢自動進(jìn)入對源程序的編譯。語言提供了多種預(yù)處理功能,如宏定義、文件包含、條件編譯等。合理地使用預(yù)處理功能編寫的程序便于閱讀、修改、移植和調(diào)試,也有利于模塊化程序設(shè)計(jì)。本章介紹常用的幾種預(yù)處理功能。無參宏#define PI 3.14159#define NoBall 0#define PlayerBall 1#define ComputerBall 2/無參宏,用符號表示常量,For example:3-9.cpp有參宏和inline(內(nèi)聯(lián))函數(shù)#define aera(x)PI*(x)*(x)利用有參宏來替代一些簡單的函數(shù)調(diào)用,為了減少由于調(diào)用函數(shù)所帶來的一些開銷.F
23、or example:3-10.cpp文件包含#include#include“chess.h 文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當(dāng)前的源程序文件連成一個源文件。在程序設(shè)計(jì)中,文件包含是很有用的。一個大的程序可以分為多個模塊,由多個程序員分別編程。有些公用的符號常量或宏定義等可單獨(dú)組成一個文件,在其它文件的開頭用包含命令包含該文件即可使用。這樣,可避免在每個文件開頭都去書寫那些公用量,從而節(jié)省時(shí)間,并減少出錯。對文件包含命令還要說明以下幾點(diǎn):1.使用尖括號表示在包含文件目錄中去查找(包含目錄是由用戶在設(shè)置環(huán)境時(shí)設(shè)置的),而不在源文件目錄去查找;使用雙引號則表示首先在當(dāng)前的源文件目錄中查找,若未找到才到包含目錄中去查找。用戶編程時(shí)可根據(jù)自己文件所在的目錄來選擇某一種命令形式。2.一個include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個include命令。3.文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。條件編譯 可以按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件。這對于程序的移植和調(diào)試是很有用的。條件編譯有三種形式,下面分別介紹:1.第一種形式:#ifdef 標(biāo)識符 程序段1#else 程序段2#endif Lab and ExerciseLab:實(shí)驗(yàn)五
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024《增值稅法》全文學(xué)習(xí)解讀(規(guī)范增值稅的征收和繳納保護(hù)納稅人的合法權(quán)益)
- 2024《文物保護(hù)法》全文解讀學(xué)習(xí)(加強(qiáng)對文物的保護(hù)促進(jìn)科學(xué)研究工作)
- 銷售技巧培訓(xùn)課件:接近客戶的套路總結(jié)
- 20種成交的銷售話術(shù)和技巧
- 銷售技巧:接近客戶的8種套路
- 銷售套路總結(jié)
- 房產(chǎn)銷售中的常見問題及解決方法
- 銷售技巧:值得默念的成交話術(shù)
- 銷售資料:讓人舒服的35種說話方式
- 汽車銷售績效管理規(guī)范
- 銷售技巧培訓(xùn)課件:絕對成交的銷售話術(shù)
- 頂尖銷售技巧總結(jié)
- 銷售技巧:電話營銷十大定律
- 銷售逼單最好的二十三種技巧
- 銷售最常遇到的10大麻煩