Типовые алгоритмы обработки массивов
Большинство задач, связанных с обработкой массивов, используя
метод пошаговой детализации, можно свести к небольшому числу типо-
вых (стандартных) алгоритмов. К ним относятся:
1.Вычисление суммы (произведения) элементов массива.
2.Нахождение суммы (произведения) элементов массива удовлетворяющих некоторому условию или определение количества элементов, удовлетворяющих некоторому условию.
3.Нахождение максимального (минимального) элемента массива
и(или) его индекса.
4.Формирование нового(ых) массива(ов ) из элементов заданно-
го(ых) массива(ов).
5.Изменение элементов исходного массива.
6.Сдвиг (перестановка) элементов в массиве (циклический сдвиг).
7.Поиск заданного элемента массива
8.Сортировка элементов массива.
Рассмотрим некоторые из них.
Пример 1. Дан одномерный массив целых чисел размерностью n,
полученный с помощью случайных чисел. Требуется построить из него
два массива, в первый из которых записаны элементы исходного масси-
ва, меньшие половины максимального значения, а во второй – осталь-
ные.
Эта задача сводится к двум типовым: 3 и 4.
Третий тип - задача поиска максимума в массиве решается класси-
ческим способом: сначала считается, что максимальный элемент – первый. Затем организуется цикл, в котором просматриваются все элементы, начиная со второго, и сравниваются с максимальным. Если текущий элемент больше, то заменяем значение максимального.
Для формирования новых массивов (4 тип) снова организуем цикл для просмотра всех элементов исходного массива, сравнивая каждый элемент с половиной максимума. В зависимости от истинности условия записываем элемент в новый массив: для этого сначала увеличиваем значение индекса нового массива и присваиваем соответствующему элементу нового массива значение элемента исходного массива.
Так как в данной задаче придется трижды выводить на экран элементы одномерных массивов, то оформим фрагмент вывода в виде процедуры. Ввод же исходного массива (случайным образом) организуем непосредственно в тексте основной программы.
program mas_typ3_4;
const n1=40;
type mas1=array[1..n1] of integer;
var i,n,k1,k2,max : integer;
a,b,c : mas1;
procedure print_mas(k:integer; d:mas1);
var j : integer;
begin
for j:=1 to k do write(d[j]:3);
writeln
end;
Begin
writeln('введите число элементов массива ');
readln(n);
{формируем массив из чисел от -20 до 30}
for i:=1 to n do
a[i]:=random(51)-20;
writeln(' исходный массив');
{вызываем процедуру вывода массива на экран}
92
print_mas(n,a);
{начинаем поиск максимума}
max:=a[1];
for i:=1 to n do
if a[i]>max then max:=a[i];
{обнуляем счетчики элементов новых массивов}
k1:=0; k2:=0; {}
{начинаем цикл для их формирования}
for i:=1 to n do
if a[i]>max/2 then {записываем элемент в массив b }
begin
k1:=k1+1;{}
b[k1]:=a[i]
end
else {записываем элемент в массив c }
begin
k2:=k2+1;{}
c[k2]:=a[i]
end;
{выводим новые массивы на экран}
writeln ('первый массив');
print_mas(k1,b);
writeln ('второй массив');
print_mas(k2,c);
end.
Пример 2. Дан двумерный массив, содержащий n строк и m
столбцов. Определить, есть ли в нем столбец, состоящий только из чет-
ных элементов. Если таких столбцов несколько, то вывести номера каж-
дого из них, если такого столбца нет, то сообщить об этом.
Рабочий блок программы будет реализован с помощью вложенных
циклов, причем внешний цикл надо организовать по индексу столбца, а
внутренний – по индексу строки. Во внутреннем цикле будем подсчиты-
вать количество четных элементов в текущем столбце (его индекс изме-
няется во внешнем цикле), а по окончании – проверять, равно ли это ко-
личество количеству всех элементов столбца. Если да - то выводим на
экран номер столбца. Для сигнализации о том, что такого столбца нет,
введем переменную булевского типа –флажок, которому первоначально
присвоим значение false (искомый столбец не найден). Если же такой
столбец находится, то изменяем значение флажка на true:
program mas2_poisk;
var i,j,n,m,k:integer;
f:boolean;
a:array[1..15,1..15] of integer;
begin
writeln('введите число строк и столбцов не больше 15 ');
readln(n,m);
randomize;
{формируем массив из чисел от 1 до 10}
for i:=1 to n do
for j:=1 to m do
a[i,j]:=random(10)+1;
{выводим массив на экран }
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:3);
writeln;
end;
f:=false; {такого столбца пока нет}
{начинаем цикл по столбцу}
for j:=1 to m do
begin
k:=0; {счетчик четных элементов}
for i:=1 to n do
if a[i,j] mod 2=0 then k:=k+1;
{конец внутреннего цикла}
if k=n then {столбец найден}
begin f:=true;
writeln('столбец номер ',j);
end;
end; {конец внешнего цикла}
if not(f) then writeln('столбца нет')
end.