§7. Преобразование элементов массива

7.1. Основные задачи

Среди задач преобразования эле­ментов массива можно выделить зада­чи следующих типов:

1. Изменение элементов массива в зависимости от условий.

2. Обмен местами элементов массива.

3. Удаление элемента из массива.

4. Вставка элемента в массив.

Рассмотрим каждую из задач.

7.2. Изменение элементов массива в зависимости от выполнения некоторых условий

Пример 7.1. Задан одномерный мас­сив целых чисел. Преобразовать его элементы по следующему правилу: положительные элементы увеличить в 2 раза, а отрицательные — увели­чить на 5.

I. Исходные данные: одномерный массив а, количество элементов n.

II. Результат: преобразованный мас­сив а.

III. Алгоритм решения задачи.

  1. Ввод исходных данных.
  2. В цикле проверяем текущий элемент. Если он положительный, умножаем его на 2. Если элемент от­рицательный, то прибавляем к не­му 5. Помним, что отрицание усло­вия «элемент положительный» — условие «элемент не положитель­ный», что подразумевает возмож­ность равенства элемента нулю. По­этому нужны два оператора ветвле­ния для проверки условия задачи.
  3. Вывод результата.

IV. Описание переменных: а — array[1..20] of integer; n — integer.

7.3. Обмен местами элементов в массиве

Для обмена местами двух элемен­тов массива можно использовать до­полнительную переменную, которую называют буфером. Буферу присваи­вают значение одного из элементов массива, этому элементу присваивают значение другого элемента массива, затем второму элементу присваивают значение буфера:

buf := a[i];

a[i] := a[k];

a[k] := buf;

Пример 7.2. Задан одномерный массив целых чисел. Поменять места­ми максимальный и минимальный элементы массива (минимальный и максимальный элементы встречаются в массиве только один раз).

I. Исходные данные: одномерный массив а, количество элементов n.

II. Результат: преобразованный массив a.

III. Алгоритм решения задачи.

  1. Введем исходные данные.
  2. Найдем максимальный эле­мент массива и его индекс (n_max).
  3. Найдем минимальный эле­мент массива и его индекс (n_min).
  4. Поменяем местами элементы, стоящие на местах n_max и n_min.
  5. Выведем результат.

IV. Описание переменных: а — array[1..20] of integer; n, n_min, n_max, buf — integer.

7.4*. Удаление элемента из массива

Для удаления элемента массива на месте k нужно сдвинуть на одну по­зицию влево все элементы, стоящие после него. Количество элементов при этом уменьшаем на 1.

for var i := k+1 to n do a[i-1] := a[i] ;

n := n – 1;

Если в массиве нужно удалить не один, а несколько элементов, удовлет­воряющих условию, то можно исполь­зовать вспомогательный алгоритм в виде соответствующей процедуры procedure del_mas(k: integer); Параметр k — номер удаляемого эле­мента.

Пример 7.3. Задан одномерный массив целых чисел. Удалить из ли­нейного массива все числа, кратные 5. Сколько чисел удалили?

I, Исходные данные: одномерный массив а, количество элементов n.

II. Результат: преобразованный мас­сив a и количество удаленных чисел d.

III. Алгоритм решения задачи.

  1. Введем исходные данные.
  2. Будем последовательно про­сматривать элементы массива. Если найдем число, кратное 5, то удалим его из массива, исполь­зуя процедуру del_mas. Так как количество удаляемых элементов заранее не известно, то применим цикл while.
  3. При удалении элемента счет­чик d будем увеличивать на 1.
  4. Выведем результат.

IV. Описание переменных: а — array[1..20] of integer; n, d, j — integer.

7.5*. Вставка элемента в массив

Для вставки элемента на место k нужно освободить данное место в мас­сиве. Для этого сдвинем на одну по­зицию вправо все элементы массива, стоящие после k-1. Сдвиг начинаем с последнего элемента. Количество эле­ментов в массиве увеличится на 1.

Пример 7.4. Задан массив целых чисел. Вставить число x на к-е место.

I. Исходные данные: одномерный массив а, количество элементов n, число, которое нужно вставить в мас­сив x, номер позиции в массиве, на которую нужно вставить число k.

II. Результат:        преобразованный

массив a.

III. Алгоритм решения задачи.

  1. Ввод исходных данных.
  2. Сдвигаем все элементы мас­сива, стоящие после к – 1 на одну позицию вправо.
  3. Увеличим n — количество элементов.
  4. Вставляем число x на место k.
  5. Выводим результат.

IV. Описание переменных: а — array[1..20] of integer; n, k, x — integer.

Пример 7.1.
V. Программа:

var a: array[1..20] of integer;
    n: integer;
begin
write ('Количество n = ');
readln(n);
writeln('Элементы массива');
for var i := 1 to n do read(a[i]);
for var i := 1 to n do 
begin
if a[i] > 0 then a[i] := a[i] * 2;
if a[i] < 0 then a[i] := a[i] + 5;
end;
writeln ('Преобразованный массив');
for var i := 1 to n do write(a[i], '  ');
end.

VI. Тестирование.

VII. Анализ результатов. Элементы 3 и 5 увеличены в 2 раза, элементы -2 и -1 увеличены на 5, элемент 0 остался неизмененным.

Если обмен элементов осуществлять следующим образом:
a[i] := a[k]; a[k] := a[i];
то мы потеряем значение элемента, сто­ящего изначально на месте a[i], и по­лучим два элемента со значением, рав­ным a[k]. Для обмена элементов мож­но использовать встроенную функцию swap: swap(a[i], a[k]).

Пример 7.2.
V. Программа:

var a: array[1..20] of integer;
n, n_min, n_max, buf: integer;
begin
write ('Количество n = ');
readln(n);
writeln('Элементы массива');
for var i := 1 to n do read(a[i]);
n_min := 1;
n_max := 1;
for var i := 1 to n do 
begin
if a[i] > a[n_max] then n_max := i;
if a[i] < a[n_min] then n_min := i;
end;
buf := a[n_min];
a[n_min] := a[n_max];
a[n_max] := buf;
writeln( 'Преобразованный массив');
for var i := 1 to n do write(a[i], '  ');
end.

VI. Тестирование.

Пример 7.3.
V. Программа:

var a: array[1..20] of integer;
      n, d, j: integer;
procedure del_mas(k: integer);
begin
for var i := k + 1 to n do
a[i - 1] := a[i];
n := n - 1;
end;
begin
write ('Количество n = ');
readln(n);
writeln('Элементы массива');
for var i := 1 to n do read(a[i]);
d := 0;
j := 1;
while j <= n do
begin
if a[j] mod 5 = 0 then
begin 
del_mas(j);
d := d + 1;
j := j - 1;
end;
j := j + 1;
end;
writeln('Удалили ', d, 'элемент(-а, -ов');
writeln( 'Преобразованный массив');
for var i := 1 to n do write (a [i], '  ');
end.

VI. Тестирование.

VII. Анализ результатов. Элементы 5, 15, 35, 10 и 30 кратны 5, поэтому их удалили из массива. Элементы 3 и 4 не кратны 5, поэтому они остались в мас­сиве и сдвинулись, соответственно, на 1-е и 2-е места.

Пример 7.4.
V. Программа:

var a: array[1..20] of integer;
      n, k, x: integer;
begin
write (' Количество n = ');
readln(n);
writeln( 'Элементы массива');
for var i := 1 to n do read(a[i]);
write ('Число x =');
readln(x);
write ('Номер позиции к = ');
readln(k);
//сдвиг элементов вправо на 1
for var i:= n downto к do a[i+1] := a[i];
//вставка x на место к
a[k] := x;
n := n + 1;
writeln( 'Преобразованный массив');
for var i := 1 to n do write(a[i], ' ');
end.

VI. Тестирование.

Методы расширения одномерных ди­намических массивов позволяют преоб­разовывать массивы с помощью встро­енных функций ConvertAll, Replace, Transform и др. (см. справочную систе­му PascalABC.Net).
1. Какие типы задач преобразования массивов вы можете назвать?
2. Как можно поменять местами два элемента в массиве?
3. Как удалить элемент из массива?
4. Как вставить элемент в массив?

Упражнения

1. Для задачи из примера 7.1 выполните перечисленные задания.

  1. Заполните таблицу.
  2. Добавьте в таблицу свои значения n и a.
  3. Можно ли заменить команды из п. 3.1. командами из п. 3.2?
3.1 if a[i] > 0 then a[i] := a[i] * 2;
if a[i] < 0 then a[i] := a[i] + 5;
3.2. if a[i] < 0 then a[i] := a[i] + 5;
if a[i] > 0 then a[i] := a[i] * 2;
  1. В каких случаях программа будет давать неверный результат?

2. Задан одномерный массив. Преобразуйте его элементы по следующему правилу: из всех положительных элементов вычесть элемент с номером k, ко всем отрица¬тельным добавить введенное число x. Нулевые элементы оставьте без изменения.
3. Задан одномерный массив из четного количества элементов. Поменяйте местами его «половинки».
4. В массиве записаны фамилии и имена учащихся класса. Из класса выбыли два учащихся. Известны их номера. Исключите данные этих учащихся из массива.
5. Для задачи из примера 7.4 выполните перечисленные задания.

  1. Заполните таблицу:
  2. Добавьте в таблицу свои значения n, a, x, k.
  3. Какой результат выдаст программа, если ввести n = 5, а k = 120? Вставьте в программу проверку для числа k (1 < k J n + 1).
  4. Какой результат получим, если заменить цикл из п. 4.1 циклом из п. 4.2?
4.1 for var i := n downto k do
a[i + 1] := a[i];
4.2. for var i := k to n do
a[i + 1] := a[i];

6. Переставьте первый элемент массива на последнее место, второй — на первое, третий — на второе и т. д.

 

Проверь себя