LINUX.ORG.RU

Help! Задача с динамическими массивами.


0

0

Прошу помощи со следующей задачей. Уже замучался :( Даны действительная матрица размеры n*(n + 1), действительные числа a1,...,an+1, b1,...,bn+1, натуральные числа p, q(p <= n, q <= n+1). Образовать новую матрицу размера (n + 1)*(n + 2) вставкой после строки с номером p данной матрицы новой строки с элементами a,...,an+1 и последующей вставкой после стобца с номером q нового столбца с элементами b1,...,bn+1. Память под массивы отводть динамически. Использовать конструкторы с параметрами.

Я так понимаю, решение должно выгдять примерно так: Исходная матрица: 5555 То, что должно получиться: 55505 5555 55505 5555 11101 55505 Класс сделать могу, с конструкторами с параметрами проблем лет, но заполнение динамических массивов таким образом? Где вообще можно научиться выполнять различные манипуляции с элементами массивов, в том числе с помощью операторов цикла/ветвления? Заранее спасибо!

anonymous

Сорри, исходная матрица в решении по моему разумению должна выглядеть примерно так: {{5,5,5,5},{5,5,5,5},{5,5,5,5},{5,5,5,5}}. Та, что получится: {{5,5,5,0,5},{5,5,5,0,5},{5,5,5,0,5},{1,1,1,0,1},{5,5,5,0,5}}

Просьба не пинать :) Я не программист, изучающий курс С++.

anonymous
()
Ответ на: комментарий от anonymous

Способ представления массива

Сначала выберите способ представления двумерного массива NxM (N строк, M столбцов).

1. Одним массивом длиной N*M. Тогда обращение к элементу массива будет таким: a[i*M+j], где i-строка, j-столбец. i и j начинаются с нуля!

2. С помощью массива указателей длины N (массив строк матрицы). Каждый его элемент указывает на массив чисел длины M (строку матрицы). Обращение к элементу: a[i][j].

DKorolkov
()

Спасибо! Способы объявления/инициализации массивов/обращения к их элементам примерно представляю. У меня это выглядит примерно так: class Matrix{ int n; int **m; public: Matrix(int); ...... ~Matrix(); };

Matrix::Matrix(int size) { n = size; m = new int*[n]; for (int i = 0; i < n; i++) m[i] = new int[n]; } Про обращение к элементам массива как *(*(a+i)+j) или a[i][j] тоже знаю. Вопрос в функции, которая даст разультат в виде массива, созданного указанным способом на основе исходного.

anonymous
()
Ответ на: комментарий от anonymous

Функция

> Вопрос в функции, которая даст разультат в виде массива, созданного указанным способом на основе исходного.

IMHO, лучше создать новый экземпляр Matrix. Что-то вроде

Matrix *result = new Matrix(size+1); /* Заполнение нового массива */ return *result;

Или интересует код, заполняющий массив?

DKorolkov
()

Да, заполнение нового массива на основе старого со вставкой строки и столбца, причем размерность чисел, заполняющих стобец, на 1 меньше, чем строку. Т.е. в столбце нули, в строке единицы, например. Похожий код вставки строки из нулей на паскале: Procedure Insert1(Var X : MyArray2; n, m : integer; k1 : integer); Var i, j : integer; Begin for i := n downto k1 +1 do for j := 1 to m do X[i+1, j] := X[i, j];{элементу столбца j присваиваем элемент этого же столбца, но из предыдущей строки} for j := 1 to m do X[k1+1, j] := 0; Inc(n); End; Как это должно будет выглядеть на С++ в случае динамических массивов и со строкой и стобцом?

anonymous
()
Ответ на: комментарий от anonymous

Копирование и вставка

> Как это должно будет выглядеть на С++ в случае динамических массивов

Почти аналогично, кроме:
Другой синтаксис (for, присваивание, фигурные скобки и т.п.)
x[i][j] вместо x[i,j], хотя первый вариант пройдёт и на Паскале.

Копирование. Пусть N,M - размеры исходного массива n,m - строка и столбец,
которые нужно вставить (начиная с 0). Тогда

for(i=1;i<N;++i)
  for(j=1;j<M;++j)
    dst[i<n ? i : i+1][j<m ? j : j+1] = src[i][j];

Вставка строки и столбца ещё проще.

DKorolkov
()
Ответ на: комментарий от anonymous

Вставка

> Спасибо! Вставка и интересует, если можно.

Сейчас буду мучить :).

Пусть у вас результирующий массив dst (N+1)x(M+1),a - строка для вставки длины M+1. Нужно заполнить строку с номером n. Понятно, что элементы матрицы, в которые копируются элементы строки будут выглядеть как dst[n][j], где j пробегает от 0 до M? Сможете записать цикл for с одним присваиванием внутри?

Со столбцом чуть сложнее, но если бы вы разобрали код копирования исходного массива в результирующий, вам было бы ясно, как это сделать. Подскажу, внутри цикла будет dst[i<n ? i : i+1][m] = b[i], где b - столбец, m - номер столбца, куда нужно вставить b, i - параметр цикла. Оператор цикла сможете составить?

DKorolkov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.