矩阵列求和程序Bug排查:为何仅输出最后一个矩阵的计算结果?
问题原因分析
- 数据覆盖问题:你只声明了一个
100x100的二维数组matrix,输入第二个矩阵时会直接覆盖第一个矩阵在数组中的存储位置,最终数组里仅保留最后一个矩阵的数据,输出时两个案例自然都调用了这组数据。 - 尺寸变量复用错误:
inp2用于存储每个矩阵的尺寸,但输入完所有矩阵后,它的值停留在最后一个矩阵的尺寸(即3)。输出第一个矩阵时,循环使用inp2=3,不仅用了错误的尺寸,还读取了数组中不属于第一个矩阵的元素。
修复方案
提供两种实用修复方式,可按需选择:
方案一:边输入边计算输出(内存更高效)
无需存储完整矩阵,输入元素时直接累加列和,输入完一个矩阵立即输出结果,从根源避免数据覆盖和尺寸变量问题:
#include <stdio.h> int main() { int x, y, z; int inp1, inp2; int col_sum[100]; // 存储每列的和 scanf("%d", &inp1); for(z = 0; z < inp1; z++){ scanf("%d", &inp2); // 初始化列和数组为0 for(x = 0; x < inp2; x++){ col_sum[x] = 0; } // 输入矩阵元素,同步累加列和 for(x = 0; x < inp2; x++){ for(y = 0; y < inp2; y++){ int num; scanf("%d", &num); col_sum[y] += num; } } // 输出当前矩阵的列和 printf("Case #%d:", z+1); for(x = 0; x < inp2; x++){ printf(" %d", col_sum[x]); } printf("\n"); } return 0; }
方案二:用三维数组存储所有矩阵(保留原始数据)
如果需要保留所有矩阵的原始数据,可使用三维数组存储,同时用单独数组记录每个矩阵的尺寸:
#include <stdio.h> int main() { int x, y, z; int inp1, inp2; int matrix[10][100][100]; // 最多存储10个100x100的矩阵 int sizes[10]; // 记录每个矩阵的尺寸 scanf("%d", &inp1); for(z = 0; z < inp1; z++){ scanf("%d", &inp2); sizes[z] = inp2; // 保存当前矩阵的尺寸 for(x = 0; x < inp2; x++){ for(y = 0; y < inp2; y++){ scanf("%d", &matrix[z][x][y]); } } } for(z = 0; z < inp1; z++){ printf("Case #%d:", z+1); int n = sizes[z]; // 获取当前矩阵的尺寸 for(x = 0; x < n; x++){ int sum = 0; for(y = 0; y < n; y++){ sum += matrix[z][y][x]; } printf(" %d", sum); } printf("\n"); } return 0; }
测试验证
用你提供的输入测试任意方案,输出都会符合预期:
Case #1: 2 4 Case #2: 6 7 8
内容的提问来源于stack exchange,提问作者Constellation
相关产品推荐
相关产品推荐

