C语言计算N*N矩阵的转置、平均值、对角线元素之和、周边元素之和

编程工具:Microsoft Visual C++ 2010学习版

程序获取:在最下方有完整代码。

或者关注公众号:码上言 回复:C语言矩阵即可获取工具和代码。

根据题目的意思,我们将题目中的四个功能拆分成以下四个函数来处理,最后由主函数调用。

我们的矩阵是自己从键盘输入或者自己定义好的矩阵。本文的是在主函数中写了个循环,我们自己手动输入矩阵,输入的方式是:数字+空格+回车。

N是我们定义的常量,我们是几阶的矩阵就将N设置多大。

#define N 3

第一种:矩阵的转置

int transp(int a[N][N])
{
	int i,j,b[N][N];
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			b[j][i]=a[i][j];
		}
	}
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++){
		   printf("%3d ",b[i][j]);
		}
		 printf("\n");
	}
	return 0;
}

第二种:矩阵的平均值

矩阵的平均值,就是矩阵的所有值相加,然后除以矩阵元素的个数。

这里的平均值函数返回值是一个double类型的。

double average(int a[N][N])
{
	int i,j;
	double avg,sum=0,count=0;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			sum += a[i][j];
			count++;
		}
	}
	avg = sum / count;
	return avg;
}

第三种:矩阵的对角线元素之和

对角线有两条对角线,分两种情况,一种是N*N矩阵的N为偶数,另一种是N为奇数,在偶数的时候,两条对角线没有相重复的数值,而为奇数的时候有一个交叉的数值重复,则需要再减一个交叉的数值。

例如:4*4矩阵N为偶数的矩阵示意图:对角线没有交叉的数据

11
11
11
11

例如:3*3矩阵N为奇数的矩阵示意图:对角线有交叉的数据

11
1
11

代码如下:

int diagonal_sum(int a[N][N])
{
	int i,j, s = 0;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			if(i == j)
			{
			  s += a[i][j];
			}
		}
		s += a[i][N-i-1];
	}
	if(N % 2 == 1)
	{
	  s -= a[N/2][N/2];
	}
	return s;
}

第四种:矩阵的周边元素之和

这个是矩阵周边所有数据的和。例如3*3的矩阵,周边的数据就有第1行、第3行的第2列到最后,第1列的第二行到第2行的1个,第3列的第2行最后一个到第2行的最后一个。

例如以下示意图:

111
11
111

代码如下所示:

int round_sum(int a[N][N])
{
	int i, s = 0;
	for (i = 0;i < N;i++)
		s += a[0][i] + a[N - 1][i]; //第一行和最后一行的数据
	for (i = 1;i < N - 1;i++)      
		s += a[i][0] + a[i][N - 1]; //第一列的第二个数开始和最后一列的第二个数开始
	return s;
}

以上就是四种函数,分别处理不同的情况。接下来我们会用主函数来调用输出结果:

具体代码如下:

void main()
{
	int a[N][N];
	int i,j;
	int sum1,sum2;
	double avg1;
    //手动输入的矩阵
	for(i = 0; i < N; i++){
		for(j = 0; j < N; j++){
		   scanf("%d",&a[i][j]);
		}
	}
	sum1 = round_sum(a); 
	printf("周边元素之和: %d\n",sum1);
	sum2 = diagonal_sum(a); 
	printf("对角线元素之和: %d\n",sum2);
	avg1 = average(a); 
	printf("平均数: %lf\n",avg1);
	printf("转置矩阵: \n");
	transp(a);
}

编写完成,好多人出现运行闪退的情况,可以按Ctrl+F5编译程序。

运行的结果如下:

 完整代码如下:

#include<stdio.h>
#include<math.h>
#define N 3

//编写四个函数,分别计算N*N矩阵转置、平均值、对角线元素之和、周边元素之和。在主程序中调用这四个函数并输出结果。N*N矩阵的数值从键盘输入。
//转置函数
int transp(int a[N][N])
{
	int i,j,b[N][N];
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			b[j][i]=a[i][j];
		}
	}
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++){
		   printf("%3d ",b[i][j]);
		}
		 printf("\n");
	}
	return 0;
}
//平均值
double average(int a[N][N])
{
	int i,j;
	double avg,sum=0,count=0;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			sum += a[i][j];
			count++;
		}
	}
	avg = sum / count;
	return avg;
}

//对角线元素之和
int diagonal_sum(int a[N][N])
{
	int i,j, s = 0;
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			if(i == j)
			{
			  s += a[i][j];
			}
		}
		s += a[i][N-i-1];
	}
	if(N % 2 == 1)
	{
	  s -= a[N/2][N/2];
	}
	return s;
}

//周边元素之和
int round_sum(int a[N][N])
{
	int i, s = 0;
	for (i = 0;i < N;i++)
		s += a[0][i] + a[N - 1][i]; //第一行和最后一行的数据
	for (i = 1;i < N - 1;i++)      
		s += a[i][0] + a[i][N - 1]; //第一列的第二个数开始和最后一列的第二个数开始
	return s;
}

void main()
{
	int a[N][N];
	int i,j;
	int sum1,sum2;
	double avg1;
	for(i = 0; i < N; i++){
		for(j = 0; j < N; j++){
		   scanf("%d",&a[i][j]);
		}
	}
	sum1 = round_sum(a); 
	printf("周边元素之和: %d\n",sum1);
	sum2 = diagonal_sum(a); 
	printf("对角线元素之和: %d\n",sum2);
	avg1 = average(a); 
	printf("平均数: %lf\n",avg1);
	printf("转置矩阵: \n");
	transp(a);
}

想要获取更多的学习资料和学习交流,请关注微信公众号:码上言,谢谢大家的支持!

  • 19
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值