第5章構造數(shù)據(jù)類型2_第1頁
第5章構造數(shù)據(jù)類型2_第2頁
第5章構造數(shù)據(jù)類型2_第3頁
第5章構造數(shù)據(jù)類型2_第4頁
第5章構造數(shù)據(jù)類型2_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、c+語語言言程程序序設設計計教教程程第第11章章c+輸輸入入輸輸出出流流第第5 5章章 構造數(shù)據(jù)類型構造數(shù)據(jù)類型主講:尚明生 電子科技大學計算機學院 第第5 5章章構造數(shù)據(jù)類型構造數(shù)據(jù)類型1. 掌握枚舉類型的使用;2. 深入理解數(shù)組的概念, 掌握數(shù)組應用的一般方法;3. 深入理解指針的概念,掌握指針的使用;4. 注意指針與數(shù)組的區(qū)別,掌握多重指針以及指針與 數(shù)組的混合使用,合理應用動態(tài)數(shù)組;5. 理解字符串的概念,能夠靈活使用字符串;6. 理解引用的概念,掌握引用型函數(shù)參數(shù)的用法;7. 掌握結構與聯(lián)合類型的使用,并注意二者的區(qū)別。學習目標c+語語言言程程序序設設計計教教程程 第第5章章構構造造

2、數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型 1. 枚舉類型的定義:枚舉類型的定義: “枚舉枚舉”是指將變量所有可能的取值一一列舉出來,變量的取值只限于列舉出來的常量。 枚舉類型的聲明的一般形式如下 : 枚舉類型名以及枚舉常量為標識符,遵循標識符的取名規(guī)則。 在定義一個枚舉類型時,定義了多個常量,供枚舉類型變量取值,稱此常量為枚舉常量枚舉常量。當沒給各枚舉常量指定值時,其值依次默認為0、1、2、;在定義枚舉類型時,也可使用賦值另行指定枚舉常量的值。 enum 枚舉類型名 枚舉常量1, 枚舉常量2, 枚舉常量n;枚舉!枚舉!c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.

3、1 枚舉類型枚舉類型枚舉類型的定義:枚舉類型的定義:例1: enum weekday sun, mon, tue, wed, thu, fri, sat ; 定義了7個枚舉常量以及枚舉類型weekday。枚舉常量具有默認的整數(shù)與之對應:sun的值為0、mon的值為1、tue為2、sat為6。例2: enum city beijing,shanghai,tianjin=5,chongqing; 枚舉常量beijing的值為0,shanghai的值為1,tianjin的值指定為5。對于指定值后面的沒有指定值的枚舉常量,編譯器會將前一個常量值加1(下一個整數(shù))賦給它,所以chongqing的值為6。

4、c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的定義說明枚舉類型的定義說明: : 枚舉類型定義了以后就可以使用枚舉常量、使用用枚舉類型來定義變量,定義枚舉變量的方法與定義其它變量的方法一樣。 例如: enum city city1, city2; city city1, city2; 用兩種不同方法定義了city1、city2兩個枚舉類型的變量名。 枚舉類型變量也可以在定義枚舉類型的同時定義 例如: enum city beijing,shanghai,tianjin=5,chongqing city1, city2; 在定義枚舉類型的

5、同時定義枚舉類型變量可以省略枚舉類型名 例如: enum beijing,shanghai,tianjin=5,chongqing city1, city2; 在定義變量時,可以順便給出初值,若不給初值,默認初值為隨機的無意義的數(shù)。 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的使用:枚舉類型的使用:用枚舉類型建立枚舉變量后就可以對枚舉變量實施賦值以及進行其它運算了,對枚舉變量進行賦值,其值要求為同一枚舉類型要求為同一枚舉類型。否則,在編譯時出錯。 例如: weekday d1,d2,d3,d4; d1=sun; d2=6; /錯誤

6、d3=shanghai; /錯誤 其中對d2所賦之值是整數(shù)6,不是枚舉常量;可以采用將一個整型值強制轉(zhuǎn)換成同類型的枚舉常量賦給枚舉變量。枚舉常量、枚舉類型的變量可進行算術運算、關系運算可進行算術運算、關系運算。 對枚舉類型實施算術、關系運算時,枚舉值轉(zhuǎn)換成整型值參加運算,結果為整型值。所以,如果要將結果賦給枚舉變量,還要將結果轉(zhuǎn)換成枚舉值。 例如: d1=d1+2; /是錯誤的,因為結果為int型。 需要將它強制轉(zhuǎn)換強制轉(zhuǎn)換成枚舉型: d1=(weekday)(d1+2);c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.1 枚舉類型枚舉類型枚舉類型的使用:枚舉類型的

7、使用: 枚舉常量、枚舉類型的變量可直接進行各種形式的關系運算可直接進行各種形式的關系運算。 例如: if(city1=3) ; if(city2=beijing); if(shanghai=1); if(city1sun); 枚舉類型變量不能直接進行輸入不能直接進行輸入 例如: cind1; /錯誤c+語語言言程程序序設設計計教教程程 第第4章章函函數(shù)數(shù)f注意注意: : 枚舉常量是常量,不是變量,所以不能對枚舉常量進行賦值。 例如: 在上例中不能進行賦值 shanghai=beijing; 枚舉常量的值不是列舉的字符串,其值為整數(shù)。 編譯器對賦給枚舉變量的對象(數(shù))進行類型檢查,如類型不相符則

