题目:求三阶矩阵的主副对角线之和,并分别输出。


主要步骤:

1.输入三阶矩阵

2.对主对角线元素求和

3.对副对角线元素求和

4.分别输出


思路分析:

在主函数中输入矩阵,调用主对角线求和函数和副对角线求和函数求和并输出。

以主对角线求和函数MainDiagonal为例,由于要用到主函数中存储矩阵的二维数组,而数组是不能作为参数传递的,但指针却可以。

因此我们要在主函数中,用一个指针来指向数组的首地址,然后将这个指针作为求和函数的参数,实现矩阵数据的传递。

因此求和函数的形参,应设置为指针类型。

虽然一维数组和二维数组的书写方式不同,但它们在内存中都是线性存储的,如本题目中a[1][3]和a[2][1]的位置是相邻的,即b[2]指向a[1][3]的话,b[3]就指向a[2][1]。

所以在MainDiagonal求和函数内部进行求和时,需要按照一维函数的下标规则进行书写,最后将和返回到主函数即可。


参考代码:

#include<stdio.h>

//主对角线求和函数 
int MainDiagonal(int* a){
	int sum;	
	/*
	本函数的参数为指针
	相当于已经将二维数组一维化 
	对一维数组进行对应求和即可 
	*/ 
	sum = a[0]+a[4]+a[8];
	return sum;
}
//副对角线求和函数 
int CounterDiagonal(int *a){
	int sum;
	sum = a[2]+a[4]+a[6];
	return sum;
}

int main(void){
	int i,j;
	int a[3][3];
	int* b;
	
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			scanf("%d",&a[i][j]);
			//printf("%d ",a[i][j]);
		}
		//printf("\n");
	}
	
	b = &a[0][0];//将二维数组a的首地址赋值给指针b 
	
	printf("%d ",MainDiagonal(b));
	printf("%d",CounterDiagonal(b));
	return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

酸角 1年前 回复TA
这个为什么显示答案错误啊
#include<stdio.h>
main() {
	int s[3][3];
	int sum1 = 0, sum2 = 0, j = 0;

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%2d", &s[i][j]);
		}
	
	}
	for (int i = 0; i < 3; i++) {
		sum1 = s[i][i] + sum1;
	}
	for (int k = 2; k > -1; k--) {
			sum2 = s[j][k] + sum2;
			j++;
		}
		printf("%d %d", sum1, sum2);
}
菜蛙 2年前 回复TA
我看了下上面写的“数组不能作为参数传递”这是错的啊!错的错的!!应该是“数组不能作为返回值”只是不能被return传递,做形参是Ok的~~不好意思不好意思,最近练习练习着才记起来有个地方写错了,但是不知道是哪个题目了,感谢楼上~
菜蛙 2年前 回复TA
@敲代码 我这里形参用的指针类型(想练习下数组、指针在函数间传递数据的使用),让指针b指向二维数组的首地址,将b作为实参传给两个函数,进入函数体后就可以像处理指针那样处理数据了。二维数组也可以直接做形参,不过要注意第二维的维数一定要写上就好啦。
敲代码 2年前 回复TA
b = &a[0][0];//将二维数组a的首地址赋值给指针b  ----------- 这一步有点不懂,为什么要这样做