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

Помогите пожалуйста написать код. Нужно реализовать функции добавления/удаления столбца или строки в динамический двумерный массив в указанное пользователем место. Как добавить в конец понятно, а в указанное место не могу понять. Есть вот такая заготовочка


int** Create(int row, int col)
{
    int** arr;
    arr = new int * [row];
    for (int i = 0; i < row; i++)
    {
        arr[i] = new int[col];
    }
    return arr;
}
 
void Fill(int** arr, int hight, int width)
{
    for (int i = 0; i < hight; i++)
    {
        for (int j = 0; j < width; j++)
        {
            arr[i][j] = rand() % 100;
        }
    }
}
 
void Show(int** arr, int hight, int width)
{
    for (int i = 0; i < hight; i++)
    {
        for (int j = 0; j < width; j++)
        {
            cout << setw(3) << arr[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}
 
void Del(int** arr, int row)
{
    for (int i = 0; i < row; i++)
    {
        delete[]arr[i];
    }
    delete[]arr;
}
int main()
{
    srand(time(NULL));
    int width, hight;
    int choice;
    cout << "Enter width\n"; cin >> width;
    cout << "Enter hight\n"; cin >> hight;
    int** arr;
    arr = Create(hight, width);
    Fill(arr, hight, width);
    Show(arr, hight, width);
    cout << "Enter you choice\n1 - Add column\n2 - Add row\n3 - Delete column\n4 - Delete row\n";
    cin >> choice;
Del(arr, hight);
}

Как?

Как то так

int** Edit_width(int** arr, int height, int&width)
{

int** arr_1;

arr_1 = Create(height, width + 1);
for (int i = 0; i<height; i++)

{

for (int j = 0; j <width; j++)

{

arr_1[i][j] = arr[i][j];

}

}

width++;
for (int i = 0; i<height; i++)

{

arr_1[i][width - 1] = rand() % 100;
}

Del(arr, height);

arr = arr_1;

return arr;

}

Так же и не в конец, скопировать до/после указанного места.

ЗЫ в коде выше очень странное оформление, нет горизонтальных отступов, такое сложно читать. И при вставке кода на форум используйте кнопку Код.
И высота по-английски height.

можно попросить код пожалуйста

Так сами пишите, тут же нет ничего сверхъестественного по сравнению с вставкой в конец. Просто подумать как циклы организовать, чтоб скопировать сначала часть до указанного места, а потом после него, в нужные места (до — туда же, а после — +1 к номеру строки или столбца у места назначения). Может быть на листочке порисовать и с уточкой пообщаться )

Как раз с реализацией цикла с условиями “до” и “после” я завис. Помогите плиз.

Так а проблема-то в чем именно?
“До” это ж то же самое, что весь в коде выше, только остановиться раньше.

В том то и дело, что не знаю в чем проблема. Скорее всего я чего-то не знаю. И это мне не дает покоя. Очень нужна ваша помощь. Я написал некое подобие кода. В нем работает только удаление столбца корректно, удаление строки работает не совсем корректно, а вставка столбца и строки не работают вообще. Посмотрите пожалуйста.

#include<iostream>
#include<time.h>
#include<iomanip>
#include<stdlib.h>
using namespace std;

int** Create(int row, int col)
{
    int** arr;
    arr = new int * [row];
    for (int i = 0; i < row; i++)
    {
        arr[i] = new int[col];
    }
    return arr;
}

void Fill(int** arr, int height, int width)
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            arr[i][j] = rand() % 100;
        }
    }
}

void Show(int** arr, int height, int width)
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            cout << setw(3) << arr[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}

void Del(int** arr, int row)
{
    for (int i = 0; i < row; i++)
    {
        delete[]arr[i];
    }
    delete[]arr;
}
int** Add_Col(int** arr, int height, int& width, int pos)
{
    pos = 0;
    int** arr_1;
    arr_1 = Create(height, width + 1);
    for (int i = 0; i < height; i++)
    { 
        for (int j = 0; j < width; j++)
        {
            if (j < pos)

                arr_1[i][j] = arr[i][j];

            else if (j > pos)

                arr_1[i][j + 1] = arr[i][j];

            else

                arr_1[i][j] = rand() % 100;
        }
    }
    width++;
    Del(arr, height);
    arr = arr_1;
    return arr;
}

