C 语言实战:计算 3×3 矩阵对角线元素之和(主 / 副对角线拆解)
矩阵对角线求和是二维数组的经典应用场景,核心在于精准定位主、副对角线的元素位置。本文以 3×3 整型矩阵为例,详解主对角线(行号 = 列号)、副对角线(行号 + 列号 = 2)的定位逻辑,结合完整代码实现输入、计算、输出全流程,帮助掌握二维数组的遍历与条件判断技巧。
一、矩阵对角线核心规则
1. 3×3 矩阵的对角线定义
对于 3×3 矩阵matrix[3][3](行号i、列号j均从 0 开始):
- 主对角线:行号 = 列号(
i == j),对应元素为matrix[0][0]、matrix[1][1]、matrix[2][2]; - 副对角线:行号 + 列号 = 2(
i + j == 2),对应元素为matrix[0][2]、matrix[1][1]、matrix[2][0]; - 注意:中心元素
matrix[1][1]同时属于主、副对角线,求和时会被两次累加(符合常规计算逻辑)。
2. 程序设计要点
- 二维数组存储 3×3 矩阵,按行输入 9 个整数;
- 双层循环遍历所有元素,通过条件判断筛选主、副对角线元素;
- 分别累加主、副对角线和,最终输出各自结果及总和。
二、完整代码实现与解析
c
运行
/******************************
*文件名称:4.Integer_Matrix.c
*作者:czy
*邮箱:caozhiyang_0613@163.com
*创建日期:2025/12/29
*修改日期:
*文件功能:求一个 3*3 的整型矩阵对角线元素之和。
*核心思路:
* 1. 主对角线:行号 = 列号(i == j);
* 2. 副对角线:行号 + 列号 = 2(i + j == 2);
* 3. 分别累加主、副对角线元素,输出结果。
*****************************/
#include<stdio.h>
int main()
{
int matrix[3][3]; // 定义3×3整型矩阵
int m_sum=0; // 主对角线元素和,初始化为0
int s_sum=0; // 副对角线元素和,初始化为0
int i,j; // 循环变量:i=行号,j=列号
printf("===== 3×3矩阵对角线和计算 =====\n");
printf("请输入3×3矩阵的9个整数:\n");
// 步骤1:按行输入矩阵元素(用户友好型提示)
for(i=0;i<3;i++)
{
printf("请输入第%d行的3个元素:",i+1); // 行号从1开始,更符合用户习惯
for(j=0;j<3;j++)
{
scanf("%d",&matrix[i][j]); // 逐个读取每行的3个元素
}
}
// 步骤2:遍历矩阵,累加主、副对角线元素
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
// 主对角线:行号=列号
if(i==j)
{
m_sum+=matrix[i][j];
}
// 副对角线:行号+列号=2(3×3矩阵固定值)
if((i+j)==2)
{
s_sum+=matrix[i][j];
}
}
}
// 步骤3:输出计算结果(格式清晰,便于查看)
printf("\n==== 计算结果 ====\n");
printf("主对角线元素之和:%d\n", m_sum);
printf("副对角线元素之和:%d\n", s_sum);
printf("对角线元素总和:%d\n",m_sum+s_sum);
return 0;
}
三、核心模块拆解
1. 矩阵输入逻辑(双层 for 循环)
c
运行
for(i=0;i<3;i++)
{
printf("请输入第%d行的3个元素:",i+1);
for(j=0;j<3;j++)
{
scanf("%d",&matrix[i][j]);
}
}
- 外层循环控制行(0
2),内层循环控制列(02); - 提示信息中
i+1将程序内部的 “0 起始行号” 转换为用户习惯的 “1 起始行号”,提升输入体验; - 逐行输入 3 个元素,确保矩阵数据的有序存储。
2. 对角线元素筛选与累加
c
运行
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(i==j) m_sum+=matrix[i][j]; // 主对角线
if((i+j)==2) s_sum+=matrix[i][j]; // 副对角线
}
}
关键逻辑验证(以 3×3 矩阵为例):
| 行号 i | 列号 j | i==j(主对角线) | i+j==2(副对角线) | 元素归属 |
|---|---|---|---|---|
| 0 | 0 | 是 | 否(0+0=0≠2) | 主对角线 |
| 0 | 2 | 否 | 是(0+2=2) | 副对角线 |
| 1 | 1 | 是 | 是(1+1=2) | 主 + 副 |
| 2 | 0 | 否 | 是(2+0=2) | 副对角线 |
| 2 | 2 | 是 | 否(2+2=4≠2) | 主对角线 |
3. 结果输出
c
运行
printf("\n==== 计算结果 ====\n");
printf("主对角线元素之和:%d\n", m_sum);
printf("副对角线元素之和:%d\n", s_sum);
printf("对角线元素总和:%d\n",m_sum+s_sum);
- 分层次输出结果,明确区分主、副对角线和及总和,便于验证计算正确性;
- 空行和分隔符提升输出格式的可读性。
四、运行结果示例
输入示例
plaintext
===== 3×3矩阵对角线和计算 =====
请输入3×3矩阵的9个整数:
请输入第1行的3个元素:1 2 3
请输入第2行的3个元素:4 5 6
请输入第3行的3个元素:7 8 9
输出示例
plaintext
==== 计算结果 ====
主对角线元素之和:15
副对角线元素之和:15
对角线元素总和:30
结果验证
- 主对角线元素:1(0,0)+5(1,1)+9(2,2)=15;
- 副对角线元素:3(0,2)+5(1,1)+7(2,0)=15;
- 总和:15+15=30,与程序输出一致。
五、扩展优化思路
1. 适配任意 n×n 矩阵(通用化)
将固定 3×3 改为用户输入矩阵大小,适配任意方阵的对角线求和:
c
运行
int n;
printf("请输入矩阵的阶数(n×n):");
scanf("%d", &n);
if(n <= 0) { printf("阶数必须为正整数!"); return 1; }
// 动态内存分配(避免变长数组兼容性问题)
int **matrix = (int**)malloc(n * sizeof(int*));
for(int i=0; i<n; i++)
{
matrix[i] = (int*)malloc(n * sizeof(int));
}
// 输入逻辑(适配n行n列)
for(i=0; i<n; i++)
{
printf("请输入第%d行的%d个元素:", i+1, n);
for(j=0; j<n; j++)
{
scanf("%d", &matrix[i][j]);
}
}
// 对角线求和(副对角线条件改为i+j == n-1)
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(i==j) m_sum += matrix[i][j];
if(i+j == n-1) s_sum += matrix[i][j];
}
}
// 释放动态内存
for(int i=0; i<n; i++) free(matrix[i]);
free(matrix);
2. 去重中心元素(可选需求)
若需避免中心元素重复累加(如 3×3 矩阵的matrix[1][1]),可修改条件:
c
运行
if(i==j)
{
m_sum += matrix[i][j];
// 副对角线排除主对角线元素
if(i+j != 2) s_sum += matrix[i][j];
}
else if(i+j == 2)
{
s_sum += matrix[i][j];
}
修改后示例结果:主对角线和 15,副对角线和 10(3+7),总和 25。
六、新手避坑指南
- 行 / 列号起始值错误:用户输入习惯行号从 1 开始,但程序内数组下标从 0 开始,需注意转换;
- 副对角线条件错误:误将副对角线条件写为
i-j == 2或i+j == 3,3×3 矩阵固定为i+j == 2; - 累加变量未初始化:
m_sum/s_sum未赋值 0,初始为随机数,导致结果错误; - 输入格式错误:输入每行元素时未按 “3 个整数” 输入(如少输 / 多输),导致后续元素读取错位。