任务描述
本关任务:编写一个能求出矩阵最大元素的小程序。
相关知识
为了完成本关任务,你需要掌握数组的声明和使用。
数组
数组是一种连续存储的数据结构。声明数组,只需在声明变量的基础上,在变量名的后面加上一对方括号([]
),然后在其中填上元素数量即可。
例如:
int a[10]; // 声明一个有 10 个 int 元素的数组
char b[1]; // 声明一个有 1 个 char 元素的数组
在声明数组的同时,可以使用花括号({}
)对其进行初始化,例如:
int a[2] = {1,2}; // 有两个元素的数组,分别为 1 和 2
花括号中的实际元素数量可以少于方括号中指定的数量,这样的话没有被指定的元素将会是这种类型的默认值,例如:
int a[3] = {1}; // 只指定了第一个元素,其他的都是默认值 0,即{1,0,0}
如果使用了花括号进行初始化,那么方括号中的元素数量也可以不写,编译器会根据花括号中的元素数量自动计算,例如:
int a[] = {1,2}; // 编译器自动计算为 int a[2]
char b[] = {0}; // 编译器自动计算为 char b[1]
二维数据
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。二维数组又称为矩阵,行列数相等的矩阵称为方阵。
二维数组的声明与一维数组的声明同理,只需在变量名后面加多个方括号就行。
例如:
int a[3][2]; // 可以看做是 3 个元素的数组,每个元素是一个 2 个元素的数组
二维数组也可以用花括号进行初始化,不过它的用法就更为灵活了,例如:
int a[3][2] = {{1,1},{2,2},{3,3}};
/*
嵌套花括号,内部的一个花括号代表 a 数组的一个元素,即:
{1,1}
{2,2}
{3,3}
*/
int b[3][2] = {1,2,3};
/*
平铺成一个 6 个元素的数组,即:
{1,2}
{3,0}
{0,0}
*/
数组的使用
要访问数组的某个元素,只需在数组变量的后面加上方括号,在方括号中填上从0开始的索引即可。
例如:
int a[5];
a[0] = 1; // 访问数组第一个元素,索引为 0
a[1] = a[0]; // 访问数组第二个元素,索引为 1
二维数组也是同理:
int a[3][2];
a[0][0] = 1;
a[1][0] = 2;
a[0][1] = 2;
与普通变量不同的是,数组变量之间不能赋值,但是可以将数组变量赋值给它的类型退化成的指针类型。所谓退化,就是将数组最左边一个维度变成指针(也可以说是指向第一个元素的指针)。
例如:
int a[2]; // 一维数组,退化后成 int* 类型
int *aptr = a; // 正确
int b[3][2]; // 二维数组,退化后是int (*)[2],即指向一个 2 个元素的数组的指针
int (*bptr)[2] = b; // 正确
int (*bptr2)[3] = b; // 错误,bptr2 的类型是指向一个 3 个元素的数组的指针
但当数组作为函数的参数类型时,编译器会将它变成它的退化类型,因此只要退化后的类型相同的数组变量都可以传递给这个参数,例如:
void F(int a[2])
{}
void F2(int a[3][2])
{}
int main()
{
int a[3],b[5];
F(a); // 正确,退化后的类型相同
F(b); // 正确,退化后的类型相同
int c[4][2],d[5][2];
F2(c); // 正确,退化后的类型相同
F2(d); // 正确,退化后的类型相同
}
既然编译器会退化数组类型,那么参数声明中最左边一个维度的数量也就可以省略了,上面的函数 F ,F2 可以写成如下方式:
void F(int a[]) // 不写数量
{}
// 或者直接写成指针 void F(int *a){}
void F2(int a[][2])
{}
//或者 void F2(int (*a)[2]){}
编程要求
在右侧编辑器中的Begin-End
之间补充代码,补充函数int MaxEle(int a[3][2],int *r,int *c)
,函数的功能是找出并返回矩阵 a(一个3行2列的矩阵)中最大的元素,并将它的行、列号通过后两个指针参数 r ,c 返回。
注意:行、列号均从 1 开始。同时,为了结果稳定,矩阵中保证不会有相同元素。
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:1 2 3 4 5 6
预期输出:6 3 2
测试输入:9 2 3 4 5 6
预期输出:9 1 1
int MaxEle(int a[3][2],int *r,int *c)
{
/********* Begin *********/
//返回最大元素和它所在的行、列号
int max = a[0][0];
int r1,c1;
int i,j;
for (i = 0; i < 3; i++){
for (j = 0; j < 2; j++){
if (max < a[i][j]){
r1 = i;
c1 = j;
max = a[i][j];
}
}
}
// *r += r1;
// *c += c1;
*r = r1 + 1;
*c = c1 + 1;
return max;
/********* End *********/
}