int** Add_Row(int** arr, int& height, int width, int pos)
{
    int** arr_2;
    arr_2 = Create(height + 1, width);
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (i < pos)
                
                arr_2[i][j] = arr[i][j];
            
            else if (i == pos)
            
                arr_2[i][j] = rand() % 100;
            
            else
                arr_2[i + 1][j] = arr[i][j];
        }
    }
    height++;
    Del(arr, height - 1);
    arr = arr_2;
    return arr;
}

void Delete_Col(int** arr, int height, int width, int pos)
{
    for (int i = 0; i < height; i++)
    {
        for (int j = pos; j < width; j++)
        {
            arr[i][j] = arr[i][j + 1];
        }
    }
}

void Delete_Row(int** arr, int height, int width, int pos)
{
   
    for (int i = 0; i < height; i++)
    {
        
            
            for (int j = 0; j < width; j++)
            {
                if (i == pos)
                arr[i][j] = arr[i+1][j];
            }
        
    }
}


int main()
{
    srand(time(NULL));
    int width, height;
    int choice;
    int pos;
    cout << "Enter width\n"; cin >> width;
    cout << "Enter hight\n"; cin >> height;
    int** arr;
    arr = Create(height, width);
    Fill(arr, height, width);
    Show(arr, height, width);
    cout << "Enter you choice\n1 - Add column\n2 - Add row\n3 - Delete column\n4 - Delete row\n";
    cin >> choice;
    switch (choice)
    {
    case 1:
        cout << "Enter number of column you want add" << endl;
        cin >> pos;
        if (pos >= width)
            cout << "Wrong choice!\n";
        else 
        {
            Add_Col(arr, height, width, pos);
            Show(arr, height, width);
        }
        break;
    case 2:
        cout << "Enter number of row you want add" << endl;
        cin >> pos;
        if (pos >= height)
            cout << "Wrong choice!\n";
        else 
        {
            Add_Row(arr, height, width, pos);
            Show(arr, height, width);
        }
        break;
    case 3:
        cout << "Enter number of column you want delete" << endl;
        cin >> pos;
        if (pos >= width)
            cout << "Wrong choice!\n";
        else 
        {
            Delete_Col(arr, height, width, pos);
            width--;
            Show(arr, height, width);
        }
        break;
    case 4:
        cout << "Enter number of row you want delete" << endl;
        cin >> pos;
        if (pos >= height)
            cout << "Wrong choice!\n";
        else 
        {
            Delete_Row(arr, height, width, pos);
            height--;
            Show(arr, height, width);
        }
        break;
    default:
        cout << "Wrong choice\n";
        break;
    }
    Del(arr, height);

}

Скорее всего так нельзя. Либо используйте возвращенное значение (arr = Add_Row(arr, ...), либо передавайте что-то типа int**& arr

Не надо говорить просто “не работает”, надо описывать что происходит не так, как ожидалось, выкладывать ошибки компилятора/вывод программы и т.п.

Ну при удалении строки, работает всегда, кроме случая когда pos==height - 1

Видимо просто повезло.

https://rextester.com/IEDK50170 — падает во время выполнения.
https://rextester.com/APPY38404 — с int**& работает.

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

сделал просто 3 цикла с нужными начальными/конечными значениями. Так проще и понятнее.

Спасибо за помощь, буду делать сейчас.

Я наконец это сделал! Спасибо за помощь

#include<iostream>
#include<time.h>
#include<iomanip>
#include<stdlib.h>
using namespace std;

int** Create(int row, int col)
{
    int** arr;
    arr = new int * [row];
    for (int i = 0; i < row; i++)
    {
        arr[i] = new int[col];
    }
    return arr;
}

void Fill(int** arr, int height, int width)
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            arr[i][j] = rand() % 100;
        }
    }
}

void Show(int** arr, int height, int width)
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            cout << setw(3) << arr[i][j] << " ";
        }
        cout << "\n";
    }
    cout << "\n";
}

