TransWikia.com

Добавить строку в динамический массив С++

Stack Overflow на русском Asked on January 24, 2021

Даны N – количество строк матрицы, M – количество столбцов матрицы
и сама матрица целых чисел. Добавить строку со всеми 0 после строки
с максимальным элементом
(массив динамический, дополнительных массивов не использовать)

Написал код, но вместо вставки одной строки, обнуляет значение и добавляет строку.
введите сюда описание изображения

#include <iostream>
using namespace std;

//инициализация массива
int** memory_init(int n, int m) {
    int** arr;
    arr = new int* [n];
    for (int i = 0; i < n; i++)
        arr[i] = new int[m];
    return arr;
}

//ввод массива
void input(int** arr, int n, int m) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> arr[i][j];
}

// вывод массива
void output(int** arr, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << arr[i][j] << " ";
    cout << endl;
    }
}

//добавление линии
int** add_line(int** arr, int *n, int m, int ind) {
    (*n)++;
    arr = (int**)realloc(arr, (*n) * sizeof(int*));
    for (int i = *n; i > ind; i--) {
        for (int j = 0; j < m; j++) {
            //копируем всю строку
            arr[i + 1] = arr[i];
        }
    }


    return arr;


}


int main()
{
    
    int** arr, n, m, temp, max_i=0;
    cout << "Inpute size of array" << endl;
    cin >> n >> m;
    arr = memory_init(n, m);
    input(arr, n, m);
    output(arr, n, m);
    temp = arr[0][0];
    //находим максимальный элемент
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (arr[i][j] > temp) {
                max_i = i;
                temp = arr[i][j];
            }
        }
    }
    cout << endl;
    cout << endl << " max i =" << max_i;
    cout << endl << " temp max =" << temp;
    arr = add_line(arr, &n, m, max_i);
 


    /*  */
    //обнуляем значение
    for (int j = 0; j < m; j++) {
        arr[max_i+1][j] = 0;
    }
    
    cout << endl;
    output(arr, n, m);

}

One Answer

У вас в функции add line есть несколько ошибок

//добавление линии
int** add_line(int** arr, int *n, int m, int ind) {
    (*n)++;
    arr = (int**)realloc(arr, (*n) * sizeof(int*));
    for (int i = *n; i > ind; i--) {
        for (int j = 0; j < m; j++) {
            //копируем всю строку
            arr[i + 1] = arr[i]; \ не используется индекс j, 
                       \просто происходит копирование указателей
             \значит и меняться они будут вместе
             \как у вас и произошло (обе строчки стали нулями)
             \
             \также при i = *n, i = *n - 1 происходит выход за границы массива
        }
    }
    return arr;
}

Так же вы смешиваете алокацию памяти в стиле си с алокацией памяти в стиле c++, что не является правильной практикой. Так же вы не освобождаете память в конце. И также возможна утечка памяти при realloc.

я бы переписал ваш код так

#include <iostream>
using namespace std;

//инициализация массива
int **memory_init(int n, int m) {
    int **arr;
    arr = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++)
        arr[i] = (int*)malloc(m * sizeof(int));
    return arr;
}

//ввод массива
void input(int **arr, int n, int m) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> arr[i][j];
}

// вывод массива
void output(int **arr, int n, int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << arr[i][j] << " ";
        cout << endl;
    }
}

//добавление линии
int **add_line(int **arr, int *n, int m, int ind) {
    (*n)++;
    int** new_arr = (int **)realloc(arr, (*n) * sizeof(int *));
    if (new_arr == nullptr) {
        (*n)--;
        throw std::exception("no memory");
    }
    arr = new_arr;
    arr[(*n) - 1] = (int *)malloc(m * sizeof(int));
    for (int i = (*n) - 2; i > ind; i--) {
        for (int j = 0; j < m; j++) {
            //копируем всю строку
            arr[i + 1][j] = arr[i][j];
        }
    }
    return arr;
}

//освобождение памяти
void memory_free(int ** arr, int n, int m) {
    for (int i = 0; i < n; i++)
        free(arr[i]);
    free(arr);
}


int main()
{
    int **arr, n, m, temp, max_i = 0;
    cout << "Inpute size of array" << endl;
    cin >> n >> m;
    arr = memory_init(n, m);
    input(arr, n, m);
    output(arr, n, m);
    temp = arr[0][0];
    //находим максимальный элемент
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (arr[i][j] > temp) {
                max_i = i;
                temp = arr[i][j];
            }
        }
    }
    cout << endl;
    cout << endl << " max i =" << max_i;
    cout << endl << " temp max =" << temp;

    try {
        arr = add_line(arr, &n, m, max_i);
    }
    catch (exception e) {
        memory_free(arr, n, m);
        cout << e.what() << endl;
        return 0;
    }

    /*  */
    //обнуляем значение
    for (int j = 0; j < m; j++) {
        arr[max_i + 1][j] = 0;
    }

    cout << endl;
    output(arr, n, m);
    memory_free(arr, n, m);
    return 0;
}

Правда этот код больше похож на код на си, чем на с++. Удобнее было бы не работать с памятью явно, а использовать std::vector.

Correct answer by Николай Алексеевич Терехов on January 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP