用二维数组作为函数的参数,实现并输出矩阵的转置和转置后矩阵副对角线元素之和。按如下函数原型编程计算。其中n的值由用户从键盘输入。使用ProduceMatrix函数生成n阶方阵,以start值作为矩阵的第一个元素a11 ,每行下一个元素比该行上一个元素大1,每行第一个元素比上一行最后一个元素大1.
例如n=3,start=3时ProduceMatrix生成的矩阵为:
3 4 5
6 7 8
9 10 11
已知m和n的取值范围为[1,30].函数原型为
void Transpose(int a[][N],int n);
void ProduceMatrix(int a[][N],int n,int start);
void PrintMatrix(int at[][N], int n);
int SumCounterDiagonal(int a[][N],int n); //求矩阵副对角线元素之和
输入提示信息:“Input n:\n” “Input %d*%d matrixs start element:\n”
输入格式:"%d"
输出提示信息和格式:“The transposed matrix is:\n”
“The sum of the matrix-counter-diagonal is:%d\n”
输出格式(输完矩阵的一行要换行):"%4d"
注意除了PrintMatrix外的输入输出均在main函数里面
#include<stdio.h>
#define N 30
void ProduceMatrix(int a[N][N], int n, int start);
void Transpose(int a[N][N], int n);
int SumCounterDiagonal(int a[N][N], int n);
void PrintMatrix(int a[N][N], int n);
int main(void)
{
int n, start, a[N][N];
printf("Input n:\n");
scanf_s("%d", &n);
printf("Input %d*%d matrixs start element:\n", n, n);
scanf_s("%d", &start);
ProduceMatrix(a, n, start);
}
void ProduceMatrix(int a[N][N], int n, int start)
{
int i, j, start_org=start-1;//从第一个元素开始赋值,简化循环运算,但要对初始值进行减一操作
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
a[i][j] = start_org + 1;
start_org++;
}
}
Transpose(a, n);
}
void Transpose(int a[N][N],int n)
{
int temp, i, j, c, flag = n-1;//从右下角对矩阵进行转置操作,用flag作为本行有多少个需要转置的元素,这里有个重要的矩阵转置思想:三角对换,参阅[添加链接描述](https://blog.csdn.net/weixin_42262738/article/details/107071403?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-2-107071403.nonecase&utm_term=%E8%BD%AC%E7%BD%AE%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D&spm=1000.2123.3001.4430)
for (i = 0; i < n; i++)
{
for (c = flag, j=n-1; c > 0; c--,j--)
{
temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
flag--;//自下而上,每行需要转置的元素逐行递减
}
PrintMatrix(a, n);
}
void PrintMatrix(int a[N][N], int n)
{
int i, j;
int sum;
sum = SumCounterDiagonal(a, n);
printf("The transposed matrix is:\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("The sum of the matrix-counter-diagonal is:%d\n", sum);
}
int SumCounterDiagonal(int a[N][N], int n)
{
int i, j, sum=0;
for (i = 0,j=n-1; i < n; i++,j--)
{
sum += a[i][j];
}
return sum;
}