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

版权声明:转载请标明出处 https://blog.csdn.net/qq_41556318/article/details/89681351

二维数组的定义和引用

二维数组的定义

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

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

例如:定义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个元素的一维数组。

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

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

衍生:多维数组的定义

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

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

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

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

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

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

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

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

(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}};

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

      int a[3][4]={{1},{0,6},{0,0,11}};

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

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

(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}};

例题:如图,一个学习小组有5个人,每个人有三门课的考试成绩。将各个数据保存到二维数组a[5][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};

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

#include  <stdio.h>
void 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);
}

  二维数组程序举例

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

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

#include <stdio.h>
void main()
{
	int  a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
	int  b[3][2], i, j;
	printf("array a : \n");
	for (i = 0; i <= 1; i++)
	{
		for (j = 0; j <= 2; j++)
		{
			printf("% 5d", a[i][j]);
			b[j][i] = a[i][j];
		}
		printf("\n");
	}
    printf("array b : \n");
	for (i = 0; i <= 2; i++)
	{
		for (j = 0; j <= 1; j++)
		{
			printf("% 5d", b[i][j]);			
		}
		printf("\n");
	}
}

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

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

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

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

	/*给二维数组动态初始化*/

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("a[%d][%d]=", i, j);			
			scanf("%d", &a[i][j]);
		}
	}
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (i == 1 || j == 1)
			{
				printf("%d\t", a[i][j]);
			}
			else
			{
				printf("\t");
			}
			
		}
		printf("\n");
	}
} /*程序结束*/

猜你喜欢

转载自blog.csdn.net/qq_41556318/article/details/89681351