C 语言实战:计算 3×3 矩阵对角线元素之和(主 / 副对角线拆解)

90 阅读6分钟

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]);
    }
}
  • 外层循环控制行(02),内层循环控制列(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列号 ji==j(主对角线)i+j==2(副对角线)元素归属
00否(0+0=0≠2)主对角线
02是(0+2=2)副对角线
11是(1+1=2)主 + 副
20是(2+0=2)副对角线
22否(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. 行 / 列号起始值错误:用户输入习惯行号从 1 开始,但程序内数组下标从 0 开始,需注意转换;
  2. 副对角线条件错误:误将副对角线条件写为i-j == 2i+j == 3,3×3 矩阵固定为i+j == 2
  3. 累加变量未初始化m_sum/s_sum未赋值 0,初始为随机数,导致结果错误;
  4. 输入格式错误:输入每行元素时未按 “3 个整数” 输入(如少输 / 多输),导致后续元素读取错位。