Не получается реализовать добавление строки в двумерный динамический массив (вектор)

Перед строками, сумма элементов которых кратна У, вставить строку Х

Сделать я это хотела так: создать пустой двумерный вектор, затем в цикле вводить построчно массив, проверять сумму его элементов: если она кратна У, то сначала в двумерный добавить строку Х, а потом, что было введено с клавиатуры; иначе — просто добавить что было введено с клавиатуры. Вроде выглядит здраво, но вылетает окно с ошибкой. Помогите, пожалуйста, разобраться.

#include <string>
#include <fstream>
#include <iostream>
#include <vector>


using namespace std;


int main()
{
    setlocale(LC_ALL, "Russian");
    int n, y, x ;

    cout << "n = ";
    cin >> n;
    cout << endl << " y = ";
    cin >> y;

    vector< vector<int> > matrix;
    vector <int> dop;
    vector<int> row;
    cout << "Строка: " << endl;

    for (int i = 0; i < n; i++)
    {
        cin >> x;
        dop.push_back(x);
    }

    cout << "Массив: " << endl;

    int line, sum, fl;

    for (int i = 0; i < n; i++) {
    
        for (int j = 0; j < n; j++) {
            sum = 0;
            cin >> line;
            row.push_back(line); 

            for (int k = 0; k < n; k++)
                sum += row[k];
            if (sum % y == 0)
                fl = 1;
        
        if (fl) {
            matrix.push_back(dop);
            matrix.push_back(row);
            row.clear();
        }
        else {matrix.push_back(row); 
              row.clear();}
}
}
system("pause");
return 0;
}

Ответы (1 шт):

Автор решения: Zhihar

как-то вы усложнили все

  1. определяйте переменные только в той области, где они вам реально нужны

  2. не избегайте комментариев - они потом помогут

  3. не делайте лишнего функционала

код:

// получить размер матрицы
int n;
cout << "n = ";
cin >> n;

// получить число Y (для проверки кратности)
int y;
cout << endl << " y = ";
cin >> y;

// получить строку, которая будет вставляться в матрицу
vector <int> dop;
cout << "Строка: " << endl;

for (int i = 0; i < n; i++)
{
    int x;
    cin >> x;
    dop.push_back(x);
}

// сформировать матрицу
vector< vector<int> > matrix;
cout << "Массив: " << endl;

// пройтись по всем строкам
for (int i = 0; i < n; i++) {

    vector<int> row;
    int sum = 0;

    // пройтись по всем столбцах
    for (int j = 0; j < n; j++) {
        // ввести строку матрицы
        int line
        cin >> line;
        row.push_back(line);

        // подсчитать сумму ее элементов
        sum += line;
    }

    // если сумма кратно Y - добавить заданную ранее строку и текущую строку в матрицу        
    if (sum % y == 0)
        matrix.push_back(dop);

    // добавить текущий ряд
    matrix.push_back(row);
}

Ошибки в вашем коде были следующие:

    for (int j = 0; j < n; j++) {
        sum = 0;
        cin >> line;
        row.push_back(line); 

        for (int k = 0; k < n; k++)
            sum += row[k];
        if (sum % y == 0)
            fl = 1;

т.е. вы в цикле заполняли массив row, тут все ОК, но вы в этом же цикле уже считали сумму всех элементов массива row (от 0 до n), но вы еще не заполнили массив полностью!!!

т.е. минимум вам надо было делать так:

    for (int j = 0; j < n; j++) {
        cin >> line;
        row.push_back(line);
    }

    sum = 0;
    for (int k = 0; k < n; k++)
        sum += row[k];

    if (sum % y == 0)
        fl = 1;

и конечно проверять кратность суммы тоже надо было вне циклов (выше я это показал)

В общем:

  1. вы все засунули под один цикл, что делать нельзя было (ошибка)
  2. сделали лишние телодвижения, которых можно было бы не делать (усложнение кода)
  3. определяли переменные глобально из-за чего приходилось заботиться об их очистке (усложнение кода)
→ Ссылка