Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обработка массивов.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
502.27 Кб
Скачать

Удаление нескольких элементов массива

Пример 12: Удалить из массива все элементы между k-м и z-м элементами.

Рассмотрим задачу на примере при количестве элементов в массиве n=10, k=3, z=7 (т.е. надо удалить элементы между третьим и седьмым).

Будем использовать переменную d - количество удаляемых элементов. Значение d можно вычислить по формуле: d = z - k – 1 ( в нашем примере получится d = 7 - 3 - 1 = 3).

Массив A до удаления:

1

2

5

0

1

0

1

2

10

6

^

^

^

a[k]

a[z]

a[n]

Массив A после удаления:

1

2

5

1

2

10

6

^

^

^

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

2

-3

-4

3

Состояния массива после обработки очередного элемента массива:

1: i=1, n=5:

-2

2

-3

-4

3

(удален -1)

2: i=1, n=4:

2

-3

-4

3

(удален -2)

3: i=2, n=4:

2

-3

-4

3

(перешли на следующий)

4: i=2, n=3:

2

-4

3

(удален -3)

5: i=2, n=2:

2

3

(удален -4)

6: i=3, n=2:

2

3

(перешли на следующий

Алгоритм второго решения:

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

2

-3

-4

3

Состояния массива после просмотра очередного элемента массива:

0: k=0, i=1, n=6:

-1

-2

2

-3

-4

3

{не переписываем}

1: k=0, i=2, n=6;

-1

-2

2

-3

-4

3

{не переписываем}

2: k=1, i=3, n=6; 2 -2 2 -3 -4 3 {переписываем

-1

-2

2

-3

-4

3

{ переписываем a[1]:=a[3]}

3: k=1, i=4, n=6;

2

-2

2

-3

-4

3

{не переписываем}

4: k=1, i=5, n=6;

2

-2

2

-3

-4

3

{не переписываем}

5: k=2, i=6, n=6; 2 3 2 -3 -4 3 {переписываем

2

3

2

-3

-4

3

{ переписываем a[2]:=a[6]}

6: k=2, i=7, n=6:

2

3

2

-3

-4

3

{выход из цикла}

7: n=2: 2 3 {значение k переписываем в n}

2

3

{ значение k переписываем в n}