矩形矩阵乘法C程序无结果输出问题及代码修正请求
修正后的矩阵乘法C程序
你的代码存在三个关键问题导致无法正确输出结果矩阵,以下是问题分析和修复后的完整代码:
问题分析
- 未初始化结果矩阵:
result数组在累加乘积和之前没有被初始化为0,计算时会使用内存中的垃圾值,导致结果错误。 - 结果矩阵打印使用未初始化变量:打印循环中用到的
r和c从未赋值,而结果矩阵的正确维度应为第一个矩阵的行数r1和第二个矩阵的列数c2。 - 缺少乘法合法性检查:未验证第一个矩阵的列数是否等于第二个矩阵的行数,这是矩阵乘法的必要前提,不满足时运算无意义。
修复后的代码
#include<stdio.h> int main() { int i,j,r1,c1,r2,c2,k,a[10][10],b[10][10],result[10][10]; printf("\n 输入第一个矩阵的行数和列数(1到10之间):"); scanf("%d%d",&r1,&c1); printf("\n 输入第二个矩阵的行数和列数(1到10之间,注意第一个矩阵的列数需等于第二个矩阵的行数才能相乘):"); scanf("%d%d",&r2,&c2); // 检查矩阵乘法合法性 if(c1 != r2){ printf("\n 无法进行矩阵乘法:第一个矩阵的列数必须等于第二个矩阵的行数!"); return 1; } printf("\n 输入第一个矩阵的元素:"); for(i=0;i<r1;i++){ for(j=0;j<c1;j++){ scanf("%d",&a[i][j]); } } printf("\n 第一个矩阵:\n"); for(i=0;i<r1;i++){ for(j=0;j<c1;j++){ printf("\t%d",a[i][j]); } printf("\n"); } printf("\n 输入第二个矩阵的元素:"); for(i=0;i<r2;i++){ for(j=0;j<c2;j++){ scanf("%d",&b[i][j]); } } printf("\n 第二个矩阵:\n"); for(i=0;i<r2;i++){ for(j=0;j<c2;j++){ printf("\t%d",b[i][j]); } printf("\n"); } // 初始化结果矩阵为0 for(i=0;i<r1;i++){ for(j=0;j<c2;j++){ result[i][j] = 0; } } // 矩阵乘法计算 for(i=0;i<r1;i++){ for(j=0;j<c2;j++){ for(k=0;k<c1;k++){ result[i][j] += a[i][k] * b[k][j]; } } } // 打印结果矩阵 printf("\n 两个矩阵相乘的结果:\n"); for(i=0;i<r1;i++){ for(j=0;j<c2;j++){ printf("\t%d",result[i][j]); } printf("\n"); } return 0; }
修复说明
- 初始化结果矩阵:在乘法计算前添加嵌套循环,将
result所有元素置为0,确保累加从正确的初始值开始。 - 修正打印循环变量:将打印结果时的
r和c替换为r1和c2,匹配结果矩阵的实际维度。 - 添加合法性检查:读取矩阵维度后立即验证
c1 == r2,不满足时输出错误信息并终止程序,避免无效运算。
内容的提问来源于stack exchange,提问作者GrowDiverse SARL
相关产品推荐
相关产品推荐

