矩阵求最小元素和行代码错误:输出首行而非正确行的排查与修复
矩阵最小和行查找代码问题分析与修复
问题描述
需要编写程序找出矩阵中元素和最小的行,若存在多个则返回第一个。但现有代码输入给定测试用例时,输出首行(1 3 2 54 234),正确结果应为索引为2的行(13 26 56 9 12)。
原代码
#include <iostream> using namespace std; int main() { int n, m, h; int arr[100][100]; cin >> n >> m; const int q = m; int ar[q]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> arr[i][j]; } } for (int i = 0; i<n; i++){ int sum = 0; for (int j = 0; j<m; j++){ sum += arr[i][j]; } for (int y=0; y<q; y++){ ar[y] = sum; } } int sammin = ar[0]; for (int i = 0; i<q; i++){ if (ar[i] < sammin){ h = i; } } for (int j = 0; j<m;j++){ cout << arr[h][j] << " "; } return 0; }
测试输入
4 5 1 3 2 54 234 75 12 3 46 9 13 26 56 9 12 14 90 897 6 34
错误分析
- 行和存储数组维度错误:需要存储
n行的和,但用列数m定义了数组ar的大小,当行数和列数不等时,直接导致存储逻辑混乱。 - 行和覆盖错误:计算完第
i行的和后,用循环将ar的所有元素都赋值为当前行的和,最终ar中只会保留最后一行的和,完全丢失了前面所有行的和数据。 - 索引变量未初始化:
h用来记录最小和行的索引,但未赋予初始值,当没有触发更新h的条件时,h的取值是未定义的,可能导致输出随机行。 - 最小和查找范围错误:循环遍历的是列数范围(
0到m-1),但实际应该遍历行数范围(0到n-1),因为要比较的是所有行的和。
修复后的代码
#include <iostream> using namespace std; int main() { int n, m, h = 0; // 初始化h为0,默认首行是最小和行 int arr[100][100]; cin >> n >> m; int ar[n]; // 数组大小改为n,存储n行的和 // 读取矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> arr[i][j]; } } // 计算每行的和并存储 for (int i = 0; i < n; i++){ int sum = 0; for (int j = 0; j < m; j++){ sum += arr[i][j]; } ar[i] = sum; // 直接将当前行的和存入对应位置,无需循环覆盖 } // 寻找最小和的行索引 int sammin = ar[0]; for (int i = 1; i < n; i++){ // 从第1行开始比较,避免重复比较首行 if (ar[i] < sammin){ sammin = ar[i]; h = i; } // 相等时不更新h,保证返回第一个出现的最小和行 } // 输出结果行 for (int j = 0; j < m; j++){ cout << arr[h][j] << " "; } return 0; }
说明
修复后的代码做了以下关键调整:
- 将存储行和的数组
ar大小改为n,匹配行数需求。 - 直接将每行的和存入
ar对应索引位置,不再覆盖所有元素。 - 初始化
h为0,确保初始状态正确。 - 遍历行数范围查找最小和,且仅当当前行和小于当前最小值时才更新索引,保证第一个出现的最小和行被保留。
内容的提问来源于stack exchange,提问作者22aroma
相关产品推荐
相关产品推荐

