【题目描述】
请编写函数将二维数组先进行 行和列的转置,
再求出二维数组的交叉对角线的和,作为函数值返回。
在主函数中赋予二维数组的值,二维数组的值应该等于其对应的行和列之和的 a 倍,a 为自行输入。(二维数组为 MN,M 和 N 和符号常量确定),调用函数 进行计算,并且在主函数中输出,输入和输出应有相关的提示信息。*
#define _CRT_SECURE_NO_WARNINGS /*防止scanf使用报错*/
#include<stdio.h>
#define M 5
#define N 5
void assignValue(int arr[][N], int m, int n, int a);
void transArray(int arr[][N], int m, int n);
int calDiagSum(int arr[][N], int m, int n);
void printArray(int arr[][N], int m, int n);
int main()
{
int data[M][N] = { 0 };
int a, res = 0;
printf("请输入a进行赋值:a = ");
scanf("%d", &a);
assignValue(data, M, N, a); //赋值操作
printf("\n原矩阵数据如下:\n");
printArray(data, M, N);
printf("\n");
printf("转置后的矩阵为:\n");
transArray(data, M, N);
printArray(data, N, M);
res = calDiagSum(data, M, N);
printf("\n其两条对角线元素之和 = %d\n", res);
printf("\n");
return 0;
}
//为数组元素赋值
void assignValue(int arr[][N], int m, int n, int a)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
arr[i][j] = a * (i + j);
}
}
}
//转置矩阵
void transArray(int arr[][N], int m, int n)
{
int i, j, temp;
for (i = 0; i < n; i++)
{
for (j = 0; j < i; j++) //注意这里应该是j<i才正确
{
temp = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = temp;
}
}
}
//计算数组两条对角线上的元素之和
int calDiagSum(int arr[][N], int m, int n)
{
int res = 0, i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (i == j || i + j == m - 1)
{
res += arr[i][i];
}
}
}
return res;
}
//打印数组元素
void printArray(int arr[][N], int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%5d", arr[i][j]);
}
printf("\n");
}
}
有误请大家指正,或者有更好的写法也可以进行交流。