You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言矩阵计算代码逻辑错误:矩阵填充异常排查求助

解决固定尺寸矩阵填充与乘法异常问题

核心问题定位

  • 手动打印第二行及以后元素为0,但display函数正常,大概率是手动打印时索引逻辑错误,或是填充矩阵时循环变量/边界设置错误(比如行、列循环顺序搞反,或循环范围不匹配输入尺寸)。
  • 硬编码尺寸时乘法正常,说明动态输入尺寸后,填充过程未正确遍历所有元素。

正确的矩阵填充与验证代码示例

以下是符合要求(禁用指针/动态数组)的完整代码,重点修正填充与索引逻辑:

#include <stdio.h>

#define MAX_SIZE 100

int matrix_A[MAX_SIZE][MAX_SIZE];
int matrix_B[MAX_SIZE][MAX_SIZE];
int matrix_C[MAX_SIZE][MAX_SIZE];

// 矩阵填充:严格按行、列顺序遍历赋值
void fillMatrix(int mat[MAX_SIZE][MAX_SIZE], int rows, int cols) {
    printf("输入 %d 行 %d 列的矩阵元素:\n", rows, cols);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            // 索引必须为行i、列j,不能颠倒
            scanf("%d", &mat[i][j]);
        }
    }
}

// 矩阵打印(与填充逻辑一致)
void displayMatrix(int mat[MAX_SIZE][MAX_SIZE], int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }
}

// 矩阵乘法(已确认无问题,保留原逻辑)
void multiplyMatrices(int a[MAX_SIZE][MAX_SIZE], int b[MAX_SIZE][MAX_SIZE], int c[MAX_SIZE][MAX_SIZE], int a_rows, int a_cols, int b_cols) {
    // 初始化结果矩阵为0
    for (int i = 0; i < a_rows; i++) {
        for (int j = 0; j < b_cols; j++) {
            c[i][j] = 0;
            for (int k = 0; k < a_cols; k++) {
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
}

int main() {
    int m, n, p;
    printf("输入矩阵A的行数m、列数n:");
    scanf("%d %d", &m, &n);
    printf("输入矩阵B的列数p:");
    scanf("%d", &p);

    fillMatrix(matrix_A, m, n);
    fillMatrix(matrix_B, n, p);

    // 手动打印验证:完全复用display的循环逻辑,避免索引错误
    printf("\n手动验证矩阵A:\n");
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", matrix_A[i][j]);
        }
        printf("\n");
    }

    multiplyMatrices(matrix_A, matrix_B, matrix_C, m, n, p);

    printf("\n矩阵乘法结果:\n");
    displayMatrix(matrix_C, m, p);

    return 0;
}

关键错误排查点

  1. 填充索引顺序:若填充时写成mat[j][i](行、列索引颠倒),当输入的行、列数不等时,会导致大量元素未被正确赋值,出现手动打印异常。
  2. 循环边界匹配:手动打印时若用错循环边界(比如把列数当成行数),会误打印未赋值的默认0元素。
  3. 输入格式问题:输入元素时若换行/空格不符合scanf读取逻辑(比如连续多打换行),可能导致部分元素被误赋值为0。

验证步骤

  1. 填充后先用display函数打印,确认数据正确。
  2. 手动打印时完全复用display的循环逻辑,对比两者输出,若不一致则手动打印代码存在错误。
  3. 检查fillMatrix函数的循环变量,确保i遍历行、j遍历列,索引为mat[i][j]。

内容的提问来源于stack exchange,提问作者Yaman Tariq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:11:12