Пример 12: Удалить из массива все элементы между k-м и z-м элементами.
Рассмотрим задачу на примере при количестве элементов в массиве n=10, k=3, z=7 (т.е. надо удалить элементы между третьим и седьмым).
Будем использовать переменную d - количество удаляемых элементов. Значение d можно вычислить по формуле: d = z - k – 1 ( в нашем примере получится d = 7 - 3 - 1 = 3).
Массив A до удаления:
^
^
^
a[k]
a[z]
a[n]
Массив A после удаления:
^
^
^
a[k]
a[z]
a[n]
После удаления n стало меньше на d (в нашем примере на 3).
Общий алгоритм решения:
1 . Сдвинуть элементы вперед на d элементов, начиная с z-го.
2 . Уменьшить n на d.
Фрагмент программы:
Var {дополнительные переменные}
k: integer; {индекс элемента, после которого удаляем}
z: integer; {индекс элемента, до которого удаляем}
d: integer; {количество удаляемых элементов}
…………………………….
Begin
…………………………….
{вычисляем количество удаляемых элементов}
d:=z-k-1;
{1 - сдвигаем элементы}
for i:=z to n do
A[i-d]:=A[i];
{2 - уменьшаем n на d}
Dec(n,d);
…………………………….
Пример 13: Из массива удалить все элементы, которые меньше 0.
Рассмотрим два решения этой задачи.
Алгоритм первого решения:
1. Просматриваем массив .
2. Если элемент<0, то удаляем его и n уменьшаем.
3. Если элемент>=0, то переходим к следующему.
Фрагмент программы:
…………………………….
{в цикле просматриваем элементы массива}
i:=1;
while i<=n do
begin
{проверяем ,не нужно ли i-ый элемент удалять}
if A[i]<0 then
begin
{если нужно – удаляем i-ый элемент}
for j:=i to n-1 do {сдвигаем}
A[j]:=A[j+1];
Dec(n); {уменьшаем количество элементов}
end
else Inc(i); {если удалять не нужно, то переходим к следующему элементу}
end;
Пример прогона алгоритма:
Исходный массив:
0: i=1, n=6: -1 -2 2 -3 -4 3
-1
-2
-3
-4
Состояния массива после обработки очередного элемента массива:
1: i=1, n=5:
-2
-3
-4
(удален -1)
2: i=1, n=4:
-3
-4
(удален -2)
3: i=2, n=4:
-3
-4
(перешли на следующий)
4: i=2, n=3:
-4
(удален -3)
5: i=2, n=2:
(удален -4)
6: i=3, n=2:
(перешли на следующий
Алгоритм второго решения:
1. Счетчик переписанных элементов k=0.
2. Просматриваем элементы массива.
3. Если элемент A[i] не меньше 0, k увеличиваем на 1 и переписываем элемент A[i] на k-ое место.
4. После просмотра всего массива количество переписанных элементов k заносим в n.
Фрагмент программы:
Var {дополнительные переменные}
k:IndexEl; {количество переписанных элементов}
…………………………….
Begin
…………………………….
{1 - переписанных элементов пока не было}
k:=0;
{2 - в цикле просматриваем элементы массива}
for i:=1 to n do
{3 - если A[i] не <0}
if not(A[i]<0) then
begin
Inc(k); {увеличиваем значение k на 1}
A[k]:=A[i]; {переписываем i-ый элемент в позицию k}
end;
{4 - в массиве оставляем k элементов}
n:=k;
Пример прогона алгоритма:
Исходный массив:
-1
-2
-3
-4
Состояния массива после просмотра очередного элемента массива: