代码改变世界

学习C++ -> 二维数组

2012-12-11 17:26  wid  阅读(60004)  评论(0编辑  收藏  举报

学习C++ -> 二维数组

 



一、二维数组的介绍
    当数组元素具有两个下标时, 该数组称为二维数组。 二维谁可以看做具有行和列的平面数据结构。
   



二、二维数组的定义
    定义二维数组的形式:

        数据类型 数组名[常量表达式1][常量表达式2] ;

       
    数据类型是数组全体元素的数据类型, 数组名用合法的标识符表示, 两个整型常量表达式可以理解为分别代表行数和列数, 与一维数组相同, 数组元素的下标一律从 0 开始。例如:

        int a[3][5] ;

 
    该语句表示:
        ①. 定义了一个二维数组a, 其数据类型为int型 ;
        ②. a数组有3行5列, 共能容纳 3*5 = 15 个 int 型的数据 ;
        ③. a数组的行下标为 0, 1, 2, 列下标为 0, 1, 2, 3, 4 , 所有元素的位置可表示为:

            a[0][0], a[0][1], a[0][2], a[0][3], a[0][4]
            a[1][0], a[1][1], a[1][2], a[1][3], a[1][4]
            a[2][0], a[2][1], a[2][2], a[2][3], a[2][4]

        ④. 程序运行时将为a数组在内存中开辟 3*5* 4(字节) = 60个字节连续的存储单元 ;

        


三、二维数组的使用
    同一维数组一样, 引用二维数组的元素, 也是引用他的数组元素, 数组元素的形式为:
        数组名[行下标][列下标] ;
    例如, 若定义 int a[3][5], i = 2, j = 4 ; 则下列引用都是合法的:
        a[0][0]、a[2][4]、a[i][j]、a[i-1][j]、a[1][j-1]
        
    使用举例:
        1>. 输入一个 2x3 大小的二维数组, 输入完毕后再全部输出

    #include<iostream>

    using namespace std ;

    int main()
    {
        int a[2][3] ;
        int i, j ;      //循环控制

        for( i = 0; i < 2; i++ )        //输入数据
            for( j = 0; j < 3; j++ )
              cin >> a[i][j] ;

        for( i = 0; i < 2; i++ )        //将数组中的元素全部输出
            for( j = 0; j < 3; j++ )
                cout << a[i][j] <<" " ;

        return 0 ;
    }

 

 

四、二维数组的初始化
    二维数组初始化的形式为:

        数据类型 数组名[常量表达式1][常量表达式2] = { 初始化数据 } ;

 
    在 { } 这给出各数据元素的初始值, 各初值之间用逗号隔开。 把 { } 中的初值依次赋给各数组元素。
    
    有如下几种初始化方式:
        1>. 分行进行初始化

            int a[2][3] = { {1, 2, 3}, {4, 5, 6} } ;

 
            在 { } 内部再用 {} 进行分开, 第一组 {} 中的初始值 1, 2, 3 是下标为 0 行的3个元素的初值。 第二对 {} 中的值 4, 5, 6 是下标为 1 行的 3 个元素的初值, 相当于执行如下语句:

                a[0][0] = 1;     a[0][1] = 2;     a[0][2] = 3;
                a[1][0] = 4;     a[1][1] = 5;     a[1][2] = 6;


            注意: 初始化的数据个数不能超过数组元素所能容纳的个数, 否则会出错。
            
        2>. 不分行初始化

            int a[2][3] = { 1, 2, 3, 4, 5, 6 } ;

 
            把 { } 中的数据依次赋值给 a 数组各元素(按行赋值), 即:

                a[0][0] = 1;     a[0][1] = 2;     a[0][2] = 3;     a[1][0] = 4;     a[1][1] = 5;     a[1][2] = 6;

           
        3>. 为部分数据元素初始化

            int a[2][3] = { {1, 2}, {4} } ;

 
            第一行只有2个初值, 按顺序分别赋值给 a[0][0] 和 a[0][1], 第二行的初值 4 赋给 a[1][0]。
            
        4>. 省略第一维的定义, 但不能省略第二维的定义

            int a[][3] = { 1, 2, 3, 4, 5, 6 } ;

 


            系统能够根据初始化元素的个数和第二维的长度来确定第一维的长度。
            一般, 省略第一维定义时, 第一维的大小按如下规则确定:
                初值个数能被第二维整除, 所得的商就是第一维的大小 ;
                若不能整除, 第一维的大小为商再加 1。例如:
                    int a[][3] = { 1, 2, 3, 4, 5 } ;
                等价于:
                  int a[2][3] = { 1, 2, 3, 4, 5 } ;
                
            若分行初始化, 也可以省略第一维的定义, 如:
                int a[][3] = { {1, 2}, {4} } ;
            其中 { } 中又包括 两个 {} , 这代表数组 a 的第一维大小为 2。
           


            
五、二维数组应用举例
    如图, 将 图a 中所示的数组转成如 图b 所示的情况(也成矩阵转置):
   

  解决代码:

 1     #include<iostream>
 2 
 3     using namespace std ;
 4 
 5     int main()
 6     {
 7         int arr[4][4] = { {1,  2,  3,   4},
 8                           {5,  6,  7,   8},
 9                           {9,  10, 11, 12},
10                           {13, 14, 15, 16} } ;
11         int m, n ;          //循环控制
12         int temp ;          //临时变量, 用于交换数据
13 
14         //开始进行矩阵转置
15         for( m = 0; m < 4; m++ )
16             for( n = m+1; n < 4; n++ )
17             {
18                 temp = arr[m][n] ;
19                 arr[m][n] = arr[n][m] ;
20                 arr[n][m] = temp ;
21             }
22 
23         //输出转置后的状态
24         for( m = 0; m < 4; m++ )
25         {
26             for( n = 0 ; n < 4; n++ )
27             {
28                 cout << arr[m][n] << "      " ;
29             }
30             cout<<endl;     //每输出一行后进行换行
31         }
32 
33         return 0 ;
34     }

 



六、二维字符数组
    二维字符数组常用来存放字符串, 二维字符数组每一行可以看做一维字符数组, 即二维字符数组的每一行可以存放一个字符串。
    
    1>. 二维字符数组的定义:
        二维字符数组的定义与一般二维数组的定义方式相同, 只是数据类型为 char。例如:
            char a[3][10] ;
        二维字符数组 a 有2行5列, 每一行可以存放长度小于或等于4的字符串(不要忘了要给字符串结束标识符留一个位置)。
        
    2>. 二维数组的初始化:
        和一维字符数组一样, 二维字符数组也可以在定义时初始化, 如:

            char a[3][10] = { "Hello", "world", "C++" } ;
            char a[][10] = { "Hello", "world", "C++" } ;        //第二维同样不可省略

 
        将二维字符数组图示展开如下(二维字符数组a, 3行10列):

H e l l o \0        
w o r l d \0         
C + + \0               


            

 

    

  3>. 二维字符数组的使用
        由于在二维字符数组每个字符串单独占一行, 所以可以用 a[n] 引用该二维数组字符中第 n 行的字符串, 也可以用 a[i][j] 引用某行某列中的单独一个字符串。
            示例: 输入二维字符数组中每行中的字符串

 1     #include<iostream>
 2 
 3     using namespace std ;
 4 
 5     int main()
 6     {
 7         char a[3][10] = { "Hello", "world", "C++" } ;
 8         int n ;
 9         for( n = 0; n < 3; n++ )        //按行输出
10             cout << a[n] << endl ;
11 
12         return 0 ;
13     }

 

C++语言对数组的维数没有限制, 因此你还可以根据一维和2维的规律使用 3 维数组或更高维的数组, 但是在高维数组上的处理比较难理解, 不熟练的情况下容易出错, 因此对于 3 维以上的数组请酌情使用。

 


--------------------


wid, 2012.12.11

 

上一篇: 学习C++ -> 字符串