計算機概論: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,指定其初始值第一縱行從數字110,第二縱行事對應的平方值。

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

重寫九九乘法表的程式,把結果放在一個二維陣列中並輸出。

 

課堂練習TD5-8
使用二維陣列存放一個預先設計好的圖案,再輸出至螢幕。

 


 

計算機概論:C/C++程式設計

義守大學電機系 陳慶瀚 
2001.11.12

 

謝孟媛 dvd -
情趣用品 -
飛鳥遊戲 -
遊戲基地 -
PATEK PHILIPPE -
xyz資訊工作坊 -
xyz軟體王 -
英文老師 -
沛納海 -
xyz軟體下載倉庫 -
基測試題 -
CARTIER 卡地亞 -
林晟數學 -
PIAGET -
費洛蒙情定 -
xyz -
軟體大補帖 -
高國華補習班 -
game淘 -
ps2台片 -
wii超級瑪莉攻略 -
情定費洛蒙 -
wii價格2011 -
xbox 360台片 -
tvgame360 -
愛馬仕 -
春藥專賣店 -
ps3價錢 2011 -
ps2遊戲王 -
wii遊戲片專賣店 -
百達翡麗 PATEK PHILIPPE -
壯陽藥品哪買 -
海賊王 -
春藥王 -
xyz軟體下載倉庫 -
壯陽食物 -
xbox360 -
催情藥 -
TISSOT 天梭 -
ps2遊戲燒錄 -
威而剛哪裡買 -
一夜情婦 -
xbox 360台片專賣 -
國中基測題庫 -
無雙遊戲網 -
xyz軟體王 -
ps2遊戲片80元 -
基測 -
xyz軟體王下載 -
GUCCI 古馳 -
南一題庫網 -
COACH -
LOUIS VUITTON -
wii超級瑪莉 -
wii價格2011 -
魔法老師 -
催情藥專賣店 -
國小翰林題庫網 -
wii遊戲片專賣店 -
遊戲天堂 -
寶格麗 -
金榜之路 -
wii遊戲片80元 -
xbox 360遊戲片 -
wii遊戲載點 -
人類費洛蒙情定 -
xbox 360台片專賣 -
催情王 -
xyz軟體之家 -
ps2遊戲片80元 -
情色小站 -
微風廣場 -
情慾之夜 -
民視文化 -
xbox360 -
蔻馳 -
ps2遊戲燒錄 -
ps3遊戲片 -
龍騰高中題庫 -
ps3台片 -
威而剛 -
ps3價錢 2011 -
軟體王下載 -
蕭邦 CHOPARD -
龍騰 -
催情藥 -
威而剛哪裡買 -
基測題目 -
HERMES 愛馬仕 -
情定費洛蒙 -
ps2台片 -
ps3遊戲片 -
wii瑪莉兄弟遊戲 -
江詩丹頓 Vacheron Constantin -
wii超級瑪莉 -
wii遊戲片在ho99小舖 -
春藥王 -
歷屆基測試題 -
窮人軟體 -
威而柔哪裡買 -
蕭邦 -
翰林題庫網 -
一夜情婦 -
wii遊戲下載 -
xbox 360遊戲 -
壯陽食物 -
ps2遊戲片 -
sogo百貨 -
台灣情色網 -
xyz軟體王下載 -
lv2011官方網 -
wii遊戲片專賣店 -
xbox 360價錢 -
歐米茄 -
雷達錶 RADO -
xyz資訊工坊 -
儒林補習班 -
壯陽藥品 -
xyz軟體王 -
窮人遊戲 -
ps2遊戲下載 -
ps3台片 -
德周 -
sogo百貨 -
費洛蒙情定 -
壯陽藥品哪買 -
催情王 -
春藥哪裡買 -
lv2011夏季新款 -
情趣用品 -
中友百貨 -
史萊姆的第一個家 -
情色論壇 -
萬寶龍 MONT BLANC -
萬國 -
ps2遊戲下載 -
春藥哪裡買 -
xyz資訊工作坊 -
龍騰文化 -
太平洋百貨 -
軟體王 -
xbox 360台片專賣 -
ps3遊戲片在ho99小舖 -
壯陽藥 -
xyz軟體銀行 -
xbox360台片 -
魔法24 -
wii遊戲片80元 -
XYZ資訊工坊 -
CARTIER -
春藥網 -
壯陽 -
xyz 軟體補給站 -
微風廣場 -
lv2011新款型錄 -
xbox 360遊戲 -
費洛蒙 -
卡地亞 -
wii遊戲下載 -
窮人天碟 -
春藥專賣店 -
gucci2011專賣店旗艦店 -
迪奧 -
CHANEL -
xyz軟體大本營 -
xbox 360遊戲片在ho99小舖 -
台北郵購網 -
BURBERRY 巴寶莉 -
伯爵 -
遠東百貨 -
陳希 -
費洛蒙mx -
時間廣場 -
漢神百貨 -
情色論壇 -
傳政 -
軟體 -
寶格麗 BVLGARI -
名牌包俱樂部 -
時間廣場 -
威而柔 -
wii瑪莉兄弟遊戲 -
lv名牌包專賣店 -
xyz軟體大本營 -
威而柔哪裡買 -
伯爵 PIAGET -
xyz軟體銀行 -
ps3遊戲下載 -
wii超級瑪莉歐 -
無名套裝 -
xyz軟體下載倉庫 -
江詩丹頓 -
林晟 -
ps3遊戲片在ho99小舖 -
威而剛 -
費洛蒙mx -
xyz軟體之家 -
HERMES -
林晟超理解數學 -
謝孟媛 -