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

C语言3×3矩阵运算程序问题:浮点除法适配与双模式实现

解决方案

1. 仅让除法函数适配浮点数

可以只修改除法逻辑来处理浮点数结果,无需改动整个程序的整数矩阵结构。核心是通过强制类型转换将整数运算转为浮点运算,同时调整输出格式显示小数。

修改后的除法实现

// 避免用div作为函数名(标准库已有同名函数)
float matrix_element_div(int i, int k, int tabA[3][3], int tabB[3][3]) {
    // 处理除零错误
    if (tabB[i][k] == 0) {
        printf("错误:除数不能为0!\n");
        return 0.0;
    }
    // 强制将被除数转为float,避免整数除法截断
    return (float)tabA[i][k] / tabB[i][k];
}

对应输出调整

在main的switch语句中,针对除法改用%f格式符:

case 3: printf("|%d:%d| = %.2f\t", i, k, matrix_element_div(i, k, tabA, tabB));
    break;

2. 实现两种运行模式(预定义/用户输入)

模式切换失败源于函数调用语法错误和输入逻辑问题,以下是修复步骤:

修复输入函数

简化put函数,移除无用参数,改用直观的输入方式:

void input_matrix(int tabA[3][3], int tabB[3][3]) {
    printf("请输入矩阵A的9个元素(按行输入):\n");
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            scanf("%d", &tabA[i][k]);
        }
    }
    printf("请输入矩阵B的9个元素(按行输入):\n");
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            scanf("%d", &tabB[i][k]);
        }
    }
}

修复模式切换逻辑

在main中正确调用输入函数,无需重复声明参数类型:

int y; 
printf("选择运行模式:1=用户输入矩阵,0=使用预定义矩阵\n"); 
scanf("%d", &y);

int tabA[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} };
int tabB[3][3] = { {4, 5, 6}, {4, 5, 6}, {4, 5, 6} };

if (y == 1) {
    input_matrix(tabA, tabB);
}

3. 其他关键bug修复

运算函数的冗余调用问题

原代码中sum/dif/mul函数已计算完整矩阵,但在循环中重复调用9次,导致效率低下且返回值越界。修改为:

  • 让运算函数直接填充结果矩阵
  • 循环仅负责打印结果

修正后的加法函数示例

void matrix_sum(int tabD[3][3], int tabA[3][3], int tabB[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            tabD[i][k] = tabA[i][k] + tabB[i][k];
        }
    }
}

矩阵乘法逻辑修正

原代码实现的是元素-wise乘积,以下是正确的矩阵乘法:

void matrix_mul(int tabD[3][3], int tabA[3][3], int tabB[3][3]) {
    // 初始化结果矩阵为0
    for (int i = 0; i <3; i++) {
        for(int k=0; k<3; k++) {
            tabD[i][k] =0;
        }
    }
    // 行乘列求和
    for (int i = 0; i <3; i++) {
        for(int j=0; j<3; j++) {
            for(int k=0; k<3; k++) {
                tabD[i][j] += tabA[i][k] * tabB[k][j];
            }
        }
    }
}

完整修正后的代码

#include <stdio.h>

// 用户输入矩阵
void input_matrix(int tabA[3][3], int tabB[3][3]) {
    printf("请输入矩阵A的9个元素(按行输入):\n");
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            scanf("%d", &tabA[i][k]);
        }
    }
    printf("请输入矩阵B的9个元素(按行输入):\n");
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            scanf("%d", &tabB[i][k]);
        }
    }
}

// 矩阵加法
void matrix_sum(int tabD[3][3], int tabA[3][3], int tabB[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            tabD[i][k] = tabA[i][k] + tabB[i][k];
        }
    }
}

// 矩阵减法
void matrix_dif(int tabD[3][3], int tabA[3][3], int tabB[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int k = 0; k < 3; k++) {
            tabD[i][k] = tabA[i][k] - tabB[i][k];
        }
    }
}

// 矩阵元素除法(返回浮点结果)
float matrix_element_div(int i, int k, int tabA[3][3], int tabB[3][3]) {
    if (tabB[i][k] == 0) {
        printf("错误:除数不能为0!\n");
        return 0.0;
    }
    return (float)tabA[i][k] / tabB[i][k];
}

// 矩阵乘法
void matrix_mul(int tabD[3][3], int tabA[3][3], int tabB[3][3]) {
    for (int i = 0; i <3; i++) {
        for(int k=0; k<3; k++) {
            tabD[i][k] =0;
        }
    }
    for (int i = 0; i <3; i++) {
        for(int j=0; j<3; j++) {
            for(int k=0; k<3; k++) {
                tabD[i][j] += tabA[i][k] * tabB[k][j];
            }
        }
    }
}

int main() {
    int i, k;
    int y; 
    printf("选择运行模式:1=用户输入矩阵,0=使用预定义矩阵\n"); 
    scanf("%d", &y);

    int tabA[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} };
    int tabB[3][3] = { {4, 5, 6}, {4, 5, 6}, {4, 5, 6} };
    int tabD[3][3];

    if (y == 1) {
        input_matrix(tabA, tabB);
    }

    int x; 
    printf("选择运算:1=加法,2=减法,3=除法,4=乘法\n"); 
    scanf("%d", &x);

    // 预计算完整矩阵(除法除外)
    switch (x) {
        case 1: matrix_sum(tabD, tabA, tabB); break;
        case 2: matrix_dif(tabD, tabA, tabB); break;
        case 4: matrix_mul(tabD, tabA, tabB); break;
    }

    // 打印结果
    printf("运算结果:\n");
    for (i = 0; i < 3; i++) {
        for (k = 0; k < 3; k++) {
            switch (x) {
                case 1: case 2: case 4:
                    printf("|%d:%d| = %d\t", i, k, tabD[i][k]);
                    break;
                case 3:
                    printf("|%d:%d| = %.2f\t", i, k, matrix_element_div(i, k, tabA, tabB));
                    break;
                default:
                    printf("无效的运算选择!\n");
                    return 1;
            }
        }
        printf("\n");
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:57:10