菜蛙


私信TA

用户名:hu2022

访问量:16289

签 名:

明日复明日,明日何其多。我生待明日,万事成蹉跎。

等  级
排  名 548
经  验 4387
参赛次数 0
文章发表 75
年  龄 0
在职情况 学生
学  校 哈工程
专  业

  自我简介:

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


主要步骤:

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分

12 人评分

  评论区

这个为什么显示答案错误啊
#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);
}
2023-08-10 09:57:58
我看了下上面写的“数组不能作为参数传递”这是错的啊!错的错的!!应该是“数组不能作为返回值”只是不能被return传递,做形参是Ok的~~不好意思不好意思,最近练习练习着才记起来有个地方写错了,但是不知道是哪个题目了,感谢楼上~
2022-08-21 10:08:16
b = &a[0][0];//将二维数组a的首地址赋值给指针b  ----------- 这一步有点不懂,为什么要这样做
2022-08-21 09:18:45
  • «
  • 1
  • »