Мы уже рассматривали такие действия для одномерных массивов. Обобщим для двумерных.
Пример 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, необходимо:
Сдвинуть все строки, начиная с данной, на одну вверх.
Последнюю строку "обнулить", то есть всем элементам последней строки присвоить значение 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;
Примечания:
Задачу об удалении строки с заданным условием можно решить этим же способом, достаточно только найти её номер, а в случае отсутствия такой строки можно просто сообщить об этом и закончить программу.
Ещё одну задачу можно решить, используя данную процедуру - удаление всех строк, которые отвечают некоторым свойствам - просматриваем строки от последней до первой, если строка удовлетворяет требованиям, то удаляем её и переходим к следующей, иначе сразу переходим. Для эффективного вывода надо ввести счётчик, который учитывает количество удалённых строк, а при выводе изменённого массива передаём процедуре Print1 значение n-k, где k - это счётчик.