線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8819
推到 Plurk!
推到 Facebook!

請問bcb裡面如何宣告陣列??

 
lolopatrick
一般會員


發表:5
回覆:6
積分:2
註冊:2002-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-16 08:08:44 IP:218.165.xxx.xxx 未訂閱
請問~~像我如果在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 " }; 遊戲男孩
------
遊戲男孩
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-08-16 08:43:35 IP:61.218.xxx.xxx 未訂閱
引言: 請問~~像我如果在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成員. 時間就是金錢---[ 發問前請先找找舊文章] 發表人 - axsoft 於 2002/08/16 08:50:18
系統時間:2024-05-07 8:32:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!