问题
阅读下列程序
void f30(int A[],int n)
{
int i,j,m;
for(i=1;i<n;i++)
for(j=0;j<i;j++)
{
m=A[i*n+j]; // A[i*n+j]与A[j*n+i]值交换
A[i*n+j]=A[j*n+i];
A[j*n+i]=m;
}
}
回答下列问题:
(1)已知矩阵
B
=
(
1
2
3
4
5
6
7
8
9
)
B=\left(\begin{array}{lll}1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9\end{array}\right)
B=⎝⎛147258369⎠⎞
将其按行优先存于一维数组A中,给出执行函数调用f30(A,3)后矩阵B的值;
(2)简述函数f30的功能。
分析
这其实是一道真题,难度大概如此。
第一问
明显就是阅读程序。执行f30(A,3),也就是A数组,n=3代入程序
for(i=1;i<n;i++);//i可以等于1,2
- i=1时,j只能等于0,所以函数体执行的是:
m=A[1*3+0];//m=A[3];
A[1*3+0]=A[0*3+1];//A[3]=A[1];
A[0*3+1]=m;//A[1]=m;很明显是一维数组对应的数2,4交换
也就是变成了这个样子:
B
=
(
1
4
3
2
5
6
7
8
9
)
B=\left(\begin{array}{lll}1 & 4 & 3 \\ 2 & 5 & 6 \\ 7 & 8 & 9\end{array}\right)
B=⎝⎛127458369⎠⎞
- i=2时,j=0,1,所以函数体执行的是:
- i=2,j=0时
m=A[2*3+0];//m=A[6];
A[2*3+0]=A[0*3+2];//A[6]=A[2];
A[0*3+2]=m;//A[2]=m;很明显是一维数组对应的数3,7交换
也就是变成了这个样子:
B
=
(
1
4
7
2
5
6
3
8
9
)
B=\left(\begin{array}{lll}1 & 4 & 7 \\ 2 & 5 & 6 \\ 3 & 8 & 9\end{array}\right)
B=⎝⎛123458769⎠⎞
- i=2,j=1时
m=A[2*3+1];//m=A[7];
A[2*3+1]=A[1*3+2];//A[7]=A[5];
A[1*3+2]=m;//A[5]=m;很明显是一维数组对应的数6,8交换
也就是变成了这个样子:
B
=
(
1
4
7
2
5
8
3
6
9
)
B=\left(\begin{array}{lll}1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9\end{array}\right)
B=⎝⎛123456789⎠⎞
最后一步就是矩阵的最终值,可见这种题就是将题目给出数据代入走一遍就行,难度不大
第二问
问f30()函数的功能。由矩阵最终变形可知,就是将原来的行转成列,专业名词就叫矩阵转置。所以函数的功能就是完成矩阵的转置。