8、發(fā)出警告。 當類型相 同,而值超出此類枚舉類型枚舉常量范圍時,也是正常的。123456789101112/* 程序名:p5_1.cpp * 功能: 枚舉類型的使用,輸入城市代號,輸出城市名稱 */#includeusing namespace std;enum city beijing,shanghai,tianjin=6,chongqing;int main() int n; coutinput a city number (beijing-1 to exit):n;枚舉類型枚舉類型定義定義c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型【例【例5-15-1】輸入城市

9、代號,輸出城市名稱。 5.1 枚舉類型枚舉類型131415161718192021222324 while(n=beijing) switch(n) case beijing: coutbeijingendl; break; case shanghai: coutshanghaiendl;break; case tianjin: couttianjinendl; break; case chongqing: coutchongqingendl; break; default: coutinvalid city number! n; return 0; input a city number (

10、-1 to exit):1shanghai8invalid city number!-1 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型枚舉類型的使用枚舉類型的使用5.1 枚舉類型枚舉類型5.2 數(shù)組數(shù)組 數(shù)組:數(shù)組: 數(shù)組是一組在內(nèi)存中依次連續(xù)存放依次連續(xù)存放的、具有同一類同一類型型的數(shù)據(jù)變量所組成的集合體。其中的每個變量稱為數(shù)組元素,它們屬于同一種數(shù)據(jù)類型,數(shù)組元素用數(shù)組名與帶方括號的數(shù)組下標下標一起標識。數(shù)組可以是一維的,也可以是多維的。特點:特點: 若干個同類型若干個同類型的數(shù)據(jù)元素,并且各個數(shù)據(jù)元素之間存在某種次序關系次序關系。這類數(shù)據(jù)有一個共同的特點:它們

11、有若干個同類型的數(shù)據(jù)元素,并且各個數(shù)據(jù)元素之間存在某種次序關系。 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 一維數(shù)組定義的一般形式為:一維數(shù)組定義的一般形式為: 說明:說明: 數(shù)組元素的類型可以是void型以外的任何一種基本數(shù)據(jù)類型,也可以是已經(jīng)定義過的構造數(shù)據(jù)類型; 數(shù)組名是用戶自定義的標識符,用來表示數(shù)組的名稱,代表數(shù)組元素在內(nèi)存中的起始地址,是一個地址常量。 常量表達式必須是unsigned int類型的正整數(shù)。表示數(shù)組的大小或長度,也就是數(shù)組所包含數(shù)據(jù)元素的個數(shù)。 是數(shù)組下標運算符,在數(shù)組定義時用來限定數(shù)組

12、元素的個數(shù)。數(shù)據(jù)類型 數(shù)組名常量表達式;c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型f注意注意: : 數(shù)組屬于構造數(shù)據(jù)類型,在使用之前必須先進行類型定義。5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 數(shù)組元素的類型可以是void型以外的任何一種基本數(shù)據(jù)類型,也可以是已經(jīng)定義過的構造數(shù)據(jù)類型; 例如:下面定義了2個不同類型的數(shù)組: int a5; /定義了一個5個元素的整型數(shù)組a weekday b10; /定義了一個10個元素的枚舉數(shù)組b,weekday 為已定義的枚舉型。 數(shù)據(jù)類型相同的多個數(shù)組可以在同一條語句中予以定義。例如: int a110, a220;

13、 /同時定義了兩個整型數(shù)組 數(shù)據(jù)類型相同的的簡單變量和數(shù)組也可以在一個語句中定義。例如: int x, a20; /同時定義了一個整型變量和一個整型數(shù)組 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 數(shù)組定義之后,系統(tǒng)會將從內(nèi)存中為其分配一塊連續(xù)的存儲空間一塊連續(xù)的存儲空間,從第1個數(shù)據(jù)元素開始依次存放依次存放各個數(shù)組元素。例如,定義的數(shù)組a其內(nèi)存排列(分配)示意圖如圖5-1所示。 例如: int a5; /定義了一個5個元素的整型數(shù)組a c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型 假設地

14、址 內(nèi)容 符號地址 103410a0 103410a4 103410a8 103410ac 103410b0 a a+1 a+2 a+3 a+4 5*sizeof(int) a0 a1 a2 a3 a4 5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 一維數(shù)組初始化:一維數(shù)組初始化: 是指在定義數(shù)組的同時給數(shù)組中的元素賦值。其一般語法形式為:其一般語法形式為: 初值1,初值2, 初值n稱為初值表,初值之間用逗號,分隔, 所有初值用 括起來。 初值可以是一個變量表達式變量表達式,初值與數(shù)組元素的對應關系是:初值i給數(shù)組第i個元素;所以,初值個數(shù)n不能超過數(shù)組的大小。 若初值表中初值個數(shù)(項數(shù))

15、小于數(shù)組的大小,則未指定值的數(shù)組元素被賦值為0 0;但初值表中項數(shù)不能為0。例如: weekday b10=mon,wed,fri; 當對全部數(shù)組元素賦初值時,可以省略數(shù)組的大小可以省略數(shù)組的大小,此時數(shù)組的實際大小就是初值列表中初值的個數(shù)。例如: char str = a, b, c, d, e ; /數(shù)組str的實際大小為5。 在函數(shù)中定義數(shù)組時,如果沒有給出初值表,數(shù)組不被初始化,其數(shù)組元素的值為隨機值隨機值;在函數(shù)外定義數(shù)組如果沒有初始化,其數(shù)組元素的值為0。 數(shù)組初值表的可以用一個逗號逗號結尾,其效果與沒有逗號一樣。 數(shù)據(jù)類型 數(shù)組名 常量表達式 =初值1, 初值2, 初值n;c+語

16、語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 對一維數(shù)組實施的存取操作有兩類:存取數(shù)組元素存取數(shù)組元素與讀取數(shù)組元素讀取數(shù)組元素的地址的地址。數(shù)組元素是通過數(shù)組名及下標來標識的,這種帶下標的數(shù)組元素也稱為下標變量下標變量,下標變量可以象簡單變量一樣參與各種運算。 存取一維數(shù)組元素的一般語法形式為: 說明:說明: 下標表達式可以是變量表達式變量表達式,用來標識數(shù)組元素;不同于數(shù)組定義時用來確定數(shù)組長度的常量表達式。 當定義了一個長度為n的一維數(shù)組a,c+規(guī)定數(shù)組的下標從從0 0開始開始,依次為0、1、2、3、n-1。對應的數(shù)組

17、元素分別是a0、a1、an-1,因此下標表達式的值要在0,n-1范圍內(nèi)。例如: a1+2=100; / 將數(shù)組a的第4個元素賦值100。 數(shù)組名 下標表達式; c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 【例【例5-25-2】學生成績排序。分析分析:學生成績由鍵盤輸入,當輸入一個負數(shù)時,輸入完畢。 采用直觀的“選擇排序法選擇排序法”進行排序,基本步驟如下: 將a0依次與a1an-1比較,選出大者與a0交換;最后a0為 a0an-1中最大者; 將a1依次與a2an-1比較,選出大者與a1交換;最后a1為 a1an-1中

18、最大者; 同理,從i=2到i=n-1, 將ai依次與ai+1an-1比較,選出較大 者存于ai中。c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型123456789101112131415161718/* p5_2.cpp * 數(shù)組應用-選擇排序 */#includeusing namespace std;int main() const int maxn=5; int n,amaxn,i,j; for (n=0;nan; /輸入數(shù)組元素 if (an0) break; for (i=0;in;i+) coutai,t; coutnnendl;數(shù)組定義數(shù)組定義數(shù)組使用數(shù)

19、組使用c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型1920212223242526272829303132 /對數(shù)組元素逐趟進行選擇排序 for (i=0;in-1;i+) for (j=i+1;jn;j+) /從待排序序列待排序序列中選擇一個最大的數(shù)組元素 if (aiaj) int t; t=ai; /交換交換數(shù)組元素 ai=aj; aj=t; for (i=0;in;i+)coutai“,t”; /顯示排序結果 return 0; 80 90 95 70 -195 90 80 70 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2

20、.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 4. 4. 數(shù)組的地址數(shù)組的地址 數(shù)組元素的地址通過數(shù)組名通過數(shù)組名來讀取,其格式如下: 由于其地址不是實際的地址值不是實際的地址值,稱這個地址表達式為符號地址表達符號地址表達式式。例如: 一維數(shù)組元素a5的符號地址表達式為a+5。 若a是一個int型數(shù)組,數(shù)組的符號地址表達式a+n所表達的地址是第n+1個元素an的地址,代表的實際地址值為:a+n*sizeof(int) 而不是:a+n。 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組名+整型表達式;5.2.1 一維數(shù)組定義與使用一維數(shù)組定義與使用 c+語語言言程程序序

21、設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型f使用數(shù)組要使用數(shù)組要注意注意: : 在使用數(shù)組時最常犯的錯誤是數(shù)組元素越界,包括上標越界和下標越界。上標越界是指數(shù)組元素的訪問地址值超過了數(shù)組的起始地址;下標越界是指數(shù)組元素的訪問地址越過了數(shù)組中最后一個數(shù)組元素的地址。對于這種錯誤,編譯器無法知道,往往在運行時出錯。因此在程序設計時應格外注意。 數(shù)組名是一個地址常量,不能作為左值(賦值的目標)。因此,不能將一個數(shù)組整體拷貝給另外一個數(shù)組。 例如: int a5,c5,i; a=c;/錯誤! 正確的方法是將對應的元素進行拷貝,見下列程序段: for(i=0;i5;i+) ai=ci; /將數(shù)

22、組c中元素的值拷貝到數(shù)組c的對應元素中 在函數(shù)中,可以將一個一維數(shù)組作為函數(shù)的形式參數(shù),用來接受一個一維數(shù)組傳遞過來的地址。 5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 二維數(shù)組的定義的一般形式為: 其中: 常量表達式1為第1維的元素的個數(shù),常量表達式2為第2維元素的個數(shù)。 二維數(shù)組amn是以長度為n的一維數(shù)組為元素的數(shù)組,因此,等價于如下定義方式:例如: int m23; 定義了一個整型二維數(shù)組m,數(shù)組m也可以用下列方式定義: typedef int m13; / 定義了一個一維整型數(shù)組m1; m1 m2; / 以m1為類型定義數(shù)組m數(shù)據(jù)類型 數(shù)組名常量表達式2常量表達式1; c+

23、語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型typedef 數(shù)據(jù)類型 一維數(shù)組名常量表達式1;一維數(shù)組名 二維數(shù)組名常量表達式2;5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 如果一維數(shù)組描述排列成一行一行的數(shù)據(jù),那么,二維數(shù)組則描述若干行這樣的數(shù)據(jù)。因此,二維數(shù)組可以看作是數(shù)學上的一個矩陣。第1維元素個數(shù)為矩陣的列數(shù),第2維元素個數(shù)為矩陣的行數(shù)。 二維數(shù)組的定義格式可以寫成: 定義一個二維數(shù)組后,系統(tǒng)為它分配一塊連續(xù)連續(xù)的內(nèi)存空間。 二維數(shù)組amn占內(nèi)存空間的計算公式為: 數(shù)據(jù)類型 數(shù)組名行數(shù)列數(shù); c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)

24、據(jù)據(jù)類類型型sizeof(數(shù)組名);或 m*sizeof(a0); 或 m*n*sizeof(數(shù)據(jù)類型)5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 既然一個二維數(shù)組是由若干個一維數(shù)組排列構成,二維數(shù)組在內(nèi)存中的排列順序為:先順序排列每個一維元素先順序排列每個一維元素, ,構成一維數(shù)組構成一維數(shù)組;再將各個一維數(shù)組順序排列,構成二維數(shù)組。 int m23的排列順序為:先先將3個int元素排列組成2個一維數(shù)組m0, m1。 m0:m00,m01,m02 m1:m10,m11,m12 再再將2個一維數(shù)組排成一個二維數(shù)組。 m: m0, m1 數(shù)組m在內(nèi)存中的排列圖如圖所示。c+語語言言程程

25、序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型 實際地址 內(nèi)容 符號地址 103b2000 m00 m, m0 103b2004 m01 m0+1 103b2008 m02 m0+2 103b200c m10 m1 103b2010 m11 m1+1 103b2014 m12 m1+2 5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用 二維數(shù)組的初始化二維數(shù)組的初始化 :其中初值表具有兩種形式:嵌套的初值表,線性初值表。 (1)(1) 嵌套初值表嵌套初值表以二維數(shù)組mmn為例,嵌套初值表的格式為: 嵌套初值表由一維初值表嵌套構成,各層構成規(guī)則與一維數(shù)組的初值表相同。 例如: in

26、t m34=1,2,3,4,3,4,5,6,5,6,7,8; /m數(shù)組元素被全部初始化 int a23=1,0,0,1; /初始化了部分數(shù)組元素 int b3=1,2,3,; /初始化了全部數(shù)組元素 int d3=1,3,5,5,7,9; /初始化了全部數(shù)組元素,省略了高維元素個數(shù) 數(shù)據(jù)類型 數(shù)組名 常量表達式2常量表達式1=初值表; c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型m的初值表=m0初值表,m1初值表,mm-1初值表mi初值表=mi0初值表, mi1初值表,min-1初值表;i從0到m-1;5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用(2 2)線

27、形初值表)線形初值表 線形初值表與一維數(shù)組的初值表相同,初值表的項數(shù)不超過各維元素個數(shù)的乘積(總元素個數(shù))。 數(shù)組元素按內(nèi)存排列順序依次從初值表中取值,下列各數(shù)組使用了線形初值表,結果與使用嵌套初值表相同。 例如: int m34=1,2,3,4,3,4,5,6,5,6,7,8; /m數(shù)組元素被全部初始化 int a23=1,0,0,0,1,1; /初始化了全部數(shù)組元素, 一部分元素未給初值 int b 3=1,0,0,0,0,0; /初始化了全部數(shù)組元素, 省略了高維元素個數(shù) 當使用線形初值表而省略高維元素個數(shù)時,高維元素個數(shù)為: 例如: int b 3=1,0,0,0;/高維元素個數(shù)為2c

28、+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型 向上取整數(shù)(線形初值表項數(shù)/低維元素個數(shù)) 5.2.2 二維數(shù)組的定義與使用二維數(shù)組的定義與使用(3 3)二維數(shù)組的存取)二維數(shù)組的存取 存取維數(shù)組元素的格式為: 說明:說明: 行下標表達式與列下標表達式的值同樣從0開始,aij表示數(shù)組的第i+1行、第j+1列的元素。由于數(shù)組元素是變量,可以對其進行各種各種操作。 數(shù)組元素如果定義數(shù)組amn, 即數(shù)組第1維大小為n, 第2維大小為m。aij的排列位置與在內(nèi)存中的地址計算公式如下: 例如: a, a0: 為數(shù)組a的起始地址, 即a00的地址; ai+j: 為數(shù)組的第i+1行的

29、第j+1元素的地址,即aij的地址; c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組名 行下標表達式 列下標表達式aij的排列位置=第1維大小n*i+j+1;aij的地址=a的起始地址+(第1維大小n*i+j)*sizeof(數(shù)據(jù)類型)1234567891011121314151617181920/* p5_3.cpp * 求學生多門功課的總分,并求所有學生各門功課的平均分 */#includeusing namespace std;int main() const int maxn=100,coursen=5; int n,scoremaxncoursen+1=

30、0; float avercoursen+1=0; for (n=0;nmaxn;n+) /輸入學生成績 for(int j=0;jscorenj; if (scoren00) break; /輸入-1,結束輸入 for (int i=0;in;i+) /計算每個學生的總分 for(int j=0;jcoursen;j+) scoreicoursen=scoreicoursen+scoreij; 二維數(shù)組定義二維數(shù)組定義并初始化并初始化二維數(shù)組使用二維數(shù)組使用c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型21222324252627282930313233343636

31、3738 for (int j=0;jcoursen+1;j+) /計算每門課程的平均分 for (int i=0; in; i+) averj=averj+scoreij; averj=averj/n; for (i=0;in;i+) /輸出每個人的成績與總分 for(int j=0;jcoursen+1;j+) coutscoreijt; coutendl; cout-endl; for (i=0;icoursen+1;i+) /輸出每門功課的平均分 coutaverit; coutendl; return 0; 70 71 72 73 7482 83 84 85 8692 93 94 9

32、5 96-1 0 0 0 070 71 72 73 74 36082 83 84 85 86 42092 93 94 95 96 470-81.3333 82.3333 83.3333 84.3333 85.3333 416.667 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.3 多維數(shù)組多維數(shù)組 (1 1)三維以及高于三維的數(shù)組稱為多維數(shù)組)三維以及高于三維的數(shù)組稱為多維數(shù)組 多維數(shù)組的定義與二維數(shù)組類似,可以一次定義,也可以逐步由低維數(shù)組定義。 例如: int b234; /定義了一個三維數(shù)組 也可用下列方式步定義: typedef int b134;

33、b1 b2; 多維數(shù)組在內(nèi)存的排列方式同樣是先排低維數(shù)組,由低向高依次排列由低向高依次排列。如:b234的排列順序為: b00:b000,b001,b002,b003 b0 b01:b010,b011,b012,b013b b02:b020,b021,b022,b023 b10:b100,b101,b102,b103 b1 b11:b110,b111,b112,b113 b12:b120,b121,b122,b123c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.3 多維數(shù)組多維數(shù)組 (2)多維數(shù)組的初始化與存?。┒嗑S數(shù)組的初始化與存取 多維數(shù)組的初始化形式與二

34、維數(shù)組類似:有嵌套初值表、線性初值表兩種形式。使用線性初值表初始化時,數(shù)組元素按內(nèi)存排列順序依次從初值表中取值。 對多維數(shù)組進行存取包括對數(shù)組元素的存取和對數(shù)組元素的地址的讀取,當一個多維數(shù)組的下標數(shù)與維數(shù)相同時,為對數(shù)組元素的存取。 當下標個數(shù)小于維數(shù)時表示的是一個地址,表示地址時,下標也不能越界。 如:下列都是b234的地址表達式。 b1; /b100的地址; b2; /錯誤,下標越界; b0+1; /與b01相同,b010的地址。 b12; /b120的地址 b12+4; /b124的地址,但數(shù)組b中沒有b124這個元素, 故指向了其它地方。 c+語語言言程程序序設設計計教教程程 第第5

35、章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型123456789101112131415161718/* 5_4.cpp * 多維數(shù)組的各種地址表達式 */#includeusing namespace std;int main() const int k=3,m=4,n=5; int k=2,m=3,n=4; short int bkmn; coutadd of b: &b=&bendl; cout b=bendl; cout &b000=&b000endl; coutadd of bk: &bk=&bkendl; cout bk=bkendl; cout b+k =(b+k)endl; cout &b0+k

36、=(&b0+k)endl; cout &bk00=&bk00endl;c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型1920212223242526272829303132coutadd of bkm: &bkm=&bkmendl;cout bkm=bkmendl;cout bk+m =(bk+m)endl;cout &b00+k*m+m=(&b00+k*m+m)endl;cout &bkm0=&bkm0endl;cout &b00+(k*sizeof(b0)/sizeof(b00)+m=;cout(&b00+(k*sizeof(b0)/sizeof(b00)+m)e

37、ndl;coutadd of bkmn: &bkmn=&bkmnendl;cout bkm+n=(bkm+n)endl;cout &b000+k*m*n+m*n+n=(&b000+k*m*n+m*n+n)endl;cout &b000+(sizeof(b0)*k+sizeof(b00)*m)/sizeof(b000)+n=;cout(&b000+(sizeof(b0)*k+sizeof(b00)*m)/sizeof(b000)+n)endl;return 0; add of b: &b=0012fef0add of b: &b=0012fef0 b=0012fef0 b=0012fef0 &b

38、000=0012fef0 &b000=0012fef0add of bk: &bk=0012ff40add of bk: &bk=0012ff40 bk=0012ff40 bk=0012ff40 b+k =0012ff40 b+k =0012ff40 &b0+k=0012ff40 &b0+k=0012ff40 &bk00=0012ff40 &bk00=0012ff40add of bkm: &bkm=0012ff5eadd of bkm: &bkm=0012ff5e bkm=0012ff5e bkm=0012ff5e bk+m =0012ff5e bk+m =0012ff5e &b00+k &

39、b00+k* *m+m=0012ff5em+m=0012ff5e &bkm0=0012ff5e &bkm0=0012ff5e &b00+(k &b00+(k* *sizeof(b0)/sizeof(b00)+m=0012ff5esizeof(b0)/sizeof(b00)+m=0012ff5eadd of bkmn: &bkmn=0012ff66add of bkmn: &bkmn=0012ff66 bkm+n=0012ff66 bkm+n=0012ff66 &b000+k*m*n+m*n+n=0012ff66 &b000+(sizeof(b0)*k+sizeof(b00)*m)/sizeof

40、(b000)+n=0012ff66 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.4 數(shù)組與函數(shù)數(shù)組與函數(shù) 數(shù)組名數(shù)組名是一個地址,不能當作一個左值,但是可以作為函數(shù)的形參,接受實參傳送來的地址。當形參接受實參傳送來的地址后,形參數(shù)組與實參共享內(nèi)存中的一塊空間共享內(nèi)存中的一塊空間。函數(shù)體通過形參對數(shù)組內(nèi)容的改變會直接作用到實參上。 數(shù)組名作為形參是數(shù)組應用的一個重要方面。 注意注意: (1)(1)使用數(shù)組名傳遞地址時,雖然傳遞是地址,但形參與實參的地址 (數(shù)組)類型應一致類型應一致。 (2)(2)形式參數(shù)中數(shù)組元素個數(shù)沒有給定沒有給定,因此,在函數(shù)體中,對數(shù)組

41、存取的下標可以為任意值而不會出現(xiàn)編譯錯誤。但是,當這個下標超過超過了實參數(shù)組的元素個數(shù)范圍時,存取的就不是實參數(shù)組中的內(nèi)容了。 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型123456789101112131415161718192021/* 5_5.cpp * 利用對一個多維數(shù)組的某列排序的函數(shù), * 將學生某門功課的成績分班級排序 */#includeusing namespace std;const col=5;enum dir asc,des;void sort(int acol, int n, int cn, dir d) /排序 int tcol; /用

42、于暫存一行數(shù)據(jù) for (int i=0;in-1;i+) for (int j=i+1;jn;j+) /從待排序序列中選擇一個最大(小)的數(shù)組元素 if (aicnajcn&d=asc) memcpy(t,ai,sizeof(t); /交換數(shù)組行 memcpy(ai,aj,sizeof(t); memcpy(aj,t,sizeof(t); c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組作為函數(shù)形式參數(shù)數(shù)組作為函數(shù)形式參數(shù) 222324252627282930313233343536373839404142 43int main() const coursen=5

43、; int n,scorecoursen=20060101, 1, 82, 86, 0, 20060203, 2, 80, 80, 0, 20060204, 2, 86, 90, 0, 20060205, 2, 90, 83, 0, 20060102, 1, 75, 86, 0; n=sizeof(score)/sizeof(score0); for (int i=0;in;i+) /計算每個學生的總分 for(int j=2;jcoursen-1;j+) scoreicoursen-1=scoreicoursen-1+scoreij; sort(score,n,4,des); /按總分降序排

44、序 sort(score,n,1,asc); /按班號的升序排序 for (i=0;in;i+) /輸出每個人的成績與總分 for(int j=0;jcoursen;j+) coutscoreijt; coutendl; return 0; 20060101200601011 18282868616816820060102200601021 17575868616116120060204200602042 28686909017617620060205200602052 29090838317317320060203200602032 280808080160160 c+語語言言程程序序設設計

45、計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型數(shù)組作為函數(shù)形式參數(shù)數(shù)組作為函數(shù)形式參數(shù) 5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 存放字符型數(shù)據(jù)的數(shù)組稱為字符數(shù)組字符數(shù)組。字符數(shù)組也分為一維數(shù)組和多維數(shù)組。 前述的數(shù)組的定義及初始化同樣適用于字符數(shù)組,除此以外,c+對字符數(shù)組的初始化還可以使用字符串形式。 1.1.用字符進行初始化用字符進行初始化 例如: char s1 =c,h,i,n,a; char s2 4=h,o,w,a,r,e,y,o,u; 2.用字符串進行初始化用字符串進行初始化 例如: char s3 =china; char s4 4=how, are, you; c+語語

46、言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型3. 3. 字符數(shù)組的使用字符數(shù)組的使用 字符數(shù)組也是數(shù)組,我們同樣可以通過數(shù)組名及下標引用數(shù)組中的元素。 為方便對字符與字符串的處理,c+提供了許多專門處理字符與字符串的函數(shù),這些函數(shù)原型在各自的頭文件中定義。 下表列出了常用的字符與字符串處理函數(shù)的調(diào)用方法與功能簡介,函數(shù)原形與詳細的功能可以從c+編譯器的幫助文檔中獲得。函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法strlen(字符串)返回字符串的長度(不包括0) cstring strset(字符數(shù)組, 字符c)將字符數(shù)組中的所有字符都設為指定字符c, 并以0

47、結尾strlwr(字符串)將字符串中的所有字符轉(zhuǎn)換成小寫字符strupr(字符串)將字符串中的所有字符轉(zhuǎn)換成大寫字符strcmp(串s1, 串s2)比較兩個字符串的大小,即按從左到右的順序逐個比較對應字符的ascii碼值。若s1大于s2,返回1;若s1小于s2,返回-1;若s1等于s2,返回0。串s1、s2可以是字符串常量c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 常用字符與字符串處理函數(shù)常用字符與字符串處理函數(shù)函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法函數(shù)的用法 strcpy(串s1, 串s2) 將字符串s2拷

48、貝到s1所指的存儲空間中,然后返回s1。 其中, 串s2可以是字符串常量 cstring strcat(串s1, 串s2)返回字符串的長度(不包括0) ctype toupper(字符)將字符數(shù)組中的所有字符都設為指定字符c, 并以0結尾tolower(字符)將字符串中的所有字符轉(zhuǎn)換成小寫字符cstdlibatoi(字符串)將字符串中的所有字符轉(zhuǎn)換成大寫字符atol(字符串)比較兩個字符串的大小,即按從左到右的順序逐個比較對應字符的ascii碼值。若s1大于s2,返回1;若s1小于s2,返回-1;若s1等于s2,返回0。串s1、s2可以是字符串常量 atof(字符串)將字符串s2拷貝到s1所指

49、的存儲空間中,然后返回s1。 其中, 串s2可以是字符串常量 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.2.5 字符數(shù)組與字符串字符數(shù)組與字符串 常用字符與字符串處理函數(shù)常用字符與字符串處理函數(shù)12345678910111213141516171819/* p5_6.cpp * 字符串排序與查找 */#includeusing namespace std;const namelen=20;void order(char namenamelen,int n)/字符串排序 char tempnamelen; for(int i=0;in-1;i+)/選擇排序 fo

50、r(int j=i+1;j0)/比較兩個字符串的大小 strcpy(temp,namei);/字符串交換 strcpy(namei,namej); strcpy(namej,temp); c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型2021222324252627282930313233343536373839404142434445int find(char namenamelen,int n,char searchnamenamelen) for(int i=0;i0) /未找完,但找不到,返回0 return 0; return 0; /找完,找不到,返回0i

51、nt main()char nametabnamelen=gongjing,liuna,huangpin,zhouzijun,lianxiaolei,chenhailing,cuipeng,liuping;char searchnamenamelen;int n=sizeof(nametab)/namelen;order(nametab,n);for(int i=0;in;i+) /輸出排序后的各姓名couti+1tnametabiendl;coutsearchname;if(n=find(nametab,n,searchname)coutposition:nendl;elsecoutnot

52、found!endl;return 0; c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針 指針是c+語言最重要特性之一,也是c+的主要難點。 指針提供了一種較為直觀的地址地址操作的手段,正確地使用指針,可以方便、靈活而有效地組織和表示復雜的數(shù)據(jù)。 指針在c+程序中扮演著非常重要的角色,從某種程度上而言,如果不能深刻的理解深刻的理解指針的概念,正確而有效的掌握指針,就不可能真正學好c+,但是指針也是我們最容易產(chǎn)生困惑并導致程序出錯的原因之一。 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針1. 1. 地址與指針地

53、址與指針地址:地址: 當定義一個變量后,內(nèi)存中將會劃出一塊由若干個存儲單元組成的區(qū)域,用于保存該變量的數(shù)據(jù)。在內(nèi)存里每個存儲單元都有各自的編號,稱為地址地址。指針: 在c+中,提供了指針指針類型,它是一種用于存放內(nèi)存單元地址的變量類型,地址就存儲在這種指針類型的變量中。正因為指針變量存儲的是地址,用它來指明內(nèi)存單元,所以形象地稱這種地址變量為指針指針。 c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針2. 2. 指針變量的定義指針變量的定義 每存儲一個地址,就要定義一個指針變量。定義指針變量的格式如下: 數(shù)據(jù)類型是指針變量所指向?qū)ο蟮臄?shù)據(jù)類型,它可以是基

54、本數(shù)據(jù)類型,也可以是構造數(shù)據(jù)類型以及void 類型。 變量名是用戶自定義的標識符。 *表示聲明的變量是一個指針變量,而不是普通變量。 例如: int *ip; /定義了一個int型的指針變量ip float *fp; /定義了一個float型指針變量fp typedef int a10; a *ap; / 定義了一個a類型的指針變量ap sizeof(ip)=sizeof(fp)=sizeof(ap)=4; 數(shù)據(jù)類型 * 變量名; c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針 3 3指針的初始化與賦值指針的初始化與賦值 定義了一個指針,只是得到了一個

55、用于存儲地址的指針變量。若指針變量既沒有初始化,也沒有賦值,其地址值是一個隨機的數(shù)。 (1)不要將一個非地址常量、變量以及無意義的實際地址賦給指針變量。如: int *p=100; /錯誤,100是一個int型常量,不是一個地址常量。 int *p=(char *)100; /危險!100是一個無意義的實際地址, 可能指向危險區(qū)域。(2)可以使用一個已初始化的指針去給另一個指針賦值,但類型必須一致如果不一致,可 進行強制類型轉(zhuǎn)換。 char *p=null; int *ip=(int *)p+100; /將char型指針強制轉(zhuǎn)化成int型指針。(3)對于基本數(shù)據(jù)類型的變量、數(shù)組元素我們可以使用

56、取地址運算符&來獲得它們的地址, 但是也只有類型一致才能賦值。 int a10; /定義int型數(shù)組 int *i_pointer=a; /定義并初始化int型指針 (4)有一種特殊的void類型指針,可以存儲任何的類型地址;但將一個void類型的地址賦值 給非void類型的指針變量,要使用類型強制轉(zhuǎn)換。 void v; /錯誤,不能定義void類型的變量 void *vp; /定義void類型的指針 數(shù)據(jù)類型 *指針變量名=初始地址表達式; c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針4 4指針運算指針運算 指針變量存放的是地址地址,因此指針的運算

57、實際上就是地址的運算指針的運算實際上就是地址的運算,但正是由于指針的這一特殊性,使指針所能進行的運算受到了一定的限制。指針通常進行下列幾種運算:賦值運算、取值運算、算術運算、相減運算、比較運算。 (1 1)* * 和和& &運算運算 * *稱為指針運算符指針運算符。出現(xiàn)在數(shù)據(jù)定義語句中時,* 在數(shù)據(jù)類型與變量之間,是一個二二元運算符元運算符,用來定義指針變量;出現(xiàn)指針變量表達式左邊左邊時,是一個一元運算符,表示訪問指針所指對象的內(nèi)容所指對象的內(nèi)容。 例如: int a4=1,2,3; int *ip=&a2; cout*ip; / 輸出ip指向單元的內(nèi)容,內(nèi)容為整型數(shù)3 *ip=100; /

58、將100賦給a2;c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針(2)指針與整數(shù)的加減運算)指針與整數(shù)的加減運算 指針的加減運算與普通變量的加減運算不同,由于指針存儲的是變量的內(nèi)存地址,指針加上或減去一個整數(shù)n,表示指針從當前位置向后或向前移動n個sizeof(數(shù)據(jù)類型)長度的存儲單元。因此對于不同的數(shù)據(jù)類型,n的實際大小就不同。 例如程序段: int b234; typedef char a10; int *p1=b10; int *p2=(int *)b1; int *p3=(int *)(b+1); double *pd=(double *)p3

59、; a *pa=(a *)p3; coutp1,p2,p3,pd,paendl; coutp1+1,p2+1,p3+1,pd+1,pa+1endl; 0013ff80, 0013ff80, 0013ff80, 0013ff80, 0013ff800013ff80, 0013ff80, 0013ff80, 0013ff80, 0013ff800013ff84, 0013ff84, 0013ff84, 0013ff88, 0013ff8a c+語語言言程程序序設設計計教教程程 第第5章章構構造造數(shù)數(shù)據(jù)據(jù)類類型型5.3 指針指針(3 3)指針自增、自減運算)指針自增、自減運算 指針的自增、自減運算是

60、指針加減運算的特例。指針的自增或自減表示指針從當前位置向后或向前移動sizeof(數(shù)據(jù)類型)長度的存儲單元。 例如:程序段: int *p, *q, a=5; p=&a; p+; /指針p后移4個字節(jié) *p+; /先讀取p指向的變量a的值5,然后使指針p后移4個字節(jié) (*p)+; /讀取p指向的變量a的值,然后使p指向的變量a自增1 *+p; /先使指針p后移4個字節(jié),然后讀取p指向的變量的值 +*p; /將p指向的變量a自增1 *q+=*p+; /這是一種常用的表達式,依次執(zhí)行:*q=*p, q+, p+(4 4)兩指針相減)兩指針相減 當兩個指針指向同一數(shù)組時指向同一數(shù)組時,兩個指針的相減

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論