Введение
Часто на практике возникает необходимость не просто найти какие-то характеристики массива (сумму, максимум, минимум), а изменить значения его элементов по определенному правилу. Этот процесс называется преобразованием массива.
Базовый шаблон программы для работы с массивом:
Перед изучением преобразований вспомним, как выглядит код для создания и вывода массива.
pascal
program ArrayTransformations;
var
arr: array of Integer; // Объявление динамического массива
n, i: Integer;
begin
Write('Введите количество элементов n: ');
ReadLn(n);
SetLength(arr, n); // Выделение памяти для n элементов
// Заполнение массива (например, с клавиатуры)
WriteLn('Введите элементы массива:');
for i := 0 to n-1 do
ReadLn(arr[i]);
// **ЗДЕСЬ БУДЕТ РАЗМЕЩАТЬСЯ КОД ПРЕОБРАЗОВАНИЯ МАССИВА**
// Вывод преобразованного массива
Write('Преобразованный массив: ');
for i := 0 to n-1 do
Write(arr[i], ' ');
end.
Основные типы преобразований:
1. Преобразование, зависящее только от значения элемента.
Каждый элемент изменяется по одному и тому же правилу, независимо от его соседей или положения в массиве.
Пример правила: «Заменить все отрицательные элементы их квадратами».
Реализация: Используется цикл, в котором каждый элемент проверяется и изменяется.
Код:
pascal
for i := 0 to n-1 do
if arr[i] < 0 then
arr[i] := arr[i] * arr[i];
2. Преобразование, зависящее от положения элемента (индекса).
Значение нового элемента вычисляется на основе его позиции i в массиве.
Пример правила: «Умножить все элементы с четными индексами на 2, а с нечетными – на -1».
Реализация: В цикле анализируется не значение arr[i], а индекс i (например, с помощью операции i mod 2).
Код:
pascal
for i := 0 to n-1 do
if i mod 2 = 0 then
arr[i] := arr[i] * 2
else
arr[i] := arr[i] * (-1);
3. Преобразование, использующее соседние элементы.
Для расчета нового значения элемента нужны значения других элементов массива. Внимание! Часто требуется использовать вспомогательную переменную или второй массив, чтобы не затирать исходные данные, необходимые для дальнейших расчетов.
Пример правила: «Каждый элемент заменить на сумму его соседей».
Для элемента arr[1] новые соседи — это старые arr[0] и arr[2].
Если мы будем сразу записывать новое значение в arr[1], то при расчете для arr[2] старый arr[1] будет уже утерян.
Решение: Создадим новый массив temp для хранения результатов.
Код:
pascal
var temp: array of Integer;
SetLength(temp, n); // Создаем временный массив такой же длины
// Для первого и последнего элемента соседей может не быть, обработаем их отдельно
temp[0] := arr[0]; // или temp[0] := arr[1]; по условию задачи
temp[n-1] := arr[n-1]; // или temp[n-1] := arr[n-2];
for i := 1 to n-2 do // Обрабатываем элементы со второго до предпоследнего
temp[i] := arr[i-1] + arr[i+1];
// Теперь скопируем результаты обратно в исходный массив arr
for i := 0 to n-1 do
arr[i] := temp[i];
4. Циклический сдвиг элементов.
Элементы массива сдвигаются влево или вправо, а тот элемент, который "выталкивается" за границу, записывается с противоположного конца.
Сдвиг влево:
pascal
temp := arr[0]; // Запоминаем ПЕРВЫЙ элемент
for i := 0 to n-2 do
arr[i] := arr[i+1]; // Сдвигаем все элементы на одну позицию влево
arr[n-1] := temp; // Записываем запомненный первый элемент на место последнего
Сдвиг вправо:
pascal
temp := arr[n-1]; // Запоминаем ПОСЛЕДНИЙ элемент
for i := n-1 downto 1 do // Идем с конца к началу
arr[i] := arr[i-1]; // Сдвигаем все элементы на одну позицию вправо
arr[0] := temp; // Записываем запомненный последний элемент на место первого
Видео урок по данному уроку от учителя информатики Трашкова Олега Леонидовича