計算機概論:C/C++程式設計
|
第5章、陣列和指標 |
|
|
授課教師:陳慶瀚 WWW : http://www.miat.ee.isu.edu.tw/cpp E-mail : pierre@isu.edu.tw |
|
5.3
陣列初值化 C/C++語言允許程式設計者在宣告陣列的同時,就指定陣列元素的初始值。這種方式稱為陣列的初值化。陣列初值化的語法與一般變數相同,都是在變數名稱之後直接以assignment運算子=指定其值,唯一差別的是:陣列的元素是多個而不是單一值,所以我們使用大括號{}如下所示: 資料型別 陣列名稱[size1].
. .[sizeN] = { 陣列值
}; 陣列值是一系列資料型別相同且以逗號分隔的串列值。第一個值將會被放置於陣列的第一個位址,第二個放置於陣列的第二個位址,依此類推。在下列的例子中,一個有10個元素的陣列初始值可以安排如下: int x[10] = {1, 2, 3,
4, 5, 6, 7, 8, 9, 10}; 這表示我們將1指定給x[0],2指定給x[1],...,最後將10指定給x[9]。 如果陣列的資料型別是char,字元陣列的初值化應該如下: char array_name[7] =
{'H', 'e', 'l', 'l', 'o'}; 但可以簡化為字串的形式來作陣列的初值化: char array_name[7] =
"Hello!"; 又如果想把檔案名稱當作一個陣列變數值,則我們可以寫: char str[10] = "score.txt"; 甚至可以加上路徑: char str[18] =
"c:/work/score.txt"; 這與下面初始化的功能是一樣的: char str[18] = {'c',
':', '/', 'w', 'o', 'r','k', '/', 's', 'c', 'o','r','e','.','t','x','t'}; 因為字串的結尾必須包含一個空字元'\0',你必須確定陣列宣告的長度足夠包含空字元。這也是為什麼字串長度"c:/work/score.txt ",但是陣列長度卻有18個字元空間。當宣告字串常數時,編譯器將會在字串結尾處自動加上空字元。 /*----------------------------------------------------*/ //
範例程式5-6 //
輸入檔案名稱 //
陳慶瀚,2001 /*----------------------------------------------------*/ #include
<iostream.h> void
main() {
char filename[8];
cout<<"輸入檔案名稱 :";
cin>>filename;
cout<<"你輸入的檔名是 :"<<filename<<endl;
cout<<"長度是 :"<<sizeof(filename)<<endl; } 多維陣列的初值化方式與單一維度一樣。舉例來說,一個10(row) * 2(column)的二維陣列mat,指定其初始值第一縱行從數字1到10,第二縱行事對應的平方值。 int mat[10][2] = { 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100 }; 在二維陣列的初值化中,需要特別留意初值的排列順序,因為二維的資料要排成一維的串列,其順序要依循先變化column,再變化row的順序。另外一種更清晰表達的二維陣列的初值化方式是把單一維度(如row)的陣列值視為子集合(subset),另行加上一組{}來設定子集合的初始值。例如上述例子也可以寫成: int mat[10][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25}, {6, 36}, {7, 49}, {8, 64}, {9, 81}, {10, 100} }; 當你使用子集合時,如果你沒有提供足夠的初始值給每一個陣列空間,那麼空缺的元素將會被自動填入0。 /*----------------------------------------------------*/ //
範例程式5-7 //
求一個矩陣的轉置(transpose)矩陣 //
陳慶瀚,2001 /*----------------------------------------------------*/ #include
<iostream.h> void
main() {
int mat[3][3]=
{
{1,2,3},
{4,5,6},
{7,8,9}
};
int rlt[3][3];
int x,y;
cout<<"Original :\n";
for(y=0;y<3;y++)
{
for(x=0;x<3;x++)
{
cout<<mat[y][x]<<"\t";
}
cout<<endl;
}
for(y=0;y<3;y++)
{
for(x=0;x<3;x++)
{
rlt[y][x]=mat[x][y]; //行和列互換,存入一個新陣列
}
}
cout<<"Transpose :\n";
for(y=0;y<3;y++)
{
for(x=0;x<3;x++)
{
cout<<rlt[y][x]<<"\t";
}
cout<<endl;
} } 你應該得到這樣的結果: Original
: 1
2 3 4
5 6 7
8 9 Transpose
: 1
4 7 2
5 8 3
6 9 課堂練習5-6: 請以上述陣列mat[10][2]寫一個程式,只填入前五列初值,再以雙重迴圈輸出完整的陣列值,觀察後五列陣列值是否為0。 未定陣列大小初始化 假定你想使用一個字串的陣列去初始化一組錯誤訊息,如下所示:
char e1[12] =
"Read error\n"; char e2[13] =
"Write error\n"; char e3[18] =
"Cannot open file\n"; 或者 char e4[14] = "分母為零錯誤\n"; char e5[14] = "非正整數錯誤\n"; char e6[18] = "超出陣列大小錯誤\n"; 細心的讀者可能注意到,中文訊息所使用的陣列大小似乎與它的字數不一致,這是因為每一個中文字佔用兩個ASCII字元。 在上述例子,我們必須自行計算每一個訊息的字元數目,再決定陣列的大小,這個程序相當麻煩,而且很容易算錯。幸運的,C/C++語法提供一個機制可以讓編譯器自動決定陣列長度。如果在陣列初始化宣告時並沒有指定陣列的大小,C/C++在編譯時將會自動配置一個適足以容納所有初始化資料的空間。這樣的陣列稱為未定大小陣列。使用這種方式來宣告並初始化資料,前述的錯誤訊息宣告變成 char e1[] =
"Read error\n"; char e4[] = "分母為零錯誤\n"; 或 char *e1 = "Read
error\n"; char *e4 = "分母為零錯誤\n"; 第二種寫法其實就是指標,本章的後半部將討論這個主題。 在程式中,我們可能想知道這些未定大小的陣列究竟長度為何,使用sizeof()函式九可以傳出陣列的大小,例如 char e4[] = "分母為零錯誤\n"; int length =
sizeof(e4); 或者直接輸出到螢幕 cout<<e4<<"
長度為 : "<<sizeof(e4); 未定陣列大小初始化並不只限於一維陣列,但在多維陣列的情況仍有不同。以二維陣列來說,我們可以保留row的大小是未定的,但必須固定column的大小。對於更高維的情形也是如此,
必須固定column的大小,其他維度則允許編譯時決定其大小。舉例來說,如下宣告sqrs為一個未定大小的二維陣列: int sqrs[][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25}, {6, 36}, {7, 49}, {8, 64}, {9, 81}, {10, 100} }; /*----------------------------------------------------*/ //
範例程式5-8 //
使用未定大小的二維陣列初始化 //
陳慶瀚,2001 /*----------------------------------------------------*/ #include
<iostream.h> void
main() {
char msg[][80]=
{
{"無感地震─地震儀有記錄,人體無感覺。"},
{"微震─人靜止時或對地震敏感者可感到。"},
{"輕震─門窗搖動,一般人均可感到。"},
{"弱震─房屋搖動,門窗格格作響,懸物搖擺,盛水動盪。"},
{"中震─房屋搖動甚裂,不穩物傾倒,盛水容器八分滿者濺出。"},
{"強震─牆壁龜裂,牌坊煙囪傾倒。"},
{"烈震─房屋傾倒、山崩、地裂、地層斷陷。"}
};
int degree;
cout<<"請輸入地震強度(0-7):";
cin>>degree;
cout<<msg[degree]; }
課堂練習TD5-7: 重寫九九乘法表的程式,把結果放在一個二維陣列中並輸出。 使用二維陣列存放一個預先設計好的圖案,再輸出至螢幕。
|
||
計算機概論:C/C++程式設計 義守大學電機系 陳慶瀚 |