零基础入门学习C语言007讲:数组(2)

╰+攻爆jí腚メ 2022-04-24 19:36 409阅读 0赞

二维数组的定义和引用

二维数组的定义

二维数组定义的一般形式为

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

例如:定义a为3*4(3行4列)的数组,b为5*10(5行10列)的数组。如下:

float a [3][4], b [5][10];

不能写成 float a [3,4], b [5,10];

例如:

int a[3][4];

说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3*4个,即:

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

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

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

我们可以把二维数组看做是一种特殊的一维数组:它的元素又是一个一维数组。

例如,可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU2MzE4_size_16_color_FFFFFF_t_70

二维数组在概念上是二维的,但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。

如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。

衍生:多维数组的定义

有了二维数组的基础,那么多维数组如何定义呢?

定义三维数组:float a[2][3][4];

多维数组元素在内存中的排列顺序:第一维的下标变化最慢,最右边的下标变化最快。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU2MzE4_size_16_color_FFFFFF_t_70 1

二维数组元素的引用和初始化

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

我们有4种方法对二维数组初始化:

(1) 直接分行给二维数组赋初值。如:

  1. **int a3][4]=\{ \{1234\}\{5678\}\{9101112\}\};**

(2) 可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如:

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

(3) 可以对部分元素赋初值。如:

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

20190429194700554.png

也可以对各行中的某一元素赋初值,如

  1. **int a3][4]=\{ \{1\}\{06\}\{0011\}\};**

20190429194719655.png

其实也可以只对某几行元素赋初值。如:

  1. **int a3][4]=\{ \{1\}\{56\}\};**

20190429194732644.png

(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:

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,11,12};

在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:

int a[][4]={ {0,0,3},{},{0,10}};

20190429194839608.png

例题:如图,一个学习小组有5个人,每个人有三门课的考试成绩。将各个数据保存到二维数组a[5][3]中,并求全组分科的平均成绩和总平均成绩。

20190429194928735.png

对数组a[5][3]:

1) 按行分段赋值可写为:

  1. int a\[5\]\[3\]=\{ \{80,75,92\},\{61,65,71\},\{59,63,70\},\{85,87,90\},\{76,77,85\} \};

2) 按行连续赋值可写为:

  1. int a\[5\]\[3\]=\{ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85\};

这两种赋初值的结果是完全相同的。

  1. #include <stdio.h>
  2. void main()
  3. {
  4. int i, j, s = 0, average, v[3];
  5. int a[5][3] = { { 80, 75, 92 }, { 61, 65, 71 }, { 59, 63, 70 }, { 85, 87, 90 }, { 76, 77, 85 } };
  6. for (i = 0; i < 3; i++)
  7. {
  8. for (j = 0; j<5; j++)
  9. s = s + a[j][i];
  10. v[i] = s / 5;
  11. s = 0;
  12. }
  13. average = (v[0] + v[1] + v[2]) / 3;
  14. printf("math:%d\nc languag:%d\ndFoxpro:%d\n", v[0], v[1], v[2]);
  15. printf("total:%d\n", average);
  16. }

二维数组程序举例

NO.1 将一个二维数组行和列元素互换,存到另一个二维数组中。

i.e.将数组a[2][3]转化为数组b[3][2]

20190429195349204.png

  1. #include <stdio.h>
  2. void main()
  3. {
  4. int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
  5. int b[3][2], i, j;
  6. printf("array a : \n");
  7. for (i = 0; i <= 1; i++)
  8. {
  9. for (j = 0; j <= 2; j++)
  10. {
  11. printf("% 5d", a[i][j]);
  12. b[j][i] = a[i][j];
  13. }
  14. printf("\n");
  15. }
  16. printf("array b : \n");
  17. for (i = 0; i <= 2; i++)
  18. {
  19. for (j = 0; j <= 1; j++)
  20. {
  21. printf("% 5d", b[i][j]);
  22. }
  23. printf("\n");
  24. }
  25. }

NO.2 有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU2MzE4_size_16_color_FFFFFF_t_70 2

  1. #include <stdio.h>
  2. void main()
  3. {
  4. int i, j, row = 0, colum = 0, max;
  5. int a[3][4] = { { 1, 2, 3, 4 }, { 9, 8, 7, 6 }, { -10, 10, -5, 2 } };
  6. max = a[0][0];
  7. for (i = 0; i <= 2; i++)
  8. {
  9. for (j = 0; j <= 3; j++)
  10. {
  11. if (a[i][j]>max)
  12. {
  13. max = a[i][j]; row = i; colum = j;
  14. }
  15. }
  16. }
  17. printf("max = %d,row = %d,colum = %d\n", max, row, colum);
  18. } /*程序结束*/

NO.3 从键盘上输入9个整数,(对照九宫格的形式,输入三行,每行输入三个数) 保存在二维数组中,按数组原来位置输出第一行和第一列的所有元素。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU2MzE4_size_16_color_FFFFFF_t_70 3

  1. #include <stdio.h>
  2. void main()
  3. {
  4. int a[3][3];
  5. /*给二维数组动态初始化*/
  6. for (int i = 0; i < 3; i++)
  7. {
  8. for (int j = 0; j < 3; j++)
  9. {
  10. printf("a[%d][%d]=", i, j);
  11. scanf("%d", &a[i][j]);
  12. }
  13. }
  14. for (int i = 0; i < 3; i++)
  15. {
  16. for (int j = 0; j < 3; j++)
  17. {
  18. if (i == 1 || j == 1)
  19. {
  20. printf("%d\t", a[i][j]);
  21. }
  22. else
  23. {
  24. printf("\t");
  25. }
  26. }
  27. printf("\n");
  28. }
  29. } /*程序结束*/

发表评论

表情:
评论列表 (有 0 条评论,409人围观)

还没有评论,来说两句吧...

相关阅读