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
相关产品推荐
相关产品推荐

