Вставка і видалення елементів двовимірного масиву

Ми вже розглядали такі дії для одновимірних масивів. Узагальнимо для двовимірних.

Вставити рядок з нулів після рядка з номером k.

Для вирішення цього завдання необхідно:

  1. Перші k рядків залишити без зміни.
  2. Всі рядки після k-й зрушити на одну назад, це краще почати з останнього рядка і йти до (k + 1) -й.
  3. Елементи рядка k + 1 привласнити задане значення.

Крім того, необхідно змінити розмірність масиву. Так як ми вставляємо рядок, то число рядків буде на одну більше:

Тепер опишемо процедуру вставки:

Так як число рядків змінюється, то процедуру Print треба змінити, вона повинна виводити дане кількість рядків, починаючи з першої:

Частина основної програми буде такою:

  1. Якщо необхідно вставити після рядка, що задовольняє деякому умовою, то треба лише знайти її номер і завдання зводиться до вирішення першого прикладу.
  2. Якщо треба вставляти після всіх рядків із заданим умовою, то треба збільшити розмірність по рядках, і якщо рядок задовольняє умові, то до неї застосовувати вставку. При цьому треба зауважити, що краще переглядати рядки з останньої і ввести лічильник вставлених рядків.
  3. Вставка перед рядком з даними номером зміниться тільки тим, що зрушувати назад треба не з (k + 1) -го рядка, а з k-й.
  4. Якщо треба вставляти стовпці, то розмірність збільшується для стовпців, а все інше практично не змінюється: треба зрушити стовпці назад і на дане місце записати новий стовпець.

Видалити рядок з номером k.

Для того, щоб видалити рядок з номером k, необхідно:

Зрушити всі рядки, починаючи з даної, на одну вгору.

Останній рядок "обнулити", тобто всіх елементів останнього рядка привласнити значення 0.

Опис масивів залишимо колишнє (для розмірності n * m). Також в програмі будемо використовувати процедуру виведення Print1 з попереднього параграфа. Будемо виводити на екран спочатку все рядки, а другий раз, після видалення, на одну менше. Тепер опишемо процедуру видалення рядка з даним номером:

Procedure Delete (k1: Integer; Var x: dmyarray);
Var i, j. Integer;
Begin
For i: = k1 To n-1 Do
For j: = 1 To m Do
x [i, j]: = x [i + 1, j];
For j: = 1 To m Do x [n, j]: = 0
End;

  1. Завдання про видалення рядка з заданим умовою можна вирішити цим же способом, досить тільки знайти її номер, а в разі відсутності такого рядка можна просто повідомити про це і закінчити програму.
  2. Ще одне завдання можна вирішити, використовуючи дану процедуру - видалення всіх рядків, які відповідають деяким властивостям - переглядаємо рядки від останньої до першої, якщо рядок задовольняє вимогам, то видаляємо її і переходимо до наступної, інакше відразу переходимо. Для ефективного виведення треба ввести лічильник, який враховує кількість вилучених рядків, а при виведенні зміненого масиву передаємо процедурі Print1 значення n-k. де k - це лічильник.