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

147
26 июня 2022, 07:20

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

#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;
}
Answer 1

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

  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. определяли переменные глобально из-за чего приходилось заботиться об их очистке (усложнение кода)
READ ALSO
Как использовать лямбды вместе с boost.asio?

Как использовать лямбды вместе с boost.asio?

Как можно заменить все boost::bind на лямбды в коде ниже??? Почему при попытке в функции accept заменить boost::bind на std::bind, компилятор выдает ошибку No matching...

185
Что возвращает boost::bind?

Что возвращает boost::bind?

Какого типа данных возвращаемое значение boost::bind? Я хочу сделать функцию, которая будет принимать в себя результат работы boost::bind, но я не знаю...

249
Не могу создать cookie на сайте, slim 3

Не могу создать cookie на сайте, slim 3

Нужно создать файлы cookie на сайте, я использую slim 3 и cookie создаётся в контроллереЯ уже пробовал создавать так:

278