用二维数组作为函数的参数,实现并输出矩阵的转置和转置后矩阵副对角线元素之和

用二维数组作为函数的参数,实现并输出矩阵的转置和转置后矩阵副对角线元素之和。按如下函数原型编程计算。其中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;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43888800/article/details/110082693
今日推荐