1 / 1 / 0
Регистрация: 27.04.2020
Сообщений: 58
1

Добавление строк и столбцов в динамический двумерный массив

13.07.2020, 14:37. Показов 1893. Ответов 4
Метки нет (Все метки)

Добрый день. Есть задание: "Вставить перед всеми строками, в которых есть ноль, последнюю строку, а после всех столбцов, в которых есть отрицательные элементы – первый столбец."
Сделал такие функции:
Добавление строки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
void insertStr(int** matrix, int& str, int col, int strIndex)
{
    str++;
    // выделение памяти под матрицу A
    int** A = new int* [str];
    for (int i = 0; i < str; i++)
    {
        A[i] = new int[col];
    }
    int z = 0; // индекс, чтобы идти по строкам первой матрицу
    // заполнение матрицы A
    for (int i = 0; i < str; i++)
    {
        if (z == strIndex)
        {
            A[i] = A[str - 1];
            i++;
        }
        for (int k = 0; k < col; k++)
        {
            A[i][k] = matrix[z][k];
        }
        z++;
    }
    // чистка основной матрицы
    for (int i = 0; i < str - 1; i++)
    {
        delete[] matrix[i];
    }
    delete[] matrix;
    // выделение памяти под новую основную матрицы
    matrix = new int* [str];
    for (int i = 0; i < str; i++)
    {
        matrix[i] = new int[col];
    }
    // заполнение основной матрицы
    for (int i = 0; i < str; i++)
    {
        for (int k = 0; k < col; k++)
        {
            matrix[i][k] = A[i][k];
        }
    }
    // чистка матрицы A
    for (int i = 0; i < str; i++)
    {
        delete[] A[i];
    }
    delete[] A;
}
Добавление столбца:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void insertCol(int** matrix, int str, int& col, int colIndex)
{
    col++;
    // выделение памяти под матрицу A
    int** A = new int* [str];
    for (int i = 0; i < str; i++)
    {
        A[i] = new int[col];
    }
    int z = 0; // индекс, чтобы идти по столбцам первой матрицу
    // заполнение матрицы A
    for (int k = 0; k < col; k++)
    {
        if (k == colIndex)
        {
            for (int i = 0; i < str; i++)
            {
                A[i][k] = matrix[i][0];
            }
            k++;
        }
        for (int i = 0; i < str; i++)
        {
            A[i][k] = matrix[i][z];
        }
        z++;
    }
    // чистка основной матрицы
    for (int i = 0; i < str; i++)
    {
        delete[] matrix[i];
    }
    delete[] matrix;
    // выделение памяти под новую основную матрицы
    matrix = new int* [str];
    for (int i = 0; i < str; i++)
    {
        matrix[i] = new int[col];
    }
    // заполнение основной матрицы
    for (int i = 0; i < str; i++)
    {
        for (int k = 0; k < col; k++)
        {
            matrix[i][k] = A[i][k];
        }
    }
    // чистка матрицы A
    for (int i = 0; i < str; i++)
    {
        delete[] A[i];
    }
    delete[] A;
}
И выполнение самого задания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void task3(int** matrix, int& str, int& col) // задание 3 
{
    for (int i = 0; i < str; i++)
    {
        for (int k = 0; k < col; k++)
        {
            if (matrix[i][k] == 0)
            {
                insertStr(matrix, str, col, i);
                i+=2;
                k = col;
            }
        }
    }
    for (int k = 0; k < col; k++)
    {
        for (int i = 0; i < str; i++)
        {
            if (matrix[i][k] < 0)
            {
                insertCol(matrix, str, col, k);
                k += 2;
                i = str;
            }
        }
    }
}
При выполнении программа вызывает исключение. Возможно где-то накосячил с индексами или памятью, но не могу найти. Подскажите в чем может быть проблема?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2020, 14:37
Ответы с готовыми решениями:

