易懂的二维数组基础

一、二维数组的定义和引用

1、定义
类型名 数组名[行数][列数]
int a[3][2];
定义二维数组a,3行2列,6个元素

2、引用:先定义,后使用
数组元素的引用:
数组名[行下标][列下标]
行下标和列下标:整数表达式
行下标的取值范围是[0,行数-1]
列下标的取值范围是[0,列数-1]

int a[3][2];32列,6个元素
a[0][0]  a[0][1]
a[1][0]  a[1][1]
a[2][0]  a[2][1]

二、二维数组的初始化

1、分行赋初值
int a[3][3] = { {1,2,3},{4,5,6},{7,8,9}};
static int b[4][3] = { {1,2,3}.{4},{5,6}}

2、顺序赋初值
int a[3][3] = {1,2,3,4,5,6,7,8,9};
static int b[4][3] = {1,2,3.4,0,0,5,6,0}

二维数组初始化时可以不给出行数:
int a[][3] = {1,2,3,4,5,6,7,8,9}
编译器会根据初值的个数和数组的列数计算出数组的行数,但建议不要省略

3、用二重循环处理二维数组
行下标和列下标分别作为循环变量,通过二重循环,遍历二维数组
通常将行下标作为外循环的循环变量

for(i = 0;i < m;i++)//i从0到m-1,处理m行
{
    
    
   for(j = 0;j < n;j++)//处理第i行的第n列
   {
    
    }
}

4、二维数组的输入

int a[3][4];
for(i = 0;i < 3;i++)
{
    
    
   for(j = 0;j < 4;j++)
   scanf("%d",&a[i][j]);
}

5、二维数组的输出

int a[3][4];
for(i = 0;i < 3;i++)
{
    
    
   for(j = 0;j < 4;j++)
   printf("%d\n",a[i][j]);
}

三、杨辉三角

解决问题:输出杨辉三角的前n行(n < 20,
每个元素占6列。杨辉三角形是形如:
1      
1 1 
1 2 1
1 3 3 1 
1 4 6 4 1
的三角,其实质是二项式(a + b)的n次方展
开后各项的系数排成的三角形,它的特点是左
右两边全是1,从第二行起,中间的每一个数是
上一行相邻两个数之和。
#include<stdio.h>
#define N 15
int main(void)
{
    
    
     int a[N][N];

     int i,j,n;

     printf("请输入要输出杨辉三角形的行数n:\n");
     scanf("%d",&n);

     a[0][0] = a[1][0] = a[1][1] = 1;//初始化第一行和第二行的元素为0

     for(i = 2;i < n;i++)//从第二行起,每行的第一列和对角线上的元素为0,用for循环初始化
     {
    
    
          a[i][0] = a[i][i] = 1;
     }

     /*中间的数用递归的方法计算,中间的数为上一行a[i-1][j]与前一个数
     a[i-1][j-1]之和*/
     for(i = 2;i < n;i++)
     {
    
    
          for(j = 1;i < i ;j++)
          {
    
    
                a[i][j] = a[i-1][j] + a[i-1][j-1];
          }
     }

     //输出每个元素,注意要使用换行符
     for(i = 0;i < n;i++)
     {
    
    
          for(j = 0;j <= i;j++)
          {
    
    
               printf("%6d",a[i][j]);
          }
               printf("\n");
     }

     return 0;
}

四、二维数组做函数参数

若将一个二维数组作为实际参数传递给函数,只需不带方括号的数组名即可;
因为数组名代表数组首元素的地址,因此数组名作参数就可以将数组的起始地址传递给形参。

/*声明形参数组时可以忽略第一维的长度,如:*/
int SumArr( int a[5][10]);
int SumArr( int a[][10]);

//不能省略除第一维之外的其他维数组,
//因为多维数组在C语言的存储方式是“先行后列”

一般情况下,数组实际元素的行数和列数,常常小于数组定义时指定的行数和列数,故传递数组时常常需要传递实际使用的行数和列数

而实际存储的是一个3行4列的矩阵:
则函数调用SumArr()计算该矩阵所有元素和时,调用语句可写为:SumArr(a,3,4);

例题:定义函数分别实现二维数组的输入、求和,并在main()中调用,完成二维数组的输入,并求出二维数组中所有元素的和。

#include<stdio.h>
#define N 20

void InputArr(int a[][N],int m, int n);
int SumArr(int a[][N],int m,int n);

int mian(void)
{
    
    
     int a[N][N];
     int m,i,n;

     printf("请输入函数m和列数n:\n");
     scanf("%d%d",&m,&n);

     printf("请输入%d行%d列\n",m,n);
     InputArr(a,m,n);

     printf("数组元素的和为:%d\n",SumArr(a,m,n));
     return 0;
}

void InputArr(int a[][N],int m, int n)
{
    
    
     int i,j;
     for(i = 0;i < m;i++)
     {
    
    
          for(j = 0;j < n;j++)
          {
    
    
               scanf("%d",&a[i][j]);
          }
     }
}

int SumArr(int a[][N],int m,int n)
{
    
    
     int i,j;
     int sum = 0;
     for(i = 0;i < m;i++)
     {
    
    
          for(j = 0;j < n;j++)
          {
    
    
               sum += a[i][j];
          }
     }
     return sum;
}

猜你喜欢

转载自blog.csdn.net/m0_46518461/article/details/106265319