?? c++6.dat
字號(hào):
第六章 數(shù)組與字符串
第一節(jié) 一維數(shù)組
在C++中,數(shù)組是一種集合數(shù)據(jù)類(lèi)型,它由許多元素組成,每一個(gè)元素都有相同的數(shù)據(jù)類(lèi)型,在內(nèi)存中占用相同大小的存儲(chǔ)單元,且在內(nèi)存中連續(xù)存放.每一個(gè)數(shù)組有一個(gè)名字,數(shù)組中的每一個(gè)元素有一個(gè)序號(hào)(或稱(chēng)下標(biāo))表示元素在數(shù)組中的位置,我們正是通過(guò)下標(biāo)來(lái)識(shí)別數(shù)組中的每一個(gè)元素.
數(shù)組有一維的,也有多維的,數(shù)組也有大小,數(shù)組的維數(shù)和大小是在定義數(shù)組時(shí)就確定的,程序運(yùn)行的時(shí)候不能改變.
數(shù)組適合于表示由許多相似項(xiàng)組成的組合數(shù)據(jù),例如,人名表、世界城市和它們的溫度表、銀行每月的帳目處理等.
本章中,我們將介紹一維數(shù)組、二維數(shù)組和字符數(shù)組的定義、引用和它們的初始化.
數(shù)組主要有以下特點(diǎn):
(1) 每個(gè)數(shù)組元素的數(shù)據(jù)類(lèi)型相同,且可以是任何合法的數(shù)據(jù)類(lèi)型;
(2) 數(shù)組可以是一維的、二維的,甚至更高維的,例如,下面的語(yǔ)句就定義了一個(gè)三維數(shù)組ARRAY:
INT ARRAY[3][3][3];
(3) 數(shù)組同其它變量一樣,在使用前必須定義;
(4) 數(shù)組各個(gè)元素按順序排列,其位置由下標(biāo)確定;
(5) 數(shù)組元素可以同其它變量一樣使用.
注意:數(shù)組的維數(shù)和大小是在定義數(shù)組時(shí)就確定的,程序運(yùn)行的時(shí)候不能改變.
1.1 一維數(shù)組的定義
數(shù)組的定義與變量的定義類(lèi)似,一維數(shù)組的一般定義形式為:
類(lèi)型說(shuō)明符 數(shù)組名[常量表達(dá)式];
"類(lèi)型說(shuō)明符"指定數(shù)組元素的類(lèi)型,"數(shù)組名"的命名規(guī)則與變量一樣,方括號(hào)中的"常量表達(dá)式"的值表示數(shù)組元素的個(gè)數(shù),它必須是一個(gè)整數(shù).例如,北京最近一百年來(lái)每年的平均溫度值可保存在一個(gè)數(shù)組中,該數(shù)組可定義為:
float annual_temp[100];
這個(gè)定義會(huì)使得編譯器分配100個(gè)連續(xù)的float變量的內(nèi)存空間.數(shù)組元素的個(gè)數(shù)在編譯時(shí)就必須固定,且最好定義為一個(gè)常量.這樣,當(dāng)數(shù)組元素的個(gè)數(shù)需要改變時(shí),只要改變那個(gè)常量即可:
const int NE = 100;
float annual_temp[NE];
數(shù)組元素的下標(biāo)從零開(kāi)始計(jì)數(shù),在annual_temp數(shù)組中,第一個(gè)元素是annual_temp[0],第二個(gè)元素是annual_temp[1],余類(lèi)推,最后一個(gè)元素是annual_temp[NE-1].
1.2 一維數(shù)組的使用
C++中,數(shù)組元素的下標(biāo)總是從0開(kāi)始,如果一個(gè)數(shù)組有n個(gè)元素,則第一個(gè)元素的下標(biāo)是0,最后一個(gè)元素的下標(biāo)是n-1.
訪(fǎng)問(wèn)數(shù)組元素的方法是通過(guò)數(shù)組名及數(shù)組名后的方括號(hào)中的下標(biāo).例如,假定我們要設(shè)置上面定義的數(shù)組annual_temp的第15個(gè)元素值為11.5,則代碼為:
annual_temp[14] = 11.5;
如果,企圖訪(fǎng)問(wèn)一個(gè)不存在的數(shù)組元素,會(huì)導(dǎo)致一個(gè)嚴(yán)重的錯(cuò)誤.例如:
annual_temp[100]= 12.3; //錯(cuò)誤,該數(shù)組的最大下標(biāo)為99!
能使用標(biāo)識(shí)符的地方,就能引用數(shù)組元素.下面是引用數(shù)組元素的一些例子,并假定在引用前已有如下的一些定義:
const int NE = 100,
N = 50;
int i, j, count[N];
float annual_temp[NE];
float sum, av1, av2;
能夠用cin函數(shù)將一個(gè)值直接讀到數(shù)個(gè)數(shù)組元素中:
cin >> count[i];
數(shù)組元素能夠進(jìn)行算術(shù)運(yùn)算:
count[i] = count[i] + 5;
count[i] += 5;
數(shù)組元素可以用在邏輯表達(dá)式中:
if (annual_temp[j] < 10.0)
cout << "It was cold this year "
<< endl;
處理數(shù)組元素時(shí),通常使用循環(huán)語(yǔ)句.例如annual_temp的數(shù)組元素的值可用下面的語(yǔ)句獲得:
for (i = 0; i < NE; i++)
cin >> annual_temp[i];
下面的代碼可以算出數(shù)組前10個(gè)元素均值:
sum = 0.0;
for (i = 0; i <10; i++)
sum += annual_temp[i];
av1 = sum / 10;
假定k是一個(gè)整型變量或常量,但k<=NE.假定要計(jì)算數(shù)組中最后k個(gè)元素的平均值,代碼如下:
sum = 0.0;
for (i = NE - k; i < NE; i++)
sum += annual_temp[i];
av2 = sum / k;
第二節(jié) 多維數(shù)組
2.1 二維數(shù)組的定義
二維數(shù)組相當(dāng)于一個(gè)矩陣,它的定義方法與一維數(shù)組的定義類(lèi)似.二維數(shù)組定義的一般形式為:
類(lèi)型說(shuō)明符 數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];
"類(lèi)型說(shuō)明符"指定數(shù)組元素的類(lèi)型,"數(shù)組名"是C++允許的標(biāo)識(shí)符,"常量表達(dá)式1"指定數(shù)組元素的行數(shù),"常量表達(dá)式2" 指定數(shù)組元素的列數(shù).例如,我們要表示北京、天津、上海三個(gè)城市一年四季的平均氣溫,參見(jiàn)表6-5.
可以定義一個(gè)二維數(shù)組來(lái)保存氣溫值:
float seasonTemp[3][4];
這個(gè)數(shù)組在內(nèi)存中占用12個(gè)連續(xù)的float元素的存儲(chǔ)單元,如圖6-2.
我們可以看到:C++中,二維數(shù)組在內(nèi)存中的存放仍然是一維的,且各個(gè)元素按行順序存放.
2.2 二維數(shù)組的初始化
二維數(shù)組的初始化是分行進(jìn)行的.例如:
float seasonTemp[3][4] = {
{11.3, 28.2, 16.5, -7.1},
{12.4, 27.1, 17.6, -5.7},
{23.2, 33.5, 25.8, -1.3}
};
我們已經(jīng)知道,二維數(shù)組在內(nèi)存中是一維的,且由各行元素順序存放得到.所以,seasonTemp也可以采用下面的語(yǔ)句初始化:
int seasonTemp[3][4] = {
11.3, 28.2, 16.5, -7.1, 12.4, 27.1, 17.6, -5.7, 23.2, 33.5, 25.8, -1.3
};
但是,按行初始化更直觀(guān)、更通用,它能夠初始化某一行中的部分元素.例如:
int seasonTemp[3][4] = {{26}, {24}, {28}};
上面的語(yǔ)句僅初始化數(shù)組每一行的第一個(gè)元素,而其它元素未給初值.
我們定義并初始化一個(gè)二維數(shù)組時(shí),可以省略"常量表達(dá)式1",例如:
int seasonTemp[][4] = {
{26, 34, 22, 17},
{24, 32, 19, 13},
{28, 38, 25, 20}
};
如果省略"常量表達(dá)式1"最好采用按行初始化的方式,否則,容易出錯(cuò).編譯器根據(jù)初值的行數(shù)來(lái)確定數(shù)組的行數(shù).
注意:"常量表達(dá)式2"一定不能省略,否則程序編譯時(shí)會(huì)出錯(cuò).因?yàn)槎S數(shù)組元素在存取時(shí),需要在一維和二維之間轉(zhuǎn)換,如果省略"常量表達(dá)式2",則編譯器無(wú)法計(jì)算出它們之間的對(duì)應(yīng)關(guān)系.
2.3 二維數(shù)組的使用
類(lèi)似于一維數(shù)組的訪(fǎng)問(wèn),訪(fǎng)問(wèn)二維數(shù)組元素可通過(guò)兩個(gè)[]運(yùn)算符,第一個(gè)[]運(yùn)算符指定元素的行下標(biāo),第二個(gè)[]運(yùn)算符指定元素的列下標(biāo).二維數(shù)組的行下標(biāo)和列下標(biāo)均是從0開(kāi)始的.如果有一個(gè)有m行、n列的二維數(shù)組,它的第一行第一列元素的行和列下標(biāo)分別是0和0,最后一行最后一列元素的行和列下標(biāo)分別是m-1和n-1.
第三節(jié) 字符數(shù)組
當(dāng)數(shù)組中的元素都是由一個(gè)個(gè)字符組成時(shí),便稱(chēng)之為字符數(shù)組.字符數(shù)組并無(wú)什么特別之處,它的的重要性在于: C++中,用一個(gè)一維的字符數(shù)組表示字符串.數(shù)組的每一個(gè)元素保存字符串的一個(gè)字符,并附加一個(gè)空字符,表示為`\0',添加在字符串的末尾,以識(shí)別字符的結(jié)束.所以,如果一個(gè)字符串有n個(gè)字符,則至少需要有n+1個(gè)元素的字符數(shù)組來(lái)保存它.例如,一個(gè)字符`a'僅需要一個(gè)字符變量就可以保存,而字符串"a"需要有兩個(gè)元素的字符數(shù)組來(lái)保存,一個(gè)元素存字符`a',另一個(gè)元素存空字符`\0'.
3.1 字符數(shù)組的輸出
字符串可以用printf或cout函數(shù)輸出,例如:
cout << "The string s1 is " << s1 << endl;
printf("The string s1 is %s\n", s1) ;
上面兩個(gè)語(yǔ)句的輸出結(jié)果相同,均為:
The string s1 is example
3.2 字符數(shù)組的輸入
字符串(字符數(shù)組)通常用scanf和cin函數(shù)輸入,下面分別介紹.
一、用scanf函數(shù)輸入字符串
scanf可以一次輸入一個(gè)或多個(gè)字符串,如果一次輸入多個(gè)字符串,字符串之間用逗號(hào)隔開(kāi), 用"ENTER"結(jié)束輸入.
char s1[10], s2[10];
執(zhí)行語(yǔ)句:
scanf("%s", s1);
二、用cin輸入字符串
用cin輸入字符串的作用與scanf類(lèi)似,但更方便.例如,假定s1定義還與前面一樣,執(zhí)行下面的語(yǔ)句:
cin << s1;
輸入輸入字符串"Learn C++",s1的值與用scanf的結(jié)果是一樣的.如果一個(gè)字符串中有空格,我們就需要在空格的地方將字符串分成二個(gè)或多個(gè)字符串輸入.例如,某人名字為"Ian Aitchison",我們可以用下面的語(yǔ)句輸入:
char firstname [12], surname[12];
cout << "Enter name ";
cin >> firstname;
cin >> surname;
cout << "The name entered was "
<< firstname << " "
<< surname;
執(zhí)行上面的語(yǔ)句,輸入"Ian Aitchison",輸出結(jié)果如下:
The name entered was Ian Aitchison
上面的程序段我們也可以修改為,效果是一樣的:
char firstname [12], surname[12];
cout << "Enter name ";
cin >> firstname >> surname;
cout << "The name entered was "
<< firstname << " "
<< surname;
字符數(shù)組應(yīng)用舉例:
1. 求字符串的長(zhǎng)度
2. 從鍵盤(pán)上讀一個(gè)輸入行并輸出
3. 把兩個(gè)字符串連接起來(lái)
4. 把一個(gè)數(shù)字字符串轉(zhuǎn)換為相應(yīng)的整數(shù)
第四節(jié) 數(shù)組做函數(shù)參數(shù)
同其它變量一樣,數(shù)組也可以作函數(shù)的參數(shù).數(shù)組元素只能作函數(shù)實(shí)參,且同其它變量的用法沒(méi)有區(qū)別.
數(shù)組元素要通過(guò)數(shù)組名和相應(yīng)的下標(biāo)一個(gè)個(gè)地引用,而數(shù)組名可以作函數(shù)的實(shí)參和形參.當(dāng)數(shù)組作為函數(shù)參數(shù)時(shí),調(diào)用函數(shù)中的實(shí)參數(shù)組只是傳送該數(shù)組在內(nèi)存中的首地址,即調(diào)用函數(shù)通知被調(diào)函數(shù)在內(nèi)存中的什么地方找到該數(shù)組.在前面我們已經(jīng)知道了函數(shù)參數(shù)的值傳遞方式,調(diào)用函數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)地址的方式,稱(chēng)之為函數(shù)參數(shù)的引用傳遞.
對(duì)于函數(shù)參數(shù)的引用傳遞,除傳送數(shù)組名外,調(diào)用函數(shù)還必須通知被調(diào)函數(shù):數(shù)組有多少個(gè)元素.所以,有數(shù)組參數(shù)的函數(shù)原型的一般形式為:
類(lèi)型說(shuō)明符 函數(shù)名(數(shù)組參數(shù), 數(shù)組元素個(gè)數(shù))
數(shù)組參數(shù)并不指定數(shù)組元素的個(gè)數(shù),即[]中是空的,沒(méi)有數(shù)字.例如:
#include <iostream.h>
int add(int x, int n)
{
return (x + n);
}
void main()
{
int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int i;
for( i = 0; i<10; i++)
a[i]=add(a[i], i); //數(shù)組元素作函數(shù)參數(shù)
for(i = 0; i<10; i++)
cout << a[i] << endl;
}
函數(shù)參數(shù)的引用傳遞不同于值傳遞.值傳遞時(shí)是把實(shí)參的值復(fù)制到形參,實(shí)參和形參占用不同的存儲(chǔ)單元,形參值的改變不會(huì)影響到實(shí)參.而數(shù)組作為函數(shù)參數(shù)傳遞時(shí),是引用傳遞方式,即把實(shí)參數(shù)組在內(nèi)存中的首地址傳給了形參,被調(diào)函數(shù)可以通過(guò)該地址,找到實(shí)參數(shù)組中的各個(gè)元素.這就意味著:在被調(diào)函數(shù)中,如果改變了形參數(shù)組某元素的值,在被調(diào)函數(shù)中,實(shí)參數(shù)組對(duì)應(yīng)元素的值也會(huì)發(fā)生相應(yīng)的改變.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -