Как вставить новую строку после строк с номером p в матрице?
Всем привет! Написал я прогу, которая заменяет строку матрицы с номером p на другую строку. Все работает. Но теперь поставлена другая задача, вставить эту же новую строку после строки с номером p. То есть нужно расширить, раздвинуть матрицу и засунуть туда новую строку. Как это сделать? Хелп.
Вот мой код:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
int d[4][4],i,j,k;
int a[4],b[4],p,g,el;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
d[i][j] = rand()%50-1; // заполняем матрциу
}
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf("%4i ",d[i][j]); // выводим матрицу на экран
}
cout << "\n";
}
cout << "Fill array \n";
for(i=0;i<4;i++){
a[i] = rand()%12-1; // массив a - это новая строка, которую нужно будет вставить
}
for(i=0;i<4;i++){
b[i] = rand()%10-1; // а это массив b - это новый столбец, который тоже нужно будет вставить
}
cout << "Number str 'p': ";
cin >> p; // после которой строки нужно вставлять новую строку
cout << "Number col 'g': ";
cin >> g; // после которого столбца нужно вставлять новый столбец
cout << "\n";
for(j=0;j<4;j++)
{
d[p][j] = a[j]; // тут мы заменяем, а нужно вставить
}
for(i=0;i<4;i++)
{
d[i][g] = b[i];
}
cout << "\n";
for(i=0;i<4;i++){
for(j=0;j<4;j++){
printf("%4i ",d[i][j]);
}
cout << "\n";
}
}
Ответы (1 шт):
Так как вам надо "расширять" матрицу, то вам нужно использовать динамические массивы. Если вы с ними не сталкивались, то можно почитать примеры тут, например.
Ниже прикладываю код, где по функция разнесены созданием матрицы (все значения сразу инициализируются нулями для простоты), удаление матрицы (важно - не забывать высвобождать память после окончания работы с ячейками памяти), вставка строки.
Вставка строки в данном случае реализована как создание динамического массива, идентичного по размеру исходному, но на одну строку больше. В этот массив мы переносим значения из изначального, но на место требуемой строки мы вставляем значение не из исходной матрицы, а из введенного пользователем одномерного массива. Но надо помнить, что тогда при следующем шаге i для исходного массива будет уже указывать не на ту строку, которую нам надо скопировать, поэтому вводится сдвиг shift.
#include <iostream>
#include <iomanip>
using namespace std;
void createMatrix(int**& X, int rows, int cols)
{// создание матрицы
X = new int* [rows];
for (int i = 0; i < rows; i++)
{
X[i] = new int[cols] {0};
}
}
void displayMatrix(int** X, int rows, int cols)
{//вывод матрицы
cout << endl;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
cout << setw(4) << X[i][j];
}
cout << endl;
}
}
void deleteMatrix(int**& X, int rows)
{// освобождение памяти
for (int i = 0; i < rows; i++)
{
delete[] X[i];
}
delete[] X;
}
void insertRows(int**& X, int& rows, int cols, int posr)
{//вставка строки
int** buff;
int *insertRow = new int [cols];
int shift = 0;
createMatrix(buff, rows + 1, cols);
cout << "ROW TO INSERT: ";
for (int i = 0; i < cols; i++)
cin >> insertRow[i];
for (int i = 0; i < rows + 1; i++)
{
if (i == posr)
{
shift = 1;
for (int j = 0; j < cols; j++)
buff[i][j] = insertRow[j];
} else
for (int j = 0; j < cols; j++)
{
buff[i][j] = X[i - shift][j];
}
}
deleteMatrix(X, rows);
rows++;
X = buff;
}
int main()
{
int rows, cols, pos;
cout << "Enter matrix size: ";
cin >> rows >> cols;
int** M;
createMatrix(M, rows, cols);
displayMatrix(M, rows, cols);
cout << "Enter pos to insert: ";
cin >> pos;
insertRows(M, rows, cols, pos);
displayMatrix(M, rows, cols);
deleteMatrix(M, rows);
return 0;
}