Вставка и удаление элементов
двумерного массива
Вставка строки
Мы уже рассматривали такие действия для
одномерных массивов. Обобщим для двумерных.
Пример 12
Вставить строку из нулей после строки с
номером k.
Решение
Для решения этой задачи необходимо:
- Первые k строк оставить без изменения.
- Все строки после k-й сдвинуть на одну
назад, это лучше начать с последней
строки и идти до (k+1)-й.
- Элементы строки k+1 присвоить заданное
значение.
Кроме того, необходимо изменить
размерность массива. Так как мы вставляем
строку, то число строк будет на одну больше:
Const n = 5; m = 7;
Type dmyarray = Array[1..n+1, 1..m] Of Integer;
Var A : dmyarray;
Теперь опишем процедуру вставки:
Procedure Insert(k1: Integer; Var x: dmyarray);
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 присваиваем элемент
этого же столбца, но из предыдущей строки}
End;
Так как число строк меняется, то процедуру
Print надо изменить, она должна выводить
данное количество строк, начиная с первой:
Procedure Print1(n1: Integer; x: dmyarray);
Var i, j : Integer;
Begin
For i:=1 To n1 Do
Begin
For j:=1 To m Do Write(x[i,j]:4);
Writeln;
End;
End
Часть основной программы будет такой:
Begin
Init(A);
Print(n,A);
Writeln('Введите номер строки, после которой
вставляем');
Readln(k);
Insert(k,A);
Print(n+1,A);
Readln;
End.
Примечания:
- Если необходимо вставить после строки,
удовлетворяющей некоторому условию, то
надо лишь найти её номер и задача
сводится к решению первого примера.
- Если надо вставлять после всех строк с
заданным условием, то надо увеличить
размерность по строкам, и если строка
удовлетворяет условию, то к ней применять
вставку. При этом надо заметить, что лучше
просматривать строки с последней и
ввести счётчик вставленных строк.
- Вставка перед строкой с данным номером
изменится только тем, что сдвигать назад
надо не с (k+1)-й строки, а с k-й.
- Если надо вставлять столбцы, то
размерность увеличивается для столбцов,
а всё остальное практически не меняется:
надо сдвинуть столбцы назад и на данное
место записать новый столбец.
Пример 13
Удалить строку с номером k.
Решение
Для того, чтобы удалить строку с номером k,
необходимо:
Описание массивов оставим прежнее (для
размерности 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;
Примечания:
- Задачу об удалении строки с заданным
условием можно решить этим же способом,
достаточно только найти её номер, а в
случае отсутствия такой строки можно
просто сообщить об этом и закончить
программу.
- Ещё одну задачу можно решить, используя
данную процедуру - удаление всех строк,
которые отвечают некоторым свойствам -
просматриваем строки от последней до
первой, если строка удовлетворяет
требованиям, то удаляем её и переходим к
следующей, иначе сразу переходим. Для
эффективного вывода надо ввести счётчик,
который учитывает количество удалённых
строк, а при выводе изменённого массива
передаём процедуре Print1 значение
n-k, где k - это счётчик.
Содержание