C语言2x2矩阵四则运算:除法结果为0.0的问题求助
C语言2x2矩阵除法结果为0.0的问题解决
问题描述
已实现C语言中2x2矩阵的加法、减法、乘法功能,但除法运算结果始终显示为0.0。尝试将arrA和arrB改为float类型后,除法恢复正常,但加减乘功能出现异常。
原代码
#include <stdio.h> int main() { int arrA[2][2]; int arrB[2][2]; float arrSum[2][2]; float arrDiff[2][2]; float arrProd[2][2]; float arrQuo[2][2]; int i,j; //1st Matrix printf("Enter Elements of 1st Matrix\n"); for (i=1; i<3; i++) // size of rows { for(j=1; j<3; j++) // size of columns { printf("Enter a[%d][%d]: ",i,j); scanf("%d", &arrA[i][j]); // to get value and save to array[][] } //printf("\n"); } //Second Matrix printf("Enter Elements of 2nd Matrix\n"); for (i=1; i<3; i++) // size of rows { for(j=1; j<3; j++) // size of columns { printf("Enter b[%d][%d]: ",i,j); scanf("%d", &arrB[i][j]); // to get value and save to array[][] } //printf("\n"); } // Sum of Matrix printf("Sum of Matrix: \n"); for (i=1; i<3; i++) // size of rows { for(j=1; j<3; j++) // size of columns { arrSum[i][j] = arrA[i][j] + arrB[i][j]; printf("%.1f ", arrSum[i][j]); } printf("\n"); } //Difference of Matrix printf("Difference of Matrix: \n"); for (i=1; i<3; i++) // size of rows { for(j=1; j<3; j++) // size of columns { arrDiff[i][j] = arrA[i][j] - arrB[i][j]; printf("%.1f ", arrDiff[i][j]); } printf("\n"); } //Product of Matrix printf("Product of Matrix: \n"); for (i=1; i<3; i++) // size of rows { for(j=1; j<3; j++) // size of columns { arrProd[i][j] = arrA[i][j] * arrB[i][j]; printf("%.1f ", arrProd[i][j]); } printf("\n"); } //Quotient of Matrix printf("Quotient of Matrix: \n"); for (i=1; i<3; i++) // size of rows { for(j=1; j<3; j++) // size of columns { arrQuo[i][j] = arrA[i][j] / arrB[i][j]; printf("%.2f ", arrQuo[i][j]); } printf("\n"); } return 0; }
问题原因
- 整数除法截断结果:原代码中
arrA和arrB是int类型,执行arrA[i][j] / arrB[i][j]时会触发整数除法——只要被除数小于除数(如3/4),结果会被截断为0,再赋值给float类型的arrQuo,最终显示为0.0。 - 类型修改未同步输入格式:将
arrA和arrB改为float后,仍使用scanf("%d")读取输入,会导致内存解析错误,进而让加减乘运算结果异常。
解决方案
方案1:保持整数矩阵,除法时强制类型转换
无需修改矩阵类型,仅在除法运算时将其中一个操作数转为float,触发浮点数除法:
arrQuo[i][j] = (float)arrA[i][j] / arrB[i][j];
此方案改动最小,不影响原有加减乘功能。
方案2:统一使用float类型矩阵
将arrA和arrB改为float,同时修改scanf的格式符为%f,确保输入正确读取:
float arrA[2][2]; float arrB[2][2]; // ... scanf("%f", &arrA[i][j]); // ... scanf("%f", &arrB[i][j]);
此方案支持输入小数,所有运算逻辑统一为浮点数运算,结果更灵活。
修正后的代码(方案1示例)
#include <stdio.h> int main() { int arrA[2][2]; int arrB[2][2]; float arrSum[2][2]; float arrDiff[2][2]; float arrProd[2][2]; float arrQuo[2][2]; int i,j; // 输入第一个矩阵 printf("Enter Elements of 1st Matrix\n"); for (i=1; i<3; i++) { for(j=1; j<3; j++) { printf("Enter a[%d][%d]: ",i,j); scanf("%d", &arrA[i][j]); } } // 输入第二个矩阵 printf("Enter Elements of 2nd Matrix\n"); for (i=1; i<3; i++) { for(j=1; j<3; j++) { printf("Enter b[%d][%d]: ",i,j); scanf("%d", &arrB[i][j]); } } // 矩阵加法 printf("Sum of Matrix: \n"); for (i=1; i<3; i++) { for(j=1; j<3; j++) { arrSum[i][j] = arrA[i][j] + arrB[i][j]; printf("%.1f ", arrSum[i][j]); } printf("\n"); } // 矩阵减法 printf("Difference of Matrix: \n"); for (i=1; i<3; i++) { for(j=1; j<3; j++) { arrDiff[i][j] = arrA[i][j] - arrB[i][j]; printf("%.1f ", arrDiff[i][j]); } printf("\n"); } // 矩阵乘法(元素级) printf("Product of Matrix: \n"); for (i=1; i<3; i++) { for(j=1; j<3; j++) { arrProd[i][j] = arrA[i][j] * arrB[i][j]; printf("%.1f ", arrProd[i][j]); } printf("\n"); } // 矩阵除法(元素级) printf("Quotient of Matrix: \n"); for (i=1; i<3; i++) { for(j=1; j<3; j++) { // 强制转换为float触发浮点数除法 arrQuo[i][j] = (float)arrA[i][j] / arrB[i][j]; printf("%.2f ", arrQuo[i][j]); } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Khana Coralde
相关产品推荐
相关产品推荐