void Del(int** arr, int row)
{
    for (int i = 0; i < row; i++)
    {
        delete[]arr[i];
    }
    delete[]arr;
}
int** Add_Col(int** arr, int height, int& width)
{
    int** arr_1;
    int pos;
    cout << "Enter number of column you want add" << endl;
    cin >> pos;
    if (pos > width)
    {
        cout << "Wrong choce!\n";
        return 0;
    }
    else 
    {
        arr_1 = Create(height, width + 1);
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < pos; j++)
            {
                arr_1[i][j] = arr[i][j];
            }
        }
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < width - pos; j++)
            {
                arr_1[i][j + pos + 1] = arr[i][j + pos];
            }

        }
        width++;
        for (int i = 0; i < height; i++)
        {
            for (int j = pos; j < pos + 1; j++)
            {
                arr_1[i][j] = rand() % 100;
            }

        }
        Del(arr, height);
        arr = arr_1;
        return arr;
    }
}

int** Add_Row(int** arr, int& height, int width)
{   
    int** arr_2;
    int pos;
    cout << "Enter number of row you want add" << endl;
    cin >> pos;
    if (pos > height)
    {
        cout << "Wrong choice!\n";
        return 0;
    }
    else 
    {
        arr_2 = Create(height + 1, width);
        for (int i = 0; i < pos; i++)
        {
            for (int j = 0; j < width; j++)
            {
                arr_2[i][j] = arr[i][j];
            }
        }
        for (int i = 0; i < height - pos; i++)
        {
            for (int j = 0; j < width; j++)
            {
                arr_2[i + pos + 1][j] = arr[i + pos][j];
            }
        }
        height++;
        for (int i = pos; i < pos + 1; i++)
        {
            for (int j = 0; j < width; j++)
            {
                arr_2[i][j] = rand() % 100;
            }
        }
        Del(arr, height - 1);
        arr = arr_2;
        return arr;

        return arr;
    }
}

int** Delete_Col(int** arr, int height, int& width)
{
    int pos;
    int** arr_3;
    cout << "Enter number of column you want delete\n";
    cin >> pos;
    if (pos >= width)
    {
        cout << "Wrong choice!\n";
        return 0;
    }
    else
    {
        arr_3 = Create(height, width);
        for (int i = 0; i < height; i++)
        {
            for (int j = 0; j < pos; j++)
            {
                arr_3[i][j] = arr[i][j];
            }
        }
        for (int i = 0; i < height; i++)
        {
            for (int j = pos; j < width - 1; j++)
            {
                arr_3[i][j] = arr[i][j + 1];
            }
        }
        width--;
        Del(arr, height);
        arr = arr_3;
        return arr;
    }
}

int** Delete_Row(int** arr, int& height, int width)
{
    int pos;
    int** arr_4;
    cout << "Enter number of row you want delete" << endl;
    cin >> pos;
    if (pos >= height)
    {
        cout << "Wrong choice!\n";
        return 0;
    }
    else
    {
        arr_4 = Create(height-1, width);
        for (int i = 0; i < pos; i++)
        {
            for (int j = 0; j < width; j++)
            {
                    arr_4[i][j] = arr[i][j];
            }

        }
        for (int i = pos; i < height-1; i++)
        {
            for (int j = 0; j < width; j++)
            {
                arr_4[i][j] = arr[i + 1][j];
            }
        }
        height--;
        Del(arr, height);
        arr = arr_4;
        return arr;
    }
}


int main()
{
    srand(time(NULL));
    int width, height;
    int choice;
    int pos;
    cout << "Enter width\n"; cin >> width;
    cout << "Enter hight\n"; cin >> height;
    int** arr;
    arr = Create(height, width);
    Fill(arr, height, width);
    Show(arr, height, width);
    cout << "Enter you choice\n1 - Add column\n2 - Add row\n3 - Delete column\n4 - Delete row\n";
    cin >> choice;
    switch (choice)
    {
    case 1: 
        arr = Add_Col(arr, height, width);
        Show(arr, height, width);
        break;
    case 2:
    
        arr = Add_Row(arr, height, width);
        Show(arr, height, width);
        break;
    case 3:
       
        arr = Delete_Col(arr, height, width);
        Show(arr, height, width);
        break;
      
    case 4:
       
        arr = Delete_Row(arr, height, width);
        Show(arr, height, width);
        break;
      
    default:
        cout << "Wrong choice\n";
        break;
    }
    Del(arr, height);

}
1 симпатия