Menu Close

C语言 – 二维数组和多维数组

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。

多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。

二维数组定义的一般形式是:

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

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

例如:

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]

二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。

但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。 如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。

在C语言中,二维数组是按行排列的。

即:

先存放 a[0]行,再存放 a[1]行,最后存放 a[2]行。每行中有四个元素也是依次存放。由于数组 a说明为 int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节。

 

二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为:

数组名[下标][下标]

其中下标应为整型常量或整型表达式。
例如:

a[3][4]

表示 a 数组三行四列的元素。

下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

例1. 一个学习小组有 5 个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩

 

可设一个二维数组 a[5][3]存放五个人三门课的成绩。

再设一个一维数组 v[3]存放所求得各分科平均成绩,设变量 average 为全组各科总平均成绩。

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;
   printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]);
   printf("total:%d\n", average );
}

 

程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以 5 送入 v[i]之中,这就是该门课程的平均成绩。

外循环共循环三次,分别求出三门课各自的平均成绩并存放在 v 数组之中。退出外循环之后,把 v[0],v[1],v[2]相加除以 3 即得到各科总平均成绩。最后按题意输出各个成绩。

二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。

例如对数组 a[5][3]:

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

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

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

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

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

例2.二维数组的赋值及平均分数的计算

main()
{
  int i,j,s=0, average,v[3];
  int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
  for(i=0;i<3;i++)
  {
     for(j=0;j<5;j++)
     s=s+a[j][i];
     v[i]=s/5;
     s=0;
  }
  average=(v[0]+v[1]+v[2])/3;
  printf("math:%d\nc languag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]);
  printf("total:%d\n", average);
}

二维数组初始化赋值注意事项

1) 可以只对部分元素赋初值,未赋初值的元素自动取 0 值。

例如:

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

是对每一行的第一列元素赋值,未赋值的元素取 0 值。 赋值后各元素的值为:
1 0 0
2 0 0
3 0 0

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

赋值后的元素值为:
0 1 0
0 0 2
3 0 0

2) 如对全部元素赋初值,则第一维的长度可以不给出。
例如:

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

可以写为:

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

3) 数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。

当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。

如二维数组 a[3][4],可分解为三个一维数组,其数组名分别为:
a[0]
a[1]
a[2]

对这三个一维数组不需另作说明即可使用。这三个一维数组都有 4 个元素,例如:
一维数组 a[0]的元素为 a[0][0],a[0][1],a[0][2],a[0][3]。

必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

例3.二维数组的存储和数据打印

// C program to store temperature of two cities of a week and display it.
#include <stdio.h>
const int CITY = 2;
const int WEEK = 7;
int main()
{
  int temperature[CITY][WEEK];

  // Using nested loop to store values in a 2d array
  for (int i = 0; i < CITY; ++i)
  {
    for (int j = 0; j < WEEK; ++j)
    {
      printf("City %d, Day %d: ", i + 1, j + 1);
      scanf("%d", &temperature[i][j]);
    }
  }
  printf("\nDisplaying values: \n\n");

  // Using nested loop to display vlues of a 2d array
  for (int i = 0; i < CITY; ++i)
  {
    for (int j = 0; j < WEEK; ++j)
    {
      printf("City %d, Day %d = %d\n", i + 1, j + 1, temperature[i][j]);
    }
  }
  return 0;
}

结果

City 1, Day 1: 33
City 1, Day 2: 34
City 1, Day 3: 35
City 1, Day 4: 33
City 1, Day 5: 32
City 1, Day 6: 31
City 1, Day 7: 30
City 2, Day 1: 23
City 2, Day 2: 22
City 2, Day 3: 21
City 2, Day 4: 24
City 2, Day 5: 22
City 2, Day 6: 25
City 2, Day 7: 26

Displaying values:

City 1, Day 1 = 33
City 1, Day 2 = 34
City 1, Day 3 = 35
City 1, Day 4 = 33
City 1, Day 5 = 32
City 1, Day 6 = 31
City 1, Day 7 = 30
City 2, Day 1 = 23
City 2, Day 2 = 22
City 2, Day 3 = 21
City 2, Day 4 = 24
City 2, Day 5 = 22
City 2, Day 6 = 25
City 2, Day 7 = 26

例4.两个矩阵的和

  // C program to find the sum of two matrices of order 2*2

#include <stdio.h>
int main()
{
  float a[2][2], b[2][2], result[2][2];

  // Taking input using nested for loop
  printf("Enter elements of 1st matrix\n");
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("Enter a%d%d: ", i + 1, j + 1);
      scanf("%f", &a[i][j]);
    }

  // Taking input using nested for loop
  printf("Enter elements of 2nd matrix\n");
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("Enter b%d%d: ", i + 1, j + 1);
      scanf("%f", &b[i][j]);
    }

  // adding corresponding elements of two arrays
  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      result[i][j] = a[i][j] + b[i][j];
    }

  // Displaying the sum
  printf("\nSum Of Matrix:");

  for (int i = 0; i < 2; ++i)
    for (int j = 0; j < 2; ++j)
    {
      printf("%.1f\t", result[i][j]);

      if (j == 1)
        printf("\n");
    }
  return 0;
}
 

结果

Enter elements of 1st matrix
Enter a11: 2;
Enter a12: 0.5;
Enter a21: -1.1;
Enter a22: 2;
Enter elements of 2nd matrix
Enter b11: 0.2;
Enter b12: 0;
Enter b21: 0.23;
Enter b22: 23;

Sum Of Matrix:
2.2 0.5
-0.9 25.0

例5.三维数组的赋值和打印

// C Program to store and print 12 values entered by the user

#include <stdio.h>
int main()
{
  int test[2][3][2];

  printf("Enter 12 values: \n");

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

  // Printing values with proper index.

  printf("\nDisplaying values:\n");
  for (int i = 0; i < 2; ++i)
  {
    for (int j = 0; j < 3; ++j)
    {
      for (int k = 0; k < 2; ++k)
      {
        printf("test[%d][%d][%d] = %d\n", i, j, k, test[i][j][k]);
      }
    }
  }

  return 0;
}

结果:

Enter 12 values:
1
2
3
4
5
6
7
8
9
10
11
12

Displaying Values:
test[0][0][0] = 1
test[0][0][1] = 2
test[0][1][0] = 3
test[0][1][1] = 4
test[0][2][0] = 5
test[0][2][1] = 6
test[1][0][0] = 7
test[1][0][1] = 8
test[1][1][0] = 9
test[1][1][1] = 10
test[1][2][0] = 11
test[1][2][1] = 12

 

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Leave the field below empty!

Posted in C语言教程

Related Posts