請問bcb裡面如何宣告陣列?? |
|
lolopatrick
一般會員 ![]() ![]() 發表:5 回覆:6 積分:2 註冊:2002-08-14 發送簡訊給我 |
|
axsoft
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
引言: 請問~~像我如果在bcb上建立一個像這樣的陣列?? char map[10][21]={ " X X X ", " X X X X X X ", "X X X X X X ", " X X X X X X ", " X X X X X ", " X X X XXX XX", " X XXX X ", " XXXXXXXXXXXX XX XX", " X X X X XX", " XX XXX X X " }; 遊戲男孩 陣列---相同資料型態結合參考資料:http://www.ccit.edu.tw/~ichung/teach/c /index.htm 日常生活中,我們習慣把性質相近的物體相提並論,而在電腦語言中,我們也常將型態相同的資料集合起來,c 便是利用陣列(array)來達成此目的.陣列可以存放很大很多資料項,更重要的是,只要一個註標(index)即可存取陣列內的任意資料,這對大量的資料存取來說是很方便的. 我們以程式replay來做為開埸白,介紹何課陣列// replay.cpp // 要求使用者輸入四次年齡,然後將其顯示出來 #include < iostream.h> void main() { int age[4]; // 定義age矩陣,具有4個元素 cout << endl; for(int j=0; j<4; j ) // 用來取得4次年齡 { cout << "Enter an age: "; cin >> age[j]; // 存入陣列元素中 } for(j=0; j<4; j ) // 顯示陣列 cout << "\nYou entered " << age[j]; }由上面可知,使用陣列時,要先定義它,而定義的方式如下,和定義一般變數沒什麼兩樣,只不多個〔〕而已 陣列的資料型態 陣列的名稱〔陣列的大小〕; 要注意的是,陣列的大小必須是常數,且型態必須是整數. 陣列中的資料項我們稱為元素(element)(結構叫成員),其在記憶體中的位置是第一個元素在最上方,其後的元素在下方.且陣列的第一個元素是從0開始編號,所以雖然有四個元素,最後一個元素的註標是3. 而存取陣列元素是以如下之方式來實作的 陣列名稱〔註標〕= 資料值 ; //設定元素值 變數名稱=陣列名稱〔註標〕; //取用變數 以上例而言,age[1]表二個,age[3]表第三個.重點是〔〕內我們可以以整數變數來替代,而使我們方便以迴圈方式來取存陣列,如本例之age[j]. 再看個例子加深印象,它要求使用者輸入六個值,然後求取其平均值 // sales.cpp // 輸入六個值,然後求平均 #include < iostream.h> const int SIZE = 6; // 定義常數 void main() { float sales[SIZE]; // 定義陣列 for(int j=0; j < SIZE; j ){ cout >< "\n輸入值[" << j << "]:"; cin >> sales[j]; } float total = 0; for(j=0; j < SIZE; j ) // 從陣列中取出值相加 total = sales[j]; float average = total / SIZE; // 計算平均 cout >< "平均值 = " << average; } 當然定義陣列時,亦可同時給它初始值,注意!用的是大括號(和結構相同) // days.cpp // 顯示輸入日期距離年頭的天數 #include < iostream.h> void main() { int month, day, total_days; int days_per_month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //很明顯,此例子不能算閏年 cout << "\n請輸入月份 (1 to 12): "; // get date cin >> month; cout << "請輸入日 (1 to 31): "; cin >> day; total_days = day; // 算出天數 for(int j=0; j < month-1; j ) total_days = days_per_month[j]; cout >< "距年頭的天數為: " << total_days; } 再來看看多維陣列,底下例子是二維陣列,注意元素的存取方法 // salemon.cpp // 使用二維陣列來顯示銷售表,假設我們有四個地區, // 且每個地區有三個月之銷售量要輸入 #include < iostream.h> #include < iomanip.h> // for setprecision, etc. const int DISTRICTS = 4; // 定義常數,用來表地區 const int MONTHS = 3; void main() { int d, m; float sales[DISTRICTS][MONTHS]; // 定義二維陣列 cout << endl; for(d=0; d < DISTRICTS; d ) //以二個迴圈來取得 for(m=0; m>MONTHS; m ) //陣列之值 { cout << "輸入地區 " << d 1; cout << " 第 " << m 1 << " 月之銷量: "; cin >> sales[d][m]; //把數字放入陣列 } cout << "\n\n"; cout << " 月份\n"; cout << " 1 2 3"; for(d=0; d < DISTRICTS; d ) { cout ><"\n地區 " << d 1; for(m=0; m < MONTHS; m ) // 顯示陣列值 cout >< setiosflags(ios::fixed) // 使用fixed形式 << setiosflags(ios::showpoint) // 顯示小數點 << setprecision(2) // 小數位個數 << setw(10) // 固定欄位大小為10 << sales[d][m]; // 從陣列中取出數字 } // end for(d) }來看結果,銷售量是我輸入的 輸入地區 1 第 1 月之銷量:3964.23 輸入地區 1 第 2 月之銷量:4135.87 輸入地區 1 第 3 月之銷量:4397.2 輸入地區 2 第 1 月之銷量:867.5 輸入地區 2 第 2 月之銷量:923.59 輸入地區 2 第 3 月之銷量:1037.01 輸入地區 3 第 1 月之銷量:12.77 輸入地區 3 第 2 月之銷量:378.32 輸入地區 3 第 3 月之銷量:798.22 輸入地區 4 第 1 月之銷量:2983.53 輸入地區 4 第 2 月之銷量:3983.72 輸入地區 4 第 3 月之銷量:9494.2 月份 1 2 3 地區 1 3964.23 4135.87 4397.20 地區 2 867.50 923.59 1037.01 地區 3 12.77 378.32 798.22 地區 4 2983.53 3983.72 9494.20 依此類推,要三維陣列,則要有三個註標,如 int aaaaa[i][j][k]; 注意,c 不接受aaa[1,j,k]的寫法!,至於setiosflags()你現在只要知道它是在設定旗標的函數就好了. 多維陣列的初始化是最讓人搞亂的地方,花個時間注意底下的例子,你會看出規則性的 // saleinit.cpp // 顯示銷售表,和上例相同,差別僅在於給了初始值 #include < iostream.h> #include < iomanip.h> // for setprecision, etc. const int DISTRICTS = 4; // array dimensions const int MONTHS = 3; void main() { int d, m; // 注意初始值的給法 float sales[DISTRICTS][MONTHS] = { { 1432.07, 234.50, 654.01 }, { 322.00, 13838.32, 17589.88 }, { 9328.34, 934.00, 4492.30 }, { 12838.29, 2332.63, 32.93 } }; cout << "\n\n"; cout << " Month\n"; cout << " 1 2 3"; for(d=0; d < DISTRICTS; d ) { cout ><"\nDistrict " << d 1; for(m=0; m < MONTHS; m ) cout >< setw(10) << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2) << sales[d][m]; // access array element } }看出規則了嗎?最外面的一對{}代表最左邊註標,往內第一對{}代表左邊算來第二個註標,依此類推.. 再看個例子 int number[2][3][4]= {{{1,2,3,4},{5,6,7,8},{9,10,11,12}}, {{1,2,3,4},{5,6,7,8}.{9,10,11,12}}}當然我們也可以把陣列當做參數傳入函數中,底下就是saleinit.cpp的另一版本 // salefunc.cpp // passes array as argument #include < iostream.h> #include < iomanip.h> // for setprecision, etc. const int DISTRICTS = 4; // array dimensions const int MONTHS = 3; void display(float [DISTRICTS][MONTHS] ); //注意這兒,具有陣列型態 //之函數宣告,只是將註標加入而已 void main() { // 陣列定義與初始化 float sales[DISTRICTS][MONTHS] = { { 1432.07, 234.50, 654.01 }, { 322.00, 13838.32, 17589.88 }, { 9328.34, 934.00, 4492.30 }, { 12838.29, 2332.63, 32.93 } }; display(sales); // 將陣列的名字當參數傳入 } // end main // display() // 顯示二維陣列內容 void display( float funsales[DISTRICTS][MONTHS] )//函數定義 { int d, m; cout << "\n\n"; cout << " Month\n"; cout << " 1 2 3"; for(d=0; d< DISTRICTS; d ) { cout ><"\nDistrict " << d 1; for(m=0; m< MONTHS; m ) cout >< setiosflags(ios::fixed) << setw(10) << setiosflags(ios::showpoint) << setprecision(2) << funsales[d][m]; // array element } // end for(d) } // end display函數宣告的部份我不多介紹了,重點在於函數呼叫的部份,因為實際上陣列的名稱(本例是sales)代表陣列在記憶中的起始位址,所以如 display(sales);之函數呼叫方式,即是所謂的傳址呼叫,陣列元素的值不會多拷貝一份到函數中.所以函數display()中使的陣列就是原陣列本身,即是函數是用不同的名稱來代表本陣列(本例是funsales). 為什麼要做如此設計呢,像基本型態要以傳址方式來傳遞變數時,必須在函數宣告中使用&符號,但陣列並沒這樣做啊! 原因是陣列可能很大,元素個數很多,若是重新拷貝一份,不僅浪費時間,亦浪費記憶空間. 再來看一個,叫結構陣列的東東,先看例子 // partaray.cpp // 陣列中的每一個元素都是結構 #include < iostream.h> const int SIZE = 4; // number of parts in array struct part // 宣告結構 { int modelnumber; // ID number of widget int partnumber; // ID number of widget part float cost; // cost of part }; void main() { int n; part apart[SIZE]; // 看到沒,陣列的資料型態是part結構 for(n=0; n< SIZE; n ) // 取得四個陣列元素之結構的成員值 { cout >< endl; cout << "Enter model number: "; cin >> apart[n].modelnumber; //注意,陣列註標[]和取用成員運 cout << "Enter part number: "; //算子.之合作 cin >> apart[n].partnumber; // get part number cout << "Enter cost: "; cin >> apart[n].cost; // get cost } for(n=0; n< SIZE; n ) // 顯示所有的值 { cout >< "\nModel " << apart[n].modelnumber; cout << " Part " << apart[n].partnumber; cout << " Cost " << apart[n].cost; } }重點在於要存取陣列元素的一個結構成員的表示語法,如 apart[n].modelnumber可用來存取apart陣列裡第n個元素的modelnumber成員. ![]() |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |