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