




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+程序設(shè)計(jì)第二版第1章 C+基礎(chǔ)1.1 C+概述31.1.1 程序設(shè)計(jì)語言人類的社會(huì)生活中,“自然語言”是人與人之間用來交流的工具,是由語音、詞匯和語法構(gòu)成的系統(tǒng)。而“程序設(shè)計(jì)語言”是人指揮計(jì)算機(jī)工作的工具,是計(jì)算機(jī)可以識(shí)別的語言,用于描述解決問題的方法,供計(jì)算機(jī)閱讀和執(zhí)行。常見的高級(jí)語言有:Basic、Pascal、C、C+、C#、Java、PHP、Python等,不同的語言有不同的應(yīng)用范圍。1.1 C+概述41.1.2 程序設(shè)計(jì)(1)數(shù)據(jù)描述:數(shù)據(jù)描述是把被處理的信息描述成計(jì)算機(jī)可以接收的數(shù)據(jù)形式,如整數(shù)、實(shí)數(shù)、字符、數(shù)組等。(2)數(shù)據(jù)處理:數(shù)據(jù)處理是指對(duì)數(shù)據(jù)進(jìn)行輸入、輸出、整理、計(jì)算、
2、存儲(chǔ)、維護(hù)等一系列的操作。數(shù)據(jù)處理的目的是為了提取所需的數(shù)據(jù)成分,以獲得有用的資料。1.1 C+概述51.1.3 C+語言的發(fā)展歷史和特點(diǎn)C+語言由C語言發(fā)展而來,是以面向?qū)ο鬄橹饕卣鞯恼Z言。它是20世紀(jì)80年代初由貝爾實(shí)驗(yàn)室的BjarenStroustrup博士發(fā)明的,最初稱為“帶類的C”,1983年正式命名為C+。1.1 C+概述61.1.3 C+語言的發(fā)展歷史和特點(diǎn)(1)作為C語言的超集,C+繼承了C的所有優(yōu)點(diǎn),與C語言兼容,支持結(jié)構(gòu)化的程序設(shè)計(jì)。 (2)對(duì)C語言的數(shù)據(jù)類型做了擴(kuò)充,修補(bǔ)了C語言中的一些漏洞,提供了更好的類型檢查和編譯時(shí)的分析。(3)生成目標(biāo)程序質(zhì)量高,程序執(zhí)行效率高。
3、(4)支持面向?qū)ο蟮某绦蛟O(shè)計(jì),通過類和對(duì)象的概念把數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一起,模塊的獨(dú)立性更強(qiáng)。(5)提供了異常處理機(jī)制,簡化了程序的出錯(cuò)處理。C+的主要特點(diǎn)包括:1.2 簡單的C+程序?qū)嵗?C+的程序結(jié)構(gòu)由注釋、編譯預(yù)處理指令和程序主體組成?!纠?-1】 輸入圓的半徑,編程計(jì)算圓周長、圓面積、球體積并將其顯示出來。1.3 C+程序開發(fā)過程8C+程序開發(fā)通常要經(jīng)過5個(gè)階段,包括:編輯編譯預(yù)處理編譯連接運(yùn)行調(diào)試1.3 C+程序開發(fā)過程9在C+系統(tǒng)下,程序開發(fā)過程如圖1-1所示。1.4 C+ 的詞法單位10C+的字符集是ASCII碼字符集的子集。包括如下字符:26個(gè)英文大寫字母:ABCDEFGH
4、IJKLMNOPQRSTUVWXYZ26個(gè)英文小寫字母:abcdefghijklmnopqrstuvwxyzl0個(gè)阿拉伯?dāng)?shù)字:012345678926個(gè)其他符號(hào):+、-、*、/、=、,、.、_、:、;、?、|、!、#、%、&、()、空格。C+的上述字符集構(gòu)成了5種詞法單位:關(guān)鍵字、標(biāo)識(shí)符、標(biāo)點(diǎn)符號(hào)、運(yùn)算符和空白符。1.5 C+的數(shù)據(jù)類型11C+中提供了豐富的數(shù)據(jù)類型,分為基本類型和非基本類型兩大類,如圖1-2所示。1.5 C+的數(shù)據(jù)類型121.6 變量和常量13在程序運(yùn)行過程中,其值可以改變的量稱為變量。變量必須用標(biāo)識(shí)符進(jìn)行標(biāo)識(shí),該標(biāo)識(shí)符稱為變量名。在C+中,變量說明的一般格式為:程序中的數(shù)據(jù)
5、類型可以是C+定義的基本類型,也可以是非基本類型。變量定義可以出現(xiàn)在程序中的任何位置,只要在使用該變量之前定義即可。同一變量在一定范圍內(nèi)只能定義一次。定義變量時(shí)可以根據(jù)需要給變量一個(gè)值,這稱為變量初始化或給變量賦初值。1.6.1 變量1.6 變量和常量14定義一個(gè)變量即明確了它的4個(gè)屬性:名字、數(shù)據(jù)類型、允許的取值范圍及合法操作。這樣做帶來三個(gè)好處:(1)便于系統(tǒng)為變量分配內(nèi)存空間,系統(tǒng)根據(jù)變量類型為其分配一段連續(xù)的內(nèi)存單元,不同類型的變量占用內(nèi)存單元的字節(jié)數(shù)不同,根據(jù)類型能夠保證內(nèi)存空間的有效使用。(2)便于在編譯期間進(jìn)行語法檢查。不同類型的變量有其相應(yīng)的合法操作,編譯程序可以根據(jù)變量的類型
6、對(duì)其操作的合法性進(jìn)行檢查。(3)程序可以按名訪問變量。變量名和內(nèi)存單元地址之間存在映射關(guān)系,當(dāng)程序引用變量時(shí),計(jì)算機(jī)通過變量名尋址,進(jìn)而訪問其中的數(shù)據(jù)。1.6.1 變量1.6 變量和常量15常量是指取值在程序的執(zhí)行過程中始終保持不變的量。根據(jù)取值和表示方法的不同,文字常量分為:1.6.2 文字常量整型常量實(shí)型常量字符型常量字符串常量1.6 變量和常量161.6.2 文字常量1.整型常量C+中的整型常量可以使用十進(jìn)制、八進(jìn)制、十六進(jìn)制形式表示。2.實(shí)型常量C+中的實(shí)型常量,有一般形式和指數(shù)形式兩種表示方法。3.字符型常量字符型常量是用單引號(hào)引起來的字符,在內(nèi)存中保存的是字符的ASCII碼值。有兩
7、種形式:(1)單引號(hào)引起來的單個(gè)字符,如:A、$、0、_等。(2)單引號(hào)內(nèi)以反斜杠開頭的字符,稱為轉(zhuǎn)義序列表示。1.6 變量和常量171.6 變量和常量181.6.2 文字常量4.字符串常量用雙引號(hào)引起來的若干個(gè)字符序列稱為字符串常量。需要注意的是:(1)字符串常量和字符常量是不同的,不能將字符串常量賦值或初始化給字符變量。(2)當(dāng)單引號(hào)作為字符串中的一個(gè)字符時(shí),可以直接按書寫形式出現(xiàn),也可以用轉(zhuǎn)義序列表示,但當(dāng)雙引號(hào)作為字符串中的一個(gè)字符時(shí),只能用轉(zhuǎn)義序列表示。1.6 變量和常量191.6.3 常變量用常量說明符const給文字常量起個(gè)名字,這個(gè)標(biāo)識(shí)符就稱為標(biāo)識(shí)符常量。由于標(biāo)識(shí)符常量形式很像
8、變量,因此也稱為常變量。常變量的定義形式為:1.7 運(yùn)算符和表達(dá)式201.7.1 C+的運(yùn)算符、優(yōu)先級(jí)和結(jié)合性對(duì)常量或變量進(jìn)行運(yùn)算或處理的符號(hào)稱為運(yùn)算符,參與運(yùn)算的對(duì)象稱為操作數(shù),運(yùn)算符與操作數(shù)是相關(guān)聯(lián)的,相同的運(yùn)算符對(duì)不同類型的操作數(shù)執(zhí)行的運(yùn)算是有差異的。1.運(yùn)算符的分類按照要求的操作數(shù)個(gè)數(shù)的不同,C+運(yùn)算符可以分為:單目運(yùn)算符雙目運(yùn)算符三目運(yùn)算符1.7 運(yùn)算符和表達(dá)式211.7.1 C+的運(yùn)算符、優(yōu)先級(jí)和結(jié)合性1.運(yùn)算符的分類按照運(yùn)算的功能,C+運(yùn)算符可以分為:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符、條件運(yùn)算符、賦值運(yùn)算符、逗號(hào)運(yùn)算符、sizeof運(yùn)算符及其他運(yùn)算符。2.運(yùn)算符的優(yōu)先
9、級(jí)和結(jié)合性運(yùn)算符的優(yōu)先級(jí)指不同運(yùn)算符在運(yùn)算中的優(yōu)先關(guān)系,表中序號(hào)越小,其優(yōu)先級(jí)越高。運(yùn)算符的結(jié)合性是指優(yōu)先級(jí)相同的運(yùn)算符組合在一起時(shí)運(yùn)算符和操作數(shù)的結(jié)合方向。1.7 運(yùn)算符和表達(dá)式221.7.2 運(yùn)算符及其表達(dá)式1.算術(shù)運(yùn)算符及算術(shù)表達(dá)式表達(dá)式是由運(yùn)算符、操作數(shù)及分隔符組成的式子。C+提供5種基本的算術(shù)運(yùn)算符:+(加)、-(減)、*(乘)、/(除)、%(取余)2.賦值運(yùn)算符與賦值表達(dá)式C+的賦值運(yùn)算符為“=”,其意義是將賦值號(hào)右邊的值送到左邊變量名所標(biāo)識(shí)的內(nèi)存單元中。語法格式為:1.7 運(yùn)算符和表達(dá)式231.7.2 運(yùn)算符及其表達(dá)式3.自增、自減運(yùn)算表達(dá)式是由運(yùn)算符、操作數(shù)及分隔符組成的式子。
10、自增、自減運(yùn)算符是單目運(yùn)算符。其中+是自增運(yùn)算符,-是自減運(yùn)算符,其意義是使變量的當(dāng)前值加1或減1后再賦給該變量。4.關(guān)系運(yùn)算和邏輯運(yùn)算C+提供了6種關(guān)系運(yùn)算符:(大于)、=(大于等于)、(小于)、=(小于等于)、=(等于)和!=(不等于),用來完成兩個(gè)操作數(shù)的比較,結(jié)果為邏輯值true(真)或false(假)。C+提供了3種邏輯運(yùn)算符:! (邏輯非)、&(邏輯與)和|(邏輯或)。其中! 是單目運(yùn)算符。1.7 運(yùn)算符和表達(dá)式241.7.2 運(yùn)算符及其表達(dá)式1.7 運(yùn)算符和表達(dá)式251.7.2 運(yùn)算符及其表達(dá)式5.逗號(hào)運(yùn)算符與逗號(hào)表達(dá)式表達(dá)式是由運(yùn)算符、操作數(shù)及分隔符組成的式子。C+中的逗號(hào)“,
11、”也是一個(gè)運(yùn)算符,在所有運(yùn)算符中它的優(yōu)先級(jí)最低。用逗號(hào)連接起來的表達(dá)式稱為逗號(hào)表達(dá)式。語法格式為:6.sizeof()運(yùn)算符該運(yùn)算符計(jì)算某種類型或某種類型變量在內(nèi)存中所占的字節(jié)數(shù)。語法格式為:1.7 運(yùn)算符和表達(dá)式261.7.2 運(yùn)算符及其表達(dá)式7.條件運(yùn)算符和條件表達(dá)式C+中唯一的一個(gè)三目運(yùn)算符是條件運(yùn)算符“?:”,由條件運(yùn)算符構(gòu)成的表達(dá)式稱為條件表達(dá)式。條件表達(dá)式能夠?qū)崿F(xiàn)簡單的選擇功能。語法格式為:1.7 運(yùn)算符和表達(dá)式271.7.3 表達(dá)式求解中的數(shù)據(jù)類型轉(zhuǎn)換1.自動(dòng)類型轉(zhuǎn)換(1)字符可以作為整數(shù)參與數(shù)值運(yùn)算,整數(shù)值為其ASCII碼。(2)操作數(shù)為bool、字符或短整型時(shí),系統(tǒng)自動(dòng)將其轉(zhuǎn)
12、換成整型。(3)當(dāng)兩操作數(shù)的類型不同時(shí),將精度低(或表示范圍小)的操作數(shù)的數(shù)據(jù)類型轉(zhuǎn)換為另一操作數(shù)的類型后再進(jìn)行運(yùn)算,轉(zhuǎn)換規(guī)則如圖1-5所示。1.7 運(yùn)算符和表達(dá)式281.7.3 表達(dá)式求解中的數(shù)據(jù)類型轉(zhuǎn)換2.強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換必須通過類型轉(zhuǎn)換運(yùn)算來實(shí)現(xiàn)。其格式為:1.7 運(yùn)算符和表達(dá)式291.7.4 語句C+程序由語句構(gòu)成。一個(gè)程序包含若干條語句,語句都是用來完成一定操作任務(wù)的。C+中的語句分為以下幾種:1.說明語句2.表達(dá)式語句3.空語句4.復(fù)合語句5.流程控制語句1.8 數(shù)據(jù)的輸入/輸出301.7.4 語句在C+中,輸入/輸出使用了流的概念。每一個(gè)輸入/輸出設(shè)備接收和傳送一系列的字
13、節(jié),稱之為流。輸入操作可以看成是字節(jié)從一個(gè)設(shè)備流入內(nèi)存,而輸出操作可以看成是字節(jié)從內(nèi)存流出到一個(gè)設(shè)備。要使用C+標(biāo)準(zhǔn)的輸入/輸出流庫的功能,需要包括兩個(gè)頭文件:iostream和iomanip,形式如下:1.8 數(shù)據(jù)的輸入/輸出311.7.4 語句用cin對(duì)象輸入數(shù)據(jù),一般格式為:用cout對(duì)象輸出數(shù)據(jù),一般格式為:THANKSC+程序設(shè)計(jì)第二版第2章 程序的控制結(jié)構(gòu)2.1 算法的概念與表示方法351.1.1 程序設(shè)計(jì)語言(1)對(duì)數(shù)據(jù)的描述。在程序中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)。(2)對(duì)操作的描述。即操作步驟,也就是算法。 數(shù)據(jù)是操作的對(duì)象,操作的目的是對(duì)數(shù)據(jù)進(jìn)行加工處理,以得
14、到期望的結(jié)果。作為程序設(shè)計(jì)人員,必須認(rèn)真考慮并設(shè)計(jì)合適的數(shù)據(jù)結(jié)構(gòu)和操作步驟。著名的計(jì)算機(jī)科學(xué)家Ni-kiklaus Wirth提出了一個(gè)公式來描述程序、數(shù)據(jù)結(jié)構(gòu)和算法的關(guān)系:2.1 算法的概念與表示方法362.1.1 算法的概念算法就是解決問題的步驟序列。算法具有以下幾個(gè)特征:(1)可行性。(2)確定性。(3)有窮性。(4)可輸人/輸出數(shù)據(jù)。2.1 算法的概念與表示方法372.1.2 算法的表示算法的表示方法有很多種,常用的算法表示方法有:自然語言、流程圖、偽代碼等。其中流程圖和偽代碼是程序設(shè)計(jì)人員常用的兩種算法表示方法。流程圖是算法圖形化的表示。用一些圖框表示各種操作,用箭頭表示算法流程,比
15、較直觀,易于理解。2.1 算法的概念與表示方法382.1.3 程序的三種基本結(jié)構(gòu)流程圖中的A、B、C代表一條指令或一個(gè)指令組,指令組是一個(gè)整體,在整個(gè)算法中呈現(xiàn)一條指令的特點(diǎn),要么都執(zhí)行,要么都不執(zhí)行。P代表判斷條件。2.1 算法的概念與表示方法392.1.3 程序的三種基本結(jié)構(gòu)1.順序結(jié)構(gòu)順序結(jié)構(gòu)是算法中最簡單的結(jié)構(gòu),其特點(diǎn)是按照算法書寫順序依次執(zhí)行。2.分支結(jié)構(gòu)分支結(jié)構(gòu)的特點(diǎn)是根據(jù)條件判斷選擇執(zhí)行路徑。 3.循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)用于實(shí)現(xiàn)重復(fù)性動(dòng)作。根據(jù)算法的有窮性,循環(huán)必須在一定條件下進(jìn)行,無條件必然會(huì)導(dǎo)致無窮循環(huán)。2.2 分支結(jié)構(gòu)402.2.1 if語句if語句的基本格式為:if語句1語句也
16、稱為條件語句,其功能是根據(jù)if后表達(dá)式的值,確定程序的執(zhí)行流程:是執(zhí)行,還是執(zhí)行語句202.2 分支結(jié)構(gòu)412.2.2 if語句的嵌套嵌套if語句的語法格式為:if語句還有另外一種嵌套形式,語法格式為:2.2 分支結(jié)構(gòu)4243嵌套if語句實(shí)現(xiàn)了多分支選擇。此外C+還提供了一個(gè)switch語句,又稱為開關(guān)語句,也可以實(shí)現(xiàn)多分支選擇。它根據(jù)條件從多個(gè)分支語句序列中選擇一個(gè)作為執(zhí)行人日。語法格式為:2.2.3 switch語句2.2 分支結(jié)構(gòu)2.3 循環(huán)結(jié)構(gòu)44while語句實(shí)現(xiàn)當(dāng)型循環(huán)。語法格式為:2.3.1 while語句其中,表達(dá)式可以是C+中的任意類型表達(dá)式,表達(dá)式的值非0(為真)時(shí),就執(zhí)行
17、循環(huán)體語句。循環(huán)體語句可以是單語句,也可以是復(fù)合語句。while循環(huán)的執(zhí)行流程如圖2-5所示。2.3 循環(huán)結(jié)構(gòu)45do-while循環(huán)語句屬于直到型循環(huán)結(jié)構(gòu),語法格式為:2.3.2 do-while W句2.3 循環(huán)結(jié)構(gòu)46for循環(huán)語句的語法格式為:2.3.3 for語句2.3 循環(huán)結(jié)構(gòu)47分支結(jié)構(gòu)可以嵌套使用,循環(huán)結(jié)構(gòu)也可以嵌套使用,形成嵌套循環(huán)。分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)還可以相互嵌套,形成一個(gè)復(fù)雜的程序結(jié)構(gòu),解決較為復(fù)雜的問題。C+規(guī)定,循環(huán)的嵌套只能呈包含結(jié)構(gòu),即外循環(huán)包含內(nèi)循環(huán),不能呈交叉結(jié)構(gòu)。因此圖2-8中(a)和(b)為合法的循環(huán)結(jié)構(gòu),通常把外層循環(huán)簡稱為外循環(huán),里層循環(huán)簡稱為內(nèi)循環(huán)。
18、(c)是錯(cuò)誤的循環(huán)結(jié)構(gòu)。2.3.4 循環(huán)的嵌套2.4 轉(zhuǎn)向語句481. break語句break語句只能用在switch語句和循環(huán)語句中。break語句在循環(huán)語句中用來立即終止循環(huán)。需要注意的是,在嵌套循環(huán)中,break語句終止的是其所在的那一層循環(huán),如外層還有循環(huán)仍要繼續(xù)執(zhí)行。2. continue語句continue語句只能用在循環(huán)語句中,用來終止本次循環(huán),即跳過本層循環(huán)體中尚未執(zhí)行的語句,繼續(xù)下次循環(huán)。2.4 轉(zhuǎn)向語句493. goto語句goto語句格式為: goto語句的功能是將程序無條件轉(zhuǎn)移到“語句標(biāo)號(hào)”處執(zhí)行。語句標(biāo)號(hào)是用來表示語句的標(biāo)識(shí)符,放在語句最前面,并用胃號(hào)與語句分開。結(jié)
19、構(gòu)化程序設(shè)計(jì)方法主張限制使用goto語句。因?yàn)間oto語句不符合結(jié)構(gòu)化程序設(shè)計(jì)的準(zhǔn)則,無條件轉(zhuǎn)移使程序結(jié)構(gòu)無規(guī)律,可讀性較差。2.5 常用算法的應(yīng)用實(shí)例501.枚舉法枚舉法也稱為窮舉法,基本思想是在有限范圍內(nèi)列舉所有可能的結(jié)果,找出其中符合要求的解。枚舉法適合求解的問題是:可能的答案是有限個(gè)且答案是可知的,但又難以用解析法描述。這種算法通常用循環(huán)結(jié)構(gòu)來完成。2.遞推法遞推法是通過問題的一個(gè)或多個(gè)已知解,用同樣的方法逐個(gè)推算出其他解,遞推法常用來求解數(shù)列問題、近似計(jì)算問題等。2.6 枚舉類型511.枚舉類型的定義枚舉類型的定義格式為: 其中,關(guān)鍵字enum指明其后的標(biāo)識(shí)符是枚舉類型的名字,枚舉常
20、量表中列出了 該類型變量所有的取值。各枚舉常量之間以“,”間隔。2.6 枚舉類型522.枚舉類型變量的定義定義了枚舉類型,就可以定義枚舉類型的變量。(1)先定義類型再定義變量,如:enum weekdaySun,Mon,Tuc, Wcd,Thu,F(xiàn)ri , Sat ;weekday wdl= Mon,wd27;(2)定義枚舉類型的同時(shí)定義變量,如:enum gender Male, Female perl , pert=Male; /定義pcr2時(shí)并初始化(3)匿名枚舉類型:enum枚舉常量列表枚舉變量列表;cnumSun, Mon, Tuc, Wcd , Thu,F(xiàn)ri,Sat wd 1,w
21、d2;2.6 枚舉類型533.枚舉類型變量的運(yùn)算枚舉類型可以參與的運(yùn)算有限,一般只能進(jìn)行賦值和關(guān)系運(yùn)算。其關(guān)系運(yùn)算本質(zhì)是按其指定的整數(shù)值比較,但必須是同類型枚舉常量或變量比較。 4.枚舉類型的應(yīng)用定義枚舉類型的目的是增加程序的可讀性。另外就是限制變量的取值范圍。枚舉類型最常見也是最有意義的用處之一就是用來描述狀態(tài)量。THANKSC+程序設(shè)計(jì)第二版第3章 函 數(shù)3.1 函數(shù)的定義與調(diào)用573.1.1 函數(shù)概述 當(dāng)需要程序處理的問題越來越龐大、復(fù)雜,人們需要采取有效手段,控制問題的復(fù)雜度。功能分解和組合就是常用的手段。功能分解是指在程序設(shè)計(jì)時(shí),首先把需要完成的大功能分解成若干個(gè)子功能,每個(gè)子功能又
22、可根據(jù)復(fù)雜度再分解,直至最終分解出的子功能相對(duì)簡單、易于實(shí)現(xiàn),這就是自頂向下、逐步求精的設(shè)計(jì)過程。功能組合是指把經(jīng)過分解得到的子功能逐步組合成大功能,從而形成自底向上的設(shè)計(jì)過程。功能分解和組合的程序設(shè)計(jì)基于一種抽象機(jī)制過程抽象或稱為功能抽象。函數(shù)就是一種過程抽象。程序進(jìn)行設(shè)計(jì)時(shí)將一些功能相對(duì)獨(dú)立或經(jīng)常使用的操作抽象出來,定義為函數(shù)。各函數(shù)操作步驟有限,流程容易控制,程序容易編制和調(diào)試。3.1 函數(shù)的定義與調(diào)用583.1.1 函數(shù)概述函數(shù)調(diào)用的層次關(guān)系。3.1 函數(shù)的定義與調(diào)用593.1.2 函數(shù)的定義函數(shù)定義包括函數(shù)頭和函數(shù)體兩部分。函數(shù)頭給出了函數(shù)功能和接日的全部要素,包括函數(shù)名、函數(shù)參數(shù)類
23、型及個(gè)數(shù)、函數(shù)返回值類型;函數(shù)體則是功能的實(shí)現(xiàn)。L+規(guī)定,函數(shù)必須先定義后使用。函數(shù)定義語法格式為:3.1 函數(shù)的定義與調(diào)用603.1.3 函數(shù)的調(diào)用程序中通過函數(shù)調(diào)用使控制轉(zhuǎn)向被調(diào)函數(shù),執(zhí)行被調(diào)函數(shù)。其中,實(shí)際參數(shù)簡稱實(shí)參,程序執(zhí)行過程中,實(shí)參將值傳遞給函數(shù)定義中的對(duì)應(yīng)形參。實(shí)參可以是常量、變量、表達(dá)式,還可以是具有返回值的函數(shù)調(diào)用。無返回值的函數(shù)調(diào)用時(shí)單獨(dú)成為函數(shù)調(diào)用語句。而調(diào)用有返回值的函數(shù)時(shí)將產(chǎn)生一個(gè)數(shù)據(jù)值,因此有返回值函數(shù)調(diào)用語句通常出現(xiàn)在表達(dá)式中,其返回值參與運(yùn)算,如賦值或輸出等。3.1 函數(shù)的定義與調(diào)用613.1.4 函數(shù)聲明C+程序中,對(duì)函數(shù)的書寫順序沒有特定要求,但必須滿足先
24、定義后調(diào)用的原則。對(duì)于庫函數(shù),在程序開頭用“# include”指令將庫函數(shù)所在的頭文件包含進(jìn)來即可。而對(duì)于自定義函數(shù),如不能滿足先定義后調(diào)用的原則,則必須在調(diào)用之前進(jìn)行函數(shù)聲明。這樣無論自定義函數(shù)書寫在什么位置,程序都能正確編譯。函數(shù)聲明也稱為函數(shù)原型。函數(shù)聲明一般形式如下:3.2 函數(shù)的參數(shù)傳遞、返回值623.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用 調(diào)用函數(shù)時(shí),首先要將函數(shù)調(diào)用時(shí)的參數(shù)即實(shí)參一一對(duì)應(yīng)地傳遞給函數(shù)定義中的參數(shù)即形參變量。對(duì)應(yīng)參數(shù)類型應(yīng)該相匹配,即實(shí)參的類型可以轉(zhuǎn)化為形參類型。而實(shí)參和形參對(duì)應(yīng)的參數(shù)名則不要求相同。按照參數(shù)形式的不同,C+有兩種調(diào)用方式:傳值調(diào)用和引用調(diào)用。顧名思義,
25、傳值調(diào)用傳遞的是實(shí)參的值,本節(jié)介紹傳值調(diào)用。所謂傳值調(diào)用,是將實(shí)參的值復(fù)制給形參,在被調(diào)函數(shù)中參加運(yùn)算的是形參,形參值的任何變化不會(huì)影響主調(diào)函數(shù)中對(duì)應(yīng)的實(shí)參。因此函數(shù)的傳值調(diào)用方式起到一種隔離作用,理解這一點(diǎn)很重要。3.2 函數(shù)的參數(shù)傳遞、返回值633.2.2 函數(shù)返回值 對(duì)于有返回值的函數(shù),在函數(shù)的返回處必須用return語句將返回值返回給主調(diào)函數(shù)。return語句的一般語法格式為:其中,表達(dá)式的值即函數(shù)返回的值。執(zhí)行該語句時(shí),首先計(jì)算表達(dá)式的值,然后將其類型轉(zhuǎn)換為函數(shù)類型返回,同時(shí)結(jié)束被調(diào)函數(shù)的執(zhí)行,返回主調(diào)函數(shù)的調(diào)用處繼續(xù)執(zhí)行。3.2 函數(shù)的參數(shù)傳遞、返回值643.2.3 函數(shù)調(diào)用機(jī)制每
26、當(dāng)函數(shù)調(diào)用時(shí),系統(tǒng)都會(huì)做以下工作:(1)建立??臻g。(2)保護(hù)現(xiàn)場,將當(dāng)前主調(diào)函數(shù)的執(zhí)行狀態(tài)和返回地址保存在棧中。(3)為被調(diào)函數(shù)中的局部變量(包括形參)分配??臻g,并將實(shí)參值傳遞給??臻g的對(duì)應(yīng)形參。(4)執(zhí)行被調(diào)函數(shù)至該函數(shù)結(jié)束處。(5)釋放被調(diào)函數(shù)的所有局部變量??臻g。(6)恢復(fù)現(xiàn)場。取出主調(diào)函數(shù)的執(zhí)行狀態(tài)及返回地址,釋放??臻g。(7)返回主調(diào)函數(shù)繼續(xù)執(zhí)行。3.3 函數(shù)的嵌套和遞歸調(diào)用653.3.1 嵌套調(diào)用C+允許被調(diào)用函數(shù)再調(diào)用其他函數(shù),稱為函數(shù)的嵌套調(diào)用。【例3-4】輸人一個(gè)數(shù),判斷其是否是回文數(shù)。 回文數(shù)是指其各位數(shù)字左右對(duì)稱,如11 、123321等。在主函數(shù)main中調(diào)用了Is
27、palin-drome函數(shù),而在Ispalindrome中又調(diào)用了Reverse函數(shù),形成了函數(shù)的嵌套調(diào)用。圖3-5說明了本例函數(shù)嵌套調(diào)用過程。3.3 函數(shù)的嵌套和遞歸調(diào)用663.3.2 遞歸調(diào)用 遞歸是用于推理和問題求解的一種方法。如果通過一個(gè)對(duì)象自身的結(jié)構(gòu)來描述或部分描述本對(duì)象,就稱為遞歸。許多對(duì)象特別是數(shù)學(xué)研究對(duì)象具有遞歸結(jié)構(gòu)。遞歸算法的優(yōu)點(diǎn)是算法描述簡潔易讀,通常遞歸函數(shù)中沒有循環(huán)語句,而在執(zhí)行過程中通過遞推和回歸實(shí)現(xiàn)其他算法用循環(huán)完成的功能。很多問題既可以用遞歸算法實(shí)現(xiàn),也可以用非遞歸算法實(shí)現(xiàn),是否選擇遞歸算法取決于所解決的問題及應(yīng)用的場合。3.4 默認(rèn)參數(shù)、內(nèi)聯(lián)函數(shù)及函數(shù)重載673
28、.4.1 默認(rèn)參數(shù)默認(rèn)參數(shù)指在定義或聲明函數(shù)時(shí)為形參指定默認(rèn)值。這樣的函數(shù)在調(diào)用時(shí),對(duì)于默認(rèn)參數(shù)可以給出實(shí)參值,也可以不給出實(shí)參值。在函數(shù)調(diào)用時(shí)如果給出實(shí)參,將實(shí)參值傳遞給形參。如果不給出實(shí)參,則函數(shù)形參使用該默認(rèn)值。以下程序的延時(shí)函數(shù)中使用了默認(rèn)參數(shù)。3.4 默認(rèn)參數(shù)、內(nèi)聯(lián)函數(shù)及函數(shù)重載683.4.2 內(nèi)聯(lián)函數(shù) 函數(shù)可以減少程序的目標(biāo)代碼,實(shí)現(xiàn)程序代碼的共享。但從前面函數(shù)調(diào)用機(jī)制可以知道,函數(shù)調(diào)用會(huì)產(chǎn)生額外的時(shí)空開銷。對(duì)于一些函數(shù)體代碼很短,但又被頻繁調(diào)用的函數(shù),就不能忽視這種開銷。以下程序段是讀人一行字符串,逐個(gè)判斷是否為數(shù)字字符。其中函數(shù)IsNumber(char ch)的作用是判斷參數(shù)
29、ch是否是數(shù)字字符。3.4 默認(rèn)參數(shù)、內(nèi)聯(lián)函數(shù)及函數(shù)重載693.4.2 內(nèi)聯(lián)函數(shù) 定義IsNumber函數(shù)的優(yōu)點(diǎn):一是提高程序可讀性,二是使這段代碼可以重復(fù)使用。但缺點(diǎn)也是顯而易見的:頻繁調(diào)用會(huì)降低程序的執(zhí)行效率。為了協(xié)調(diào)效率和可讀性之間的矛盾,C+提供了另一種方法,即內(nèi)聯(lián)函數(shù)。該方法是在定義函數(shù)時(shí)使用關(guān)鍵字inline加以修飾。語法形式如下:3.4 默認(rèn)參數(shù)、內(nèi)聯(lián)函數(shù)及函數(shù)重載703.4.3 函數(shù)重載 在C+中允許在同一作用域內(nèi),對(duì)功能相似、參數(shù)不同的若干個(gè)函數(shù)賦子相同的函數(shù)名,這就是函數(shù)重載。這里參數(shù)不同的含義是:參數(shù)個(gè)數(shù)不同,或者函數(shù)對(duì)應(yīng)參數(shù)的類型不同,或者個(gè)數(shù)、類型均不相同。編譯器在編
30、譯函數(shù)調(diào)用語句時(shí),會(huì)根據(jù)實(shí)參和形參的類型、個(gè)數(shù)進(jìn)行最佳匹配,確定具體調(diào)用哪一個(gè)函數(shù),這一過程成為綁定。C+編譯器按照以下步驟匹配重載函數(shù):(1)如果函數(shù)參數(shù)能嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù)。(2)按數(shù)據(jù)類型轉(zhuǎn)換規(guī)則將實(shí)參隱式轉(zhuǎn)換后,尋找匹配。如果匹配成功,調(diào)用該函數(shù)。(3)通過用戶定義的轉(zhuǎn)換尋找匹配的函數(shù)。3.5 全局與局部變量713.5.1 全局變量定義在函數(shù)之外的變量稱為全局變量。如果用戶在定義時(shí)不給出初始值,則自動(dòng)初始化為0。全局變量可定義在程序的任何位置,在該全局變量定義之后的任何位置都可以訪問。3.5.2 局部變量定義在函數(shù)體內(nèi)、某個(gè)塊內(nèi)的變量為局部變量。形式參數(shù)也屬于局部變量。局部變
31、量只能在函數(shù)體內(nèi)或塊內(nèi)訪問,在未被賦值或初始化的情況下,其值為隨機(jī)數(shù)。3.6 標(biāo)識(shí)符的作用域72 標(biāo)識(shí)符的作用域是指標(biāo)識(shí)符的有效范圍,標(biāo)識(shí)符的可見性是指標(biāo)識(shí)符是否可以被訪問,標(biāo)識(shí)符只在其作用域內(nèi)可見。標(biāo)識(shí)符的作用域主要包括局部作用域、文件作用域(即全局域)、函數(shù)原型作用域、類作用域、名字空間。本節(jié)介紹局部作用域、函數(shù)原型作用域和文件域。1.局部作用域 由“”括起來的程序段稱之為塊。在塊中定義的標(biāo)識(shí)符其作用域僅限于該塊,稱為局部作用域。如在函數(shù)、復(fù)合語句內(nèi)定義的局部變量、函數(shù)定義時(shí)的形參,都具有局部作用域,只在塊內(nèi)有效。3.6 標(biāo)識(shí)符的作用域732.函數(shù)原型作用域在進(jìn)行函數(shù)聲明時(shí),其形參作用域只
32、在函數(shù)聲明的形參表中,因此通常在函數(shù)聲明時(shí),可以只聲明形參的類型,不聲明形參名。若聲明形參名也不必與函數(shù)定義中的形參名相同。3.文件域文件域也稱為全局域。定義在所有函數(shù)之外的標(biāo)識(shí)符具有文件域,作用域?yàn)閺臉?biāo)識(shí)符定義處到文件結(jié)束處。文件中定義的全局變量具有文件域。由于在C+中不允許嵌套定義函數(shù),因此不存在局部函數(shù),所有函數(shù)都具有文件域。3.7 名字空間域74名字空間域是隨標(biāo)準(zhǔn)C+引人的。一個(gè)軟件往往是由多個(gè)模塊組合而成,其中包括由多個(gè)不同的程序員開發(fā)的組件及L+類庫提供的組件,這樣不同模塊對(duì)標(biāo)識(shí)符命名就有可能發(fā)生沖突,引起程序出錯(cuò)。這就是通常稱之為的全局名字空間污染。名字空間域的概念正是為了防止程
33、序中的全局實(shí)體名與C+各種類庫中聲明的全局實(shí)體名沖突而提出來的。一個(gè)名字空間域?qū)⒉煌臉?biāo)識(shí)符集合在一個(gè)命名作用域內(nèi)。這樣在不同的名字空間就可以使用相同的標(biāo)識(shí)符表示不同的對(duì)象,不會(huì)產(chǎn)生命名沖突。它相當(dāng)于一個(gè)更加靈活的文件域(全局域)。聲明一個(gè)名字空間域的語法為:3.7 名字空間域75聲明一個(gè)名字空間域的語法為:3.8 存儲(chǔ)類型76 說明標(biāo)識(shí)符時(shí)除了必須說明數(shù)據(jù)類型外,有時(shí)也需要說明存儲(chǔ)類型。對(duì)于變量來說,存儲(chǔ)類型決定了變量的存儲(chǔ)區(qū)域,即編譯器在不同區(qū)域?yàn)椴煌鎯?chǔ)類型的變量分配空間。由于存儲(chǔ)區(qū)域不同,變量的生存期也不同。生存期指的是變量從獲得空間到空間被釋放之間的時(shí)間。變量只有在生存期中,并且在其
34、作用域中才能被訪問。C+中與存儲(chǔ)類型相關(guān)的關(guān)鍵字有:autoregisterstaticextern3.8 存儲(chǔ)類型77塊內(nèi)定義的局部變量,如無任何存儲(chǔ)類型說明,其生存期開始于塊的執(zhí)行,終止于塊的結(jié)束,其原因是局部變量存放在棧中,塊開始執(zhí)行時(shí)系統(tǒng)為變量分配??臻g,塊執(zhí)行結(jié)束時(shí)系統(tǒng)釋放相應(yīng)的??臻g,因此局部變量的生存期和作用域是一致的。在C+98/C+03標(biāo)準(zhǔn)中,局部變量定義時(shí)可以在數(shù)據(jù)類型前加auto聲明存儲(chǔ)類型,稱為自動(dòng)類型,auto可以省略。1.auto3.8 存儲(chǔ)類型78register稱為寄存器類型,聲明的變量稱為寄存器變量,例如register int I;寄存器變量也是局部變量,在
35、塊內(nèi)定義。register說明僅能建議(而非強(qiáng)制)系統(tǒng)使用寄存器,以提高程序運(yùn)行速度。但寄存器有限,編譯器往往還是把這種變量放在內(nèi)存中。一般不提倡使用寄存器變量。C+11標(biāo)準(zhǔn)中,register關(guān)鍵字的用法已被廢棄。2. register3.8 存儲(chǔ)類型79用Static說明的變量稱為靜態(tài)變量。靜態(tài)變量和全局變量一樣也存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū)。如果程序未顯式地給出初始化值,那么系統(tǒng)將其初始化為0,且初始化只進(jìn)行一次;靜態(tài)變量的空間分配和初始化在編譯階段完成,占用的空間要到整個(gè)程序執(zhí)行結(jié)束時(shí)才釋放,具有靜態(tài)生存期。根據(jù)定義位置不同,靜態(tài)變量還可分為靜態(tài)局部變量和靜態(tài)全局變量。在函數(shù)或塊內(nèi)定義,稱為靜態(tài)局
36、部變量;在函數(shù)外定義,稱為靜態(tài)全局變量。靜態(tài)局部變量作用域是定義它的函數(shù)或塊,但程序運(yùn)行結(jié)束才釋放空間,其間靜態(tài)局部變量的值一直存在,不受函數(shù)調(diào)用和返回的影響。3. Static3.8 存儲(chǔ)類型80一個(gè)C+程序可以由多個(gè)源程序文件組成。多個(gè)源程序文件可以通過外部存儲(chǔ)類型的變量和函數(shù)來實(shí)現(xiàn)數(shù)據(jù)和操作的共享。在一個(gè)程序文件中定義的全局變量和函數(shù)默認(rèn)為外部的,其作用域可以延伸到程序的其他文件中。但其他文件如果要使用這個(gè)文件中定義的全局變量和函數(shù),則應(yīng)該在使用前用extern進(jìn)行外部聲明,表示該全局變量或函數(shù)不是在本文件中定義的。外部聲明通常放在文件的開頭(外部函數(shù)聲明總是省略extern)。語法格式
37、為:4. extern3.9 頭文件與多文件結(jié)構(gòu)81 編譯器在對(duì)源程序進(jìn)行編譯之前,首先要由預(yù)處理程序?qū)Τ绦蛭谋具M(jìn)行預(yù)處理。預(yù)處理程序提供了一組編譯預(yù)處理指令和預(yù)處理操作符。預(yù)處理指令實(shí)際上不是L+語言的一部分,它只是用來擴(kuò)充C+程序設(shè)計(jì)的環(huán)境。預(yù)處理指令可以根據(jù)需要出現(xiàn)在程序中的任何位置。在前面的程序中使用的“# include”就是一條文件包含預(yù)處理指令,其作用是將另一個(gè)源文件嵌人該指令處。這里iostream是在標(biāo)準(zhǔn)名字空間域std中定義的頭文件。3.9.1 頭大件3.9 頭文件與多文件結(jié)構(gòu)823.9.2 多大件結(jié)構(gòu)3.9 頭文件與多文件結(jié)構(gòu)83多文件結(jié)構(gòu)的優(yōu)點(diǎn)是:首先,可以避免重復(fù)性的
38、編譯,如果修改了個(gè)別函數(shù),那么只需重新編譯這些函數(shù)所在的文件即可;其次,將程序進(jìn)行合理的功能劃分后,更方便設(shè)計(jì)、調(diào)試和維護(hù)。另外,通常把相關(guān)函數(shù)放在一個(gè)文件中,這樣就形成了一系列按照功能分類的文件,便于其他程序文件引用。3.9.2 多大件結(jié)構(gòu)3.10 編譯預(yù)處理84編譯預(yù)處理是指在編譯源程序之前,由預(yù)處理器對(duì)源程序進(jìn)行一些加工處理,生成中間文件,然后再進(jìn)行編譯。預(yù)處理器是包含在編譯器中的預(yù)處理程序。編譯預(yù)處理指令一律以“#”開頭,每一條預(yù)處理指令單獨(dú)占用一行,行后不加分號(hào)。并且通常放在源程序文件的開始部分。C+提供的編譯預(yù)處理指令主要有以下三種:宏定義、文件包含和條件編譯。3.10 編譯預(yù)處理
39、85宏定義指令#define分為不帶參數(shù)和帶參數(shù)兩種。1.不帶參數(shù)的宏定義不帶參數(shù)的宏定義用來產(chǎn)生與一個(gè)標(biāo)識(shí)符對(duì)應(yīng)的字符串,格式為: 預(yù)處理后文件中只要是出現(xiàn)該宏名的地方均用其對(duì)應(yīng)的字符串代替。替換過程稱為宏替換或宏展開。例如,如果使用指令3.10.1 宕定義指令3.10 編譯預(yù)處理862.帶參數(shù)的宏定義帶參數(shù)的宏定義的形式與函數(shù)定義的形式相似,格式為:3.10.1 宕定義指令3.10 編譯預(yù)處理87文件包含用#include指令,預(yù)處理后將指令中指明的源程序文件嵌人#include指令位置處。# include指令有兩種格式:3.10.2 文件包含指令3.10 編譯預(yù)處理88 通常情況下,源
40、程序中的所有語句都將被編譯。但有時(shí)希望源程序中的某部分程序只在滿足某種條件時(shí)才被編譯,不滿足條件則不被編譯。這時(shí)就要使用條件編譯指令。條件編譯指令包括#if、 #else、 # ifdef、 # ifndef、 # endif等。條件編譯指令有兩類:一類是根據(jù)宏名是否定義來確定是否編譯某些程序段,另一類是根據(jù)表達(dá)式的值來確定被編譯的程序段。3.10.3 條件編譯指令3.10 編譯預(yù)處理892.用表達(dá)式的值作為編譯條件格式為:3.10.3 條件編譯指令THANKSC+程序設(shè)計(jì)第二版第4章 數(shù)組、指針及字符串4.1 數(shù)組93數(shù)組是同類型數(shù)據(jù)的有序集合。它由若干個(gè)元素組成,每個(gè)元素?cái)?shù)據(jù)類型都相同,在
41、內(nèi)存中占用相同大小的存儲(chǔ)單元。各元素具有明確的次序關(guān)系,且在內(nèi)存中連續(xù)存放。數(shù)組中的每一個(gè)元素都用數(shù)組名與若干個(gè)帶方括號(hào)的下標(biāo)表示。下標(biāo)的個(gè)數(shù)表示數(shù)組的維數(shù),數(shù)組可以是一維的,也可以是多維的。數(shù)組的維數(shù)和每一維的元素個(gè)數(shù)必須在定義數(shù)組時(shí)確定,在程序運(yùn)行時(shí)不能改變。4.1 數(shù)組944.1.1 一維數(shù)組1.一維數(shù)組的定義和存儲(chǔ)方式數(shù)組在使用前也必須先定義。語法格式為:其中:(1)數(shù)組元素的類型可以是void以外的任何類型。(2)數(shù)組名是用戶自定義的標(biāo)識(shí)符。在C+中數(shù)組名表示數(shù)組首元素在內(nèi)存中的地址,它是一個(gè)地址常量,因此數(shù)組名不能修改,不能作為左值出現(xiàn)。(3)常量表達(dá)式的值必須是unsignedi
42、nt類型的正整數(shù)或常變量,不能是變量。該值表示數(shù)組的大小,亦稱數(shù)組的長度,表示數(shù)組元素的個(gè)數(shù)。(4)是數(shù)組下標(biāo)運(yùn)算符,但是在數(shù)組定義時(shí)用來規(guī)定數(shù)組的長度。4.1 數(shù)組954.1.1 一維數(shù)組2.一維數(shù)組的初始化與定義普通變量時(shí)可以同時(shí)初始化一樣,定義一個(gè)數(shù)組時(shí)也可進(jìn)行初始化。例如: intf10=0,1,1,2,3,5,8,13,21,34;以上f數(shù)組已對(duì)全部數(shù)組元素初始化,也可以省略數(shù)組的長度,即:intf=0,l,1,2,3,5,8,13,21,34;編譯器會(huì)根據(jù)初始化值的個(gè)數(shù)自動(dòng)確定數(shù)組的長度。4.1 數(shù)組964.1.1 一維數(shù)組3.一維數(shù)組元素的引用對(duì)數(shù)組元素的訪問方法是通過下標(biāo)運(yùn)算符
43、,按元素在數(shù)組中的位置進(jìn)行訪問,稱為索引訪問或下標(biāo)訪問,格式如下:4.1 數(shù)組974.1.2 二維數(shù)組及多維數(shù)組數(shù)組不僅有一維數(shù)組,還有二維、三維甚至多維數(shù)組。一維數(shù)組可用來表示向量,二維數(shù)組可用來表示行列式或矩陣,例如可以用一個(gè)二維數(shù)組來存儲(chǔ)方程組的系數(shù)矩陣。而像玩具魔方這樣的立方體結(jié)構(gòu)就需要用三維數(shù)組來表示。1.二維及多維數(shù)組定義和存儲(chǔ)方式二維及多維數(shù)組定義的語法格式為:常量表達(dá)式1為數(shù)組第一維的長度(最高維),常量表達(dá)式2為數(shù)組第二維的長度,常量表達(dá)式n為數(shù)組第n維的長度(最低維)。4.1 數(shù)組984.1.2 二維數(shù)組及多維數(shù)組2.二維數(shù)組的初始化對(duì)于二維數(shù)組,其初始化有以下幾種形式:(
44、1)嵌套一維數(shù)組的初始化:int a34=1,3,5,7,2,1,6,8,3,;i,7,11;(2)按數(shù)組元素存儲(chǔ)次序列出各元素的值,并只用一個(gè)“”括起來,如:int a34=1,3,5,7,2,4,6,8,3,5,7, 11 ;(3)可以對(duì)部分元素賦初值,沒有明確初值的元素為0。如:int a34=1,3,2,,3,5,7;(4)可由初始化數(shù)據(jù)個(gè)數(shù)確定數(shù)組的最高維長度。如:int a 4=1,3,5,7,2,4,6,8,3,5,7, 11 ;4.1 數(shù)組994.1.2 二維數(shù)組及多維數(shù)組3.二維及多維數(shù)組元素的引用二維及多維數(shù)組元素的引用與一維類似,其語法形式為: 元素下標(biāo)表達(dá)式的個(gè)數(shù)取決于
45、數(shù)組的維數(shù),N維數(shù)組就有N個(gè)下標(biāo)表達(dá)式。二維及多維數(shù)組元素下標(biāo)的起止值、下標(biāo)表達(dá)式值的要求與一維數(shù)組完全相同。4.1 數(shù)組1004.1.3 數(shù)組作為函數(shù)參數(shù)數(shù)組元素和數(shù)組名都可以作為函數(shù)的參數(shù)實(shí)現(xiàn)函數(shù)間數(shù)組數(shù)據(jù)的傳遞和共享。由于數(shù)組元素和普通變量沒有區(qū)別,因此當(dāng)數(shù)組元素作為函數(shù)的實(shí)參時(shí),傳遞給形參的是數(shù)組元素的值。使用數(shù)組名作為函數(shù)的參數(shù),則實(shí)參和形參都應(yīng)該是數(shù)組名,且類型應(yīng)相同。由于數(shù)組名表示的是數(shù)組首元素的地址,所以函數(shù)形參得到的是實(shí)參數(shù)組首元素的地址,實(shí)參和形參地址值相同,因此被調(diào)函數(shù)中對(duì)形參數(shù)組的處理實(shí)際上就是對(duì)主調(diào)函數(shù)的實(shí)參數(shù)組的處理。4.1 數(shù)組1014.1.3 數(shù)組作為函數(shù)參數(shù)1
46、.一維數(shù)組作為函數(shù)參數(shù)4.1 數(shù)組1024.1.3 數(shù)組作為函數(shù)參數(shù)2.多維數(shù)組作為函數(shù)參數(shù)多維數(shù)組也可以作為函數(shù)參數(shù)。多維數(shù)組作為參數(shù),最高維長度可以不寫,但其他各維必須明確標(biāo)出。因?yàn)榫幾g器只要根據(jù)后面每一維(從第2維開始)的大小就可計(jì)算數(shù)組占用空間中每一個(gè)元素的存儲(chǔ)地址。對(duì)于多維數(shù)組,編譯器不檢查邊界,其實(shí)只是不檢查最高維(第1維)的邊界。4.1 數(shù)組1034.1.4 數(shù)組的應(yīng)用 數(shù)據(jù)排序是最常見的應(yīng)用,比如對(duì)學(xué)生考試成績進(jìn)行排序,對(duì)候選人得票數(shù)排序等。排序的方法有很多種,常用的有:冒泡法選擇法插入法4.2 指針1044.2.1 指針的概念指針是一種數(shù)據(jù)類型,指針類型的變量稱為指針變量。
47、對(duì)變量的訪問也就是對(duì)變量的存取有兩種方式:1.直接訪問 程序中按變量名訪問變量的方式是直接訪問。程序編譯后,變量名和變量地址之間就建立了對(duì)應(yīng)關(guān)系。程序中訪問變量,根據(jù)對(duì)應(yīng)關(guān)系,尋找到該地址,獲得該變量的值。2.間接訪問 變量的地址也可以放在另一個(gè)變量中,則存放該地址的變量稱為指針變量。訪問數(shù)據(jù)變量時(shí),先由指針變量獲得該數(shù)據(jù)變量的地址,再由數(shù)據(jù)變量地址實(shí)現(xiàn)對(duì)數(shù)據(jù)變量的存取,這稱為“間接訪問”。由于指針變量的值是另一個(gè)變量的地址,習(xí)慣上形象地稱指針變量指向該變量。指針變量也簡稱為指針。4.2 指針1054.2.2 指針變量的定義指針變量的定義格式如下:4.2 指針1064.2.3 指針變量的初始化
48、和運(yùn)算3.指針的算術(shù)運(yùn)算由于指針變量存放的都是內(nèi)存地址,所以指針的算術(shù)運(yùn)算都是整數(shù)運(yùn)算。一個(gè)指針變量可以加上或減去一個(gè)整數(shù)值,包括指針的+、-運(yùn)算。根據(jù)C+地址運(yùn)算規(guī)則,一個(gè)指針變量加(減)一個(gè)整數(shù)并不是簡單地將其地址量加(減)一個(gè)整數(shù),而是根據(jù)其所指的數(shù)據(jù)類型的長度,計(jì)算出指針最后指向的位置。例如,p+n實(shí)際表示的地址是:p指向的內(nèi)存單元的地址+n*sizeof(指針指向的數(shù)據(jù)類型)4.2 指針1074.2.3 指針變量的初始化和運(yùn)算4.指針的關(guān)系運(yùn)算指針可以進(jìn)行關(guān)系運(yùn)算。當(dāng)兩個(gè)指向相同類型數(shù)據(jù)的指針相等時(shí),就說明它們指向同一個(gè)內(nèi)存單元。在程序中經(jīng)常對(duì)指向同一個(gè)數(shù)組的兩個(gè)指針進(jìn)行小于、等于等
49、各種關(guān)系運(yùn)算。和指針相減情況相同,兩個(gè)指向同類型普通變量的指針進(jìn)行關(guān)系運(yùn)算也沒有任何意義。一個(gè)指針可以和NULL作相等或不等的關(guān)系運(yùn)算,用來判斷該指針是否為空。4.2 指針1084.2.4 指針作為函數(shù)參數(shù)指針作為函數(shù)的形參,在調(diào)用時(shí)實(shí)參將地址值傳遞給形參,使形參指針指向主調(diào)函數(shù)中的數(shù)據(jù)。這樣在被調(diào)函數(shù)中,通過形參指針對(duì)數(shù)據(jù)的訪問就是對(duì)主調(diào)函數(shù)中的數(shù)據(jù)進(jìn)行訪問。4.2 指針1094.2.5 指針數(shù)組如果數(shù)組的每個(gè)元素都是指針變量,稱該數(shù)組為指針數(shù)組。定義一維指針數(shù)組的語法格式為:常量表達(dá)式同樣指出數(shù)組元素的個(gè)數(shù),數(shù)據(jù)類型確定數(shù)組中每個(gè)元素的類型,即指針類型。4.2 指針1104.2.6 指針型
50、函數(shù)和函數(shù)指針1.指針型函數(shù)定義指針型函數(shù)的語法形式是:數(shù)據(jù)類型 *函數(shù)名(參數(shù)表) 函數(shù)體函數(shù)名前面的“*”表示該函數(shù)是一個(gè)指針型函數(shù),數(shù)據(jù)類型表明函數(shù)返回指針的類型。4.2 指針1114.2.6 指針型函數(shù)和函數(shù)指針2.函數(shù)指針在程序運(yùn)行時(shí),不僅數(shù)據(jù)要占據(jù)內(nèi)存空間,程序的代碼被調(diào)入內(nèi)存后也占據(jù)一定的空間。每一個(gè)函數(shù)都有函數(shù)名,C+規(guī)定這個(gè)函數(shù)名就表示函數(shù)代碼在內(nèi)存中的起始地址。由此看來,調(diào)用函數(shù)的形式“函數(shù)名(參數(shù)表)”的實(shí)質(zhì)就是“函數(shù)代碼首地址(參數(shù)表)”。指向函數(shù)的指針,簡稱函數(shù)指針,是用來存放函數(shù)代碼首地址的指針型變量。4.2 指針1124.2.6 指針型函數(shù)和函數(shù)指針函數(shù)指針名前的
51、圓括號(hào)是必需的。圓括號(hào)改變了運(yùn)算符的優(yōu)先級(jí),使得該標(biāo)識(shí)符首先被解釋為指針。函數(shù)指針在使用之前也要進(jìn)行賦值,使指針指向一個(gè)已經(jīng)存在的函數(shù)代碼的起始地址。語法為:使用函數(shù)指針調(diào)用函數(shù)有以下兩種語法形式:4.2 指針1134.2.7 用typedef簡化指針C+中是用關(guān)鍵字typedef定義一個(gè)標(biāo)識(shí)符來代表一種數(shù)據(jù)類型,它的主要用途是簡化復(fù)雜的類型說明,改進(jìn)程序的可讀性。typedef定義類型的語法格式為:4.3 指針與數(shù)組的關(guān)系114在C+中,指針和數(shù)組的關(guān)系十分密切。數(shù)組名代表數(shù)組在內(nèi)存中的首地址。圖4-10中,數(shù)組名f在表達(dá)式中被自動(dòng)轉(zhuǎn)換為一個(gè)指向數(shù)組首元素的指針常量。同樣通過指針也可以訪問數(shù)
52、組中的元素。這樣數(shù)組名可以用指針來代替,而且非常方便。4.3 指針與數(shù)組的關(guān)系1154.3.1 指針與一維數(shù)組從前面的介紹中已知,數(shù)組名表示數(shù)組首元素的地址。如定義:int f10,則f是數(shù)組名,也是數(shù)組首元素f0的地址,因此有以下等值關(guān)系:4.3 指針與數(shù)組的關(guān)系1164.3.2 指針與二維數(shù)組使用指針可以指向一維數(shù)組中的元素,也可以指向多維數(shù)組中的元素。但是在概念和使用上要比一維數(shù)組復(fù)雜得多。1.二維數(shù)組中元素的地址在C+中,對(duì)多維數(shù)組是一種嵌套定義,將二維及多維數(shù)組看成是“數(shù)組的數(shù)組”。例如,二維整型數(shù)組mat的定義為:4.3 指針與數(shù)組的關(guān)系1174.3.2 指針與二維數(shù)組4.3 指針
53、與數(shù)組的關(guān)系1184.3.2 指針與二維數(shù)組4.3 指針與數(shù)組的關(guān)系1194.3.2 指針與二維數(shù)組2.指向一維數(shù)組的指針從上面的討論中可以知道,二維數(shù)組名mat是其首元素mat0的地址,該地址的類型不是int*,而應(yīng)該是一個(gè)由6個(gè)int類型變量組成的一維數(shù)組的地址,即和int(*)6類型的指針等價(jià)。因此要定義一個(gè)指針指向mat,可以如下定義:p是一個(gè)指向由6個(gè)int類型變量組成的一維數(shù)組的指針,并指向mat的第一行mat0。稱p為數(shù)組指針。推而廣之,定義二維數(shù)組的指針變量的語法格式為:4.4 字符串1204.4.1 C風(fēng)格字符串1.字符串與字符數(shù)組C+中的字符數(shù)組可用來處理字符串,因此也允許
54、直接用字符串常量對(duì)字符數(shù)組進(jìn)行初始化。如果數(shù)組定義的長度大于初始化字符串的長度,多出的字符均為0。2.字符指針與字符串用指針處理字符串更方便,更靈活。例如,有如下說明語句: char*pstr=C+isaobject_orientedlanguage ;4.4 字符串1214.4.1 C風(fēng)格字符串3.字符串處理函數(shù)C+中對(duì)C風(fēng)格的字符串沒有提供進(jìn)行賦值、合并、比較的運(yùn)算符,但提供了許多字符串處理函數(shù)。使用這些函數(shù)時(shí)要包含頭文件cstring。下面討論幾個(gè)最常用的字符串處理函數(shù)。(1)字符串復(fù)制函數(shù) char * strcpy(char *t , constchar *s)(2)串連接函數(shù)cha
55、r * strcat(chart , constchar *s)(3)字符串比較函數(shù)intstrcmp(constchar *s1, constchar *s2)(4)字符串長度函數(shù)intstrlen(constchar *s)4.4 字符串1224.4.2 C+string類下面介紹string類型的常用方法。(1)定義string類型的對(duì)象。 stringstr; /建立空字符串str stringstr(“OK”); /建立字符串str,并用C風(fēng)格字符串初始化 stringstr1(str); /建立字符串str1,并用str初始化4.4 字符串1234.4.2 C+string類下面介
56、紹string類型的常用方法。(2)訪問string對(duì)象字符。 stri; /訪問str索引i的字符,不檢查是否出界 str.at(i); /訪問str索引i的字符,檢查是否出界4.4 字符串1244.4.2 C+string類下面介紹string類型的常用方法。(3)string類型的=、+及關(guān)系等運(yùn)算。與C風(fēng)格字符串不同,進(jìn)行這些運(yùn)算時(shí),不必考慮目標(biāo)串的長短,需要時(shí)系統(tǒng)會(huì)自動(dòng)為目標(biāo)串分配所需空間。str1=str2; /str2賦給str1str1+=str2; /str1和str2字符串首尾連接str1+str2; /返回一個(gè)字符串,它將str2的字符數(shù)據(jù)連接到str1的尾部str1=s
57、tr2;str1!=str2; /基于字典序比較的關(guān)系運(yùn)算,返回布爾值(4)string類型字符串的輸入/輸出。string類型輸入/輸出與C風(fēng)格字符串同樣方便,輸出使用cout和插入運(yùn)算符“”。4.4 字符串1254.4.2 C+string類(5)string類型提供了一些常用的函數(shù),以方便字符串處理。str.substr(pos,len); /返回str從pos位置起,長為len個(gè)字符的字串str.empty(); /檢查str是否為空字符串str.insert(pos,str2); /將str2插入str的pos位置處str.remove(pos,len); /從str位置pos處起,
58、刪除長度為len的子串str.find(str1); /返回str1首次在str中出現(xiàn)時(shí)的索引str.find(str1,pos); /返回str1首次在str中出現(xiàn)時(shí)的索引,從位置pos處起尋找str.length(); /返回str串長度str.append(str1); /和str+=str1等價(jià)str.assign(str1); /和str=str1等價(jià)pare(str1); /和str1比較,根據(jù)比較結(jié)果,返回1、0、-1str.swap(str1); /和str1交換4.5 動(dòng)態(tài)內(nèi)存分配126C+提供了這樣一種存儲(chǔ)空間分配技術(shù),能夠在程序運(yùn)行時(shí),根據(jù)實(shí)際需求,申請(qǐng)適量的內(nèi)存空間。當(dāng)
59、不再使用該內(nèi)存空間,再返還給操作系統(tǒng)。這種技術(shù)稱為動(dòng)態(tài)分配內(nèi)存。動(dòng)態(tài)內(nèi)存所占用空間在自由存儲(chǔ)區(qū)(也稱堆區(qū))。在C+中,申請(qǐng)和釋放自由存儲(chǔ)區(qū)中空間,分別使用new和delete這兩個(gè)運(yùn)算符來完成,使用的格式如下:4.5 動(dòng)態(tài)內(nèi)存分配1274.4.2 C+string類在C+中數(shù)組也可以動(dòng)態(tài)建立。對(duì)一維數(shù)組進(jìn)行動(dòng)態(tài)分配和撤銷的語法格式為:對(duì)多維數(shù)組進(jìn)行動(dòng)態(tài)分配語法格式如下:4.6 動(dòng)態(tài)數(shù)組實(shí)例小學(xué)生四則運(yùn)算測試程序1284.6.1 功能分析與算法設(shè)計(jì)小學(xué)生四則運(yùn)算測試程序的主要功能有:選擇測試類型、測試題數(shù)量和難度,程序隨機(jī)產(chǎn)生四則運(yùn)算題,供小學(xué)生自我測試。測試結(jié)束給出測試成績,并且顯示之前最高得
60、分記錄,如果當(dāng)前測試的得分超過最高得分記錄,則更新此記錄。學(xué)生也可以查看本次測試的所有題目和答題情況。算法描述如下:4.6 動(dòng)態(tài)數(shù)組實(shí)例小學(xué)生四則運(yùn)算測試程序1294.6.2 補(bǔ)充知識(shí)結(jié)構(gòu)體類型1.結(jié)構(gòu)體類型的定義其定義形式如下:THANKSC+程序設(shè)計(jì)第二版第5章 類與對(duì)象5.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述133對(duì)象、類和消息是面向?qū)ο蠹夹g(shù)的核心。1.對(duì)象在現(xiàn)實(shí)世界中,一切事物(實(shí)體)都可看成是面向?qū)ο蠹夹g(shù)中的對(duì)象。對(duì)象可以是有形的,比如汽車、計(jì)算機(jī);也可以是無形的,比如授課、計(jì)劃。對(duì)象可以是簡單的,比如一本教材,也可以是復(fù)雜的,如由許多元器件構(gòu)成的手機(jī)。任何一個(gè)對(duì)象都具有屬性和行為兩大特征。屬性
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學(xué)年安徽省池州市貴池區(qū)高二下學(xué)期期中教學(xué)質(zhì)量檢測語文試題(解析版)
- 普洱哈尼族彝族自治縣2025年重點(diǎn)中學(xué)小升初數(shù)學(xué)入學(xué)考試卷含解析
- 四川省成都市彭州中學(xué)2025年高三下學(xué)期開學(xué)收心考試物理試題含解析
- 山東省煙臺(tái)市棲霞市2024-2025學(xué)年高三沖刺模擬生物試題試卷含解析
- 南方醫(yī)科大學(xué)《馬克思主義民族理論與政策》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古自治區(qū)錫林郭勒盟太仆寺旗寶昌鎮(zhèn)第一中學(xué)2025屆高三聯(lián)測促改化學(xué)試題含解析
- 山西省榆社縣第二小學(xué)度上義務(wù)教育2025屆數(shù)學(xué)四年級(jí)第二學(xué)期期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 武漢鐵路橋梁職業(yè)學(xué)院《車橋耦合振動(dòng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西傳媒職業(yè)學(xué)院《食品分析基礎(chǔ)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 民辦合肥濱湖職業(yè)技術(shù)學(xué)院《Matlab》2023-2024學(xué)年第二學(xué)期期末試卷
- 《危險(xiǎn)化學(xué)品企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化規(guī)范》專業(yè)深度解讀與應(yīng)用培訓(xùn)指導(dǎo)材料之8:5管理要求-5.8作業(yè)安全(雷澤佳編制-2025A0)
- Unit6Integration(A-C)課件譯林版(2024)英語七年級(jí)下冊
- (二模)2024~2025學(xué)年度蘇錫常鎮(zhèn)四市高三教學(xué)情況調(diào)研(二)物理試卷(含答案)
- 期貨從業(yè)人員資格2024年筆試考試題庫含答案
- 比亞迪充電樁轉(zhuǎn)讓合同協(xié)議
- 事件網(wǎng)絡(luò)輿情傳播機(jī)制的建模與仿真-全面剖析
- 生態(tài)環(huán)境部信息中心招聘筆試真題2024
- 吉林重點(diǎn)項(xiàng)目-白山年產(chǎn)26000噸粉煤灰漂珠項(xiàng)目可行性研究報(bào)告
- 初中信息技術(shù)蘇科版(2023)七年級(jí)下冊第七單元 跨學(xué)科主題學(xué)習(xí)-絲綢之路公開課教案及反思
- 2025年高考語文作文預(yù)測52篇(含范文)
- 山西太原事業(yè)單位考試《行測》模擬題帶答案2023年
評(píng)論
0/150
提交評(píng)論