本文适合初学者,通过本文你可以迅速了解二维数组的相关的一系列知识点。为了让读者更好的巩固理解本文所学知识,在文章末尾也是提供了多个案例以供练手,参考。
这篇文章的大体内容,是半年前就写完了,然后就一直仍在草稿箱吃灰,今天加以补充完善,但是因为时间过的太久,所以风格可以略有不同(比如编辑器的使用),还望谅解。再补充一句,现在CSDN好像引入了AI检测,要求加上前言,不然就会给我弹出改进质量这个标签。读过我往期的文章就知道我一般是直接上干货的,也许我才识浅陋,但我对写文章的态度还是很认真的,所以我不想被AI赋予这个标签。以后文章可能都会加入前言,帮助读者快速明确,本文是否匹配自己需求。
一.二维数值数组的定义
定义形式:
类型说明符 数组名[常量表达式1][常量表达式2];
二维数值数组的理解:
二维数值数组从逻辑上可理解为行-列矩阵。二维数值数组可以看成是一种特殊的一维数值数组:即它的元素又是一个一维数值数组。
例如,二维数组a[3][4],可以看成一个一维数组,它有3个元素a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。
二.二维数值数组元素的引用
数组名[下标1][下标2];
- 下标可以是整型表达式,如:a[2-1][2*2-1]
- 下标可以是已经有值的变量或数组元素,如: a[2*x-1][b[3][1]]
PS:引用数组元素时,数组元素的下标应在已定义数组的大小范围内。
三.二维数值数组的存储
存放顺序:按行连续存放先顺序存放第0行的元素再存放第1行的元素。
四.二维数值数组的初始化
-
按行给二维数组赋初值,如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12]
-
按排列顺序对各元素赋初值,如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
-
按行赋值,可对部分元素赋初值,其余自动取0值,如:int a[3][4]={{1},{5,6},{9}};
PS:
-
若对全部元素赋初值,则定义数组时可不说明第一维的长度(一对方括号不能省),第二维的长度必须指明。如:int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
-
(2)在按行赋初值时,也可以省略第一维的长度说明。如:int a[ ][4]={{1,2,3},{0},{0,10}];
五.二维数值数组的输入和输出
例如对int a[2][3]进行操作。
输入方法:
输入第i行第j列元素
scanf("%d",&a[i][jD);
输入所有数组元素
for (i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][jD);
输出方法:
输出第i行第j列元素
printf("%d",a[i]lj]);
输出所有数组元素
for (i=0;i<2;i++)
for(j=0;j<3;j++)
printf("%d",a[i][j]);
原则:只能逐个对数组元素进行操作。
六.二维数值数组的应用
例1.将一个二维数组a中的行和列的元素互换,存到另一个二维数组b中(转置)后输出。
问题分析:
- 定义数组a为2行3列,并初始化。
- 定义数组b为3行2列。
- 用二重循环进行转置。
- b[j][i]=a[i]Lj]。
- 输出b数组,且需要每输出两数换行一次。
代码如下:
#include<stdio.h>
void main()
{
int a[2][3]={1,2,3,4,5,6},b[3][2],i,j,n=0;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
b[j][i]=a[i][j];
for(i=0;i<3;i++)
for(j=0;j<2;j++)
{
printf("%d",b[i][j]);
n++;
if(n%2==0)
printf("\n");
}
}
例2.已知N名同学M门课程的成绩,求每门课程的平均成绩。
问题分析:
1.定义一个M行N列的二维数组score,用来存放M门课程N名同学的成绩;
2.再定义一个长度为M的一维数组ave,存放每门课程的平均成绩;
3.利用双层循环求出每门课程的平均成绩,并存入ave中;
4.输出一维数组ave中的各元素的值。
代码如下:
#include <stdio.h>
#define M 2
#define N 3
int main()
{
int score[M][N];
float ave[M];
int i = 0, j = 0;
printf("请输入学生的成绩:");
for (i = 0;i < M;i++)
for (j = 0;j < N;j++)
{
scanf_s("%d", &score[i][j]);
}
for (i = 0;i < M;i++)
{
float sum = 0;
float avrage = 0;
for (j = 0;j < N;j++)
{
sum += score[i][j];
}
avrage = sum / (j + 1);
ave[i] = avrage;
}
for (i = 0;i < M;i++)
{
printf("第%d门课的平均分是:%.2f\n", i + 1, ave[i]);
}
return 0;
}
例3.有一个3×4的二维数组a,要求编程求出其最大值以及其所在的行号和列号。
问题分析:
采用“打擂台算法
①将a[0][0]作为参考赋给max,将其行列下标分别赋给b和c。
②然后将其它元素依次与max比较,遇到比max大的就将其赋给max,行列下标分别赋给b=i、c=j。
③全部比较完毕,则max便是最大元素,b、c就是其所在行列值。
代码如下:
#include <stdio.h>
int main()
{
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int i, j, b,c;
int max = a[0][0];
for (i = 0;i < 3;i++)
for (j = 0;j < 4;j++)
{
if (a[i][j] > max)
{
max = a[i][j];
b = i;
c = j;
}
}
printf("max=%d,行号是:%d,列号是:%d",max,b,c);
return 0;
}