直播带货服务

二维数组的定义和引用二维数组的元素

一维数组是若干个同一类型有序变量的集合,由一个数组名来描述。但在实际问题中有很多量(如二维表格等)数据是二维的或多维的,因此C语言允许构造多维数组多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。与一维数组不同,虽然一维数组能表示所有的数据,但不能表示出数据之间的分组关系,而二维数组可以表示数据间的二维表的关系。

二维数组的定义和引用二维数组的元素

1.二维数组的定义

二位数组通常用于存放矩阵形式的数据,如二维表格等数据。

定义二维数组的形式如下:

类型说明符数组名[常量表达式1][常量表达式2]

其中常量表达式1表示第一位下标的长度,常量表达式2标识第二维下表的长度。

例如:

int a[3][4]; /*3×4的矩阵,共12个元素*/

float f[5][10];

以上和一维数组相似,定义了一组变量,只不过这些变量有行和列的排列。

如int a[3][4]的排列如下:

a[0][0]    a[O][1]  a[0][2]  a[0][3]

a[1][0]    a[l][1]  a[1][2]  a[1][3]

a[2][0]    a[2][1]  a[2][2]  a[2][3]

以上是便于理解和引用的逻辑排列结构,在计算机的内存中,其物理存储结构会因为不同系统而不同。

C语言中,二维数组是按行排列的。即在内存中按顺序存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中的元素也是依次存放。如第一行最后一个元素a[0][N-1]紧邻第二行第一个元素a[1][0]。

2.引用二维数组的元素

二维数组的元素表示的形式为:

数组名[下标][下标]

【例5-6】学生成绩处理

假设第一小组5个学生3门课的成绩,如下表5-1所示,求全组平均成绩以及各门课的平均成绩。

表5-1 学生成绩表

学生 英语 数学 C语言

Stu1 80 77 76

Stu2 61 35 67

Stu3 56 75 70

Stu4 89 90 85

Stu5 85 67 73

分析:设定数组a,5行3列,用来存放学生的成绩,设定一维数组v,长度为3,用来存放每门课的总成绩。

程序的算法流程图如图5-6所示。

 二维数组的定义和引用二维数组的元素

图5-6 例5-6算法流程图

根据流程图写出的程序如下:

#include <stdio.h>

int main()

     int i,j,s=0,average,v[3],a[5][3]; 

     printf("input score:\n"); 

     for(i=0;i<3;i++)

     { 

     for(j=0;j<5;j++)

     { 

     scanf("%d",&a[j][i]); /*输入学生的成绩*/

     s=s+a[j][i];/*累加求出每一列上的所有元素之和*/

     } 

     v[i]=s/5; /*每门课的平均成绩*/

     s=0; 

     } 

     average=(v[0]+v[1]+v[2])/3; /*数组v中所有元素的平均值赋值给average*/

     printf("English languag:%d\nMath:%d\nc languag:%d\n",v[0],v[1],v[2]); 

     printf("total:%d\n", average ); 

     return 0; 

}

程序运行结果:

input score:

56 78 92 23 89↙

59 78 98 68 45↙

75 80 78 90 67↙

English languag:67

Math:69

c languag:78

total:71

3.二维数组的初始化

二维数组的初始化形式可以有:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12);    /*完全初始化*/

int a[][4]={1,2,3,4,5,6,7,8,9,10,1 1,12);    /*省略行的完全初始化*/

int a[3][4]={{1,2,3,4),{5,6,7,8),{9,10,11,12));

/*分行完全初始化,可读性较好*/

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

/*部分初始化,可以只对部分元素赋初值,未赋初值的元素自动取0值,数组a中各元素的值为:*/

1 0 0 0

2 0 0 0

3 0 0 0

【例5-7】打印杨辉三角

存储并打印杨辉三角的前10行。杨辉三角的具体形式为:

                              1

                           1     1

                        1     2     1

                     1    3     3      1

                  1     4     6     4     1

分析: 杨辉三角的特点为:

(1)第0列好对角线上的元素都为1;

(2)除第0列和对角线上的元素以外,其他元素的值均为前一行上的同列元素和前一列元素之和。

#include <stdio.h>

int main()

int s[10][10];

int i,j,k;

for(i=0;i<10;i++)/*为数组中的对角线和第0列元素赋值*/

s[i][i]=1;

s[i][0]=1;

}

for(i=2;i<10;i++)/*为其它元素赋值*/

for(j=1;j<i;j++)

s[i][j]=s[i-1][j-1]+s[i-1][j];

for(i=0;i<10;i++)

{

      for(k=i;k<10;k++)/*控制输出每行的空格*/

printf("");

for(j=0;j<=i;j++)

printf("%4d",s[i][j]);

printf("\n");

}

return 0; 

}

程序运行结果:

     1

     1   1

     1   2   1

     1   3   3   1

     1   4   6   4   1

     1   5  10  10   5   1

     1   6  15  20  15   6   1

     1   7  21  35  35  21   7   1

     1   8  28  56  70  56   28  8   1

     1   9  36  84 126 126 84  36  9   1

【例5-8】找出二维数组元素最值,有一个3 4的矩阵,求出每行最小值及每列的最小值。

分析:设定数组a,3行4列,由于共有3行,共有3个行最小值,可以设定一个长度为3的一维数组来保存每一行的最小值。同理,可以设定一个长度为4的一维数组来保存每一列的最小值。

#include <stdio.h>

int main()

     int a[3][4],b[3],c[4],i,j;

     for(i=0;i<3;i++)

     for(j=0;j<4;j++)

        scanf("%d",&a[i][j]);/*向数组a中输入数据*/

     for(i=0;i<3;i++)   /*判断行,求出每行最小值,存在数组b中*/

      {

        b[i]=a[i][0];

        for(j=1;j<4;j++)

        if(a[i][j]<b[i]) 

         b[i]=a[i][j];

     }

    for(j=0;j<4;j++) /*判断列,求出每列最小值,存在数组c中*/

    {

     c[j]=a[0][j];

     for(i=1;i<3;i++)

     if(a[i][j]<c[j]) 

     c[j]=a[i][j];

    }

    for(i=0;i<3;i++)

        printf("%5d",b[i]);

    printf("\n");

    for(j=0;j<4;j++)

       printf("%5d",c[j]);

    printf("\n");

    return 0; 

}

程序运行结果:

56  67  98  23↙

67  89  90  12↙

78  90  23  67↙

56  67  23  12


© Copyright 六六互联.Some Rights Reserved.www.ic.vip