Добавление строк/столбцов в двумерный массив
Нужно создать двумерный динамический массив и сделать функцию которая будет добавлять строку или...

Двумерный динамический массив: добавить К столбцов в начало
1. Создайте двумерный динамический массив, имеющий m строк и n столбцов (m и n вводятся с...

Добавление элементов в динамический двумерный массив
Помогите пожалуйста, не могу понять в чем ошибка. Функция должна добавлять в массив столбец после...

Добавление строки/столбца в двумерный динамический массив
Всем доброго вечера. Подскажите , пожалуйста , как в 2 мерный динамический массив добавить строку...

4
5 / 5 / 2
Регистрация: 12.07.2020
Сообщений: 14
13.07.2020, 14:59 2
Какое исключение?

Добавлено через 7 минут
Please read and follow the rules! http://forums.codeblocks.org/i... 996.0.html

Please post a full rebuild log if you think it is a CB problem with the compiler. http://wiki.codeblocks.org/ind... _forums.3F

Please do NOT post anything if you think the problem is your bad code.

Link to your likely problem in your code: http://mingw.5.n7.nabble.com/l... d9316.html
0
1 / 1 / 0
Регистрация: 27.04.2020
Сообщений: 58
13.07.2020, 15:08  [ТС] 3

wntdll.pdb содержит отладочную информацию, необходимую для поиска исходного кода для модуля ntdll.dll
Ещё не сталкивался с таким. Обычно показывает строку, где было исключение. А тут только это. До того как начал использовать эти функции, программа работала нормально
0
5 / 5 / 2
Регистрация: 12.07.2020
Сообщений: 14
13.07.2020, 15:22 4
Я не понимаю где здесь может быть ошибка!!
0
2414 / 1160 / 429
Регистрация: 08.11.2016
Сообщений: 3,232
13.07.2020, 17:55 5
Ani_pr, 1 если вы хотите модифицировать исходную матрицу передавайте ее в функцию по указателю:
C++
1
int insertColumn(int ** &matr, ...)
2. зачем Вы дважды выделяете память? для вставки строки алгоритм следующий:
2.1. выделяете память под массив с расчетом +1 строка по новому указателю
2.2 копируете содержимое исходного массива в новый пропуская в новом массиве строку которую надо вставить
2.3 освобождаете память по исходному указателю
2.4 исходному указателю присваиваете значение нового указателя

пример: вставляем в исходный массив новую строку равную нулевой, по заданному индексу ins_i
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void insertRow(int ** &matr, int cols, int rows, int ins_i)
{
    int ** tmp = new int*[rows + 1];
    for (int i = 0; i < rows; ++i)
    {
        tmp[i] = new int[cols];
        int ix = i;
        for (int j = 0; j < cols; ++j)
        {
            if (i > ins_i)
                ++ix;
            if (i == ins_i)
                tmp[i][j] = matr[0][j];
            else
                tmp[ix][j] = matr[i][j];
    }
    for (int i = 0; i < rows; ++i)
        delete[] matr[i];
    delete[] matr;
 
    matr = tmp;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 17:55
Помогаю со студенческими работами здесь

Добавление столбцов в двумерный массив
Уже всю голову сломал как написать подпрограмму для обрабатывающей части? Помогите пожалуйста...

Добавление строки в двумерный динамический массив (исправить ошибки)
Выкладываю лаб. Помогите исправить ошибки в функции с добавлением строки в двумерный динамический...

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

Двумерный динамический массив строк
Надо создать двумерный динамический массив размером 5x5 (5 ячеек, для 5 строк). Заполнить его...

Двумерный массив из 6 строк и 3 столбцов
Двумерный массив из 6 строк и 3 столбцов. - Вывести элементы 4 строки - Вывести элементы 2...

Двумерный массив из 6 строк и 3 столбцов
Двумерный массив из 6 строк и 3 столбцов. - Вывести элементы 4 строки - Вывести элементы 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru