Мне нужно написать код с инструкцией: Напишите программу, которая находит в матрице строку с минимальной суммой. Если таких строк несколько, найдите первую такую строку. Мой код:
#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
Код записывает первую строку, когда он должен вывести строку с индексом 2.
Примечание в int ar[q];q недостаточно постоянно. Из-за const int q=m;q нельзя изменить по сравнению со значением m, но m можно установить на любое значение, которое соответствует intat среде выполнения. q должно быть известно во время компиляции, чтобы соответствовать стандарту.





Для начала такие массивы переменной длины:
const int q=m;
int ar[q];
не являются стандартной функцией C++. Вместо этого вам следует использовать стандартный контейнер std::vector<int>.
В вашей матрице n строк. Таким образом, массив ar должен содержать элементы n вместо m.
Этот внутренний цикл for:
for (int y=0; y<q; y++){
ar[y] = sum;
}
заполняет все элементы массива ar одним и тем же значением sum на каждой итерации внешнего цикла. Вместо внутреннего цикла for вам нужно просто написать:
arr[i] = sum;
Поскольку массив благодаря внутреннему циклу содержит все элементы, равные сумме элементов последней строки матрицы, а сумма максимальна для введенной матрицы, то переменная h внутри этого цикла не изменяется:
int sammin = ar[0];
for (int i = 0; i<q; i++){
if (ar[i] < sammin){
h = i;
}
}
и остается равным 0.
Чтобы найти суммы строк, вы можете использовать стандартный алгоритм std::accumulate, объявленный в заголовке <numeric>. Чтобы найти строку с минимальной суммой, вы можете использовать стандартный алгоритм std::min_element, объявленный в заголовке <algorithm>.
Вот минимальная демонстрационная программа:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <numeric>
int main()
{
size_t n, m;
std::cin >> n >> m;
std::vector<std::vector<int>> matrix( n, std::vector<int>( m ) );
for (auto &row : matrix)
{
for (auto &item : row)
{
std::cin >> item;
}
}
std::vector<long long int> ar( n );
for (size_t i = 0; const auto &row : matrix)
{
ar[i++] = std::accumulate( std::begin( row ), std::end( row ), 0ll );
}
auto it = std::min_element( std::begin( ar ), std::end( ar ) );
auto pos = std::distance( std::begin( ar ), it );
for (const auto &item : matrix[pos] )
{
std::cout << item << ' ';
}
std::cout << '\n';
}
Каков ожидаемый результат для этого набора данных? Я бы посоветовал вам прекратить использовать однобуквенные переменные для всего. Если то, что они представляют, может иметь осмысленное имя, используйте его, чтобы вы и другие могли прочитать ваш код и понять, что он должен делать.