7.1. Основные задачиСреди задач преобразования элементов массива можно выделить задачи следующих типов: 1. Изменение элементов массива в зависимости от условий. 2. Обмен местами элементов массива. 3. Удаление элемента из массива. 4. Вставка элемента в массив. Рассмотрим каждую из задач. 7.2. Изменение элементов массива в зависимости от выполнения некоторых условийПример 7.1. Задан одномерный массив целых чисел. Преобразовать его элементы по следующему правилу: положительные элементы увеличить в 2 раза, а отрицательные — увеличить на 5. I. Исходные данные: одномерный массив а, количество элементов n. II. Результат: преобразованный массив а. III. Алгоритм решения задачи.
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. Алгоритм решения задачи.
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. Алгоритм решения задачи.
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. Алгоритм решения задачи.
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 остался неизмененным.
Пример 7.2. 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. 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. 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. Тестирование.
|
1. Какие типы задач преобразования массивов вы можете назвать?
2. Как можно поменять местами два элемента в массиве?
3. Как удалить элемент из массива?
4. Как вставить элемент в массив?
Упражнения
1. Для задачи из примера 7.1 выполните перечисленные задания.
- Заполните таблицу.
- Добавьте в таблицу свои значения n и a.
- Можно ли заменить команды из п. 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; |
- В каких случаях программа будет давать неверный результат?
2. Задан одномерный массив. Преобразуйте его элементы по следующему правилу: из всех положительных элементов вычесть элемент с номером k, ко всем отрица¬тельным добавить введенное число x. Нулевые элементы оставьте без изменения.
3. Задан одномерный массив из четного количества элементов. Поменяйте местами его «половинки».
4. В массиве записаны фамилии и имена учащихся класса. Из класса выбыли два учащихся. Известны их номера. Исключите данные этих учащихся из массива.
5. Для задачи из примера 7.4 выполните перечисленные задания.
- Заполните таблицу:
- Добавьте в таблицу свои значения n, a, x, k.
- Какой результат выдаст программа, если ввести n = 5, а k = 120? Вставьте в программу проверку для числа k (1 < k J n + 1).
- Какой результат получим, если заменить цикл из п. 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. Переставьте первый элемент массива на последнее место, второй — на первое, третий — на второе и т. д.