- •7. Типовые алгоритмы обработки массивов
- •А1. Ввод массива с клавиатуры
- •А2. Вывод одномерного массива целых по k чисел в строке
- •А3. Вывод элементов прямоугольной матрицы по строкам
- •А4. Сумма элементов массива:
- •А5. Поиск максимального / минимального элемента
- •А6. Подсчет числа элементов массива, удовлетворяющих условию
- •А7. Выбор элементов по условию
- •А8. Проверка выполнения некоторого условия
- •А9. Поиск номера элемента, удовлетворяющего условию
- •Примеры использования типовых алгоритмов Пример 1. ”Сформировать массив ”с”, включив в него четные элементы массива ”а”, которые присутствуют в массиве ”в”.
- •Пример 2. ”Найти значение элемента, встречающегося в массиве наибольшее количество раз”.
- •Пример 3. В матрице a[1..N, 1..M] поменять местами первый и третий отрицательные элементы, встретившиеся при просмотре матрицы по строкам слева направо и сверху вниз.
А4. Сумма элементов массива:
S
:= 0; for
j:=1
to n
do S
:= S + a[j]; {Повторить
для каждого элемента} {end
for}
А5. Поиск максимального / минимального элемента
Н
Алгоритм 5а
Алгоритм 5б amax
:= a[1]; for
j:=2 to
n do if
a[j]>amax then amax
:= a[j]; {end
if} {end
for} {максимальное
значение в
переменной amax} jmin
:= 1; for
j:=2 to
n do if
a[j]<a[jmin] then a[jmin]
:= a[j]; {end
if} {end
for} {индекс
минимального элемента jmin
} {а
само
значение - в a[jmin]}
А6. Подсчет числа элементов массива, удовлетворяющих условию
np
:= 0; { np : integer } for
j:=1 to
n do if
(a[j] удовлетворяет
условию)
then np
:= np + 1; {end
if} {end
for}
{После
завершения ципкла
переменная np
содержит число
элементов массива, удовлетворяющих
условию}
В этом типовом алгоритме можно указать то условие, которое необходимо в конкретных условиях. Так, например, при подсчете количества положительных чисел это условие имеет вид «(a[j]>0)», а в случае подсчета количества простых чисел «Simple(a[j])», гдеSimple – имя функции, возвращающей значение TRUE. еслиa[j]простое число, и FALSE – в противоположном случае.
А7. Выбор элементов по условию
Данный алгоритм в приведенном ниже примере используется при формировании нового массива, в который включаются те элементы исходного массива, которые удовлетворяют некоторому условию.
{Пусть
a[1..nA]
- исходный
массив } {
c[1..nC] – новый
массив } {
nC – фактическое
число элементов в новом массиве} {––––––––––––––––––––––––––––––––-} nC
:= 0; for
j:=1
to n
do
{просмотреть
каждый элемент в ’a’} if
(a[j] удовлетворяет
условию)
then begin nC
:= nC + 1; {} c[nC]
:= a[j]; {добавить
новый элемент в ’c’} end;
{if} {end
for}
А8. Проверка выполнения некоторого условия
В приведенном ниже фрагменте производится проверка факта существования в заданном массиве хотя бы одного элемента, удовлетворяющего некоторому условию.
В данном алгоритме просмотр элементов производится с использованием конструкции ”цикл-пока”. Это объясняется тем, что просмотр можно прекращать сразу после того, как будет найден элемент, удовлетворяющий условию. Однако поскольку возможна ситуация, что в массиве вообще нет элементов, удовлетворяющих условию, цикл может быть закончен либо когда найден первый элемент, удовлетворяющий условию, либо когда просмотрены все элементы массива, но в массиве нет ни одного элемента, удовлетворяющего условию. Для того чтобы своевременно закончить просмотр элементов и, после выхода из цикла установить, найден или нет требуемый элемент, в программе введена переменная булевского типа FlagFound, выполняющая функцию признака «найден/нет».
FlagFound
:= FALSE; {не
найден пока}
j
:= 1; while
(j<=n) and
(not
FlagFound) do if
(a[j] удовлетворяет
условию)
then FlagFound
:= TRUE else j
:= j + 1; {end
if} {end
while} {–––––––––––––––––––––––––––––––––––––––––-} {если
после выхода из цикла FlagFound=TRUE, элемент
найден}
Переменные типа FlagFound очень активно применяются в случаях, когда требуется организовать циклическую обработку с неопределенным числом повторений тела цикла, и при условии, когда максимально возможное количество циклов ограниченно. В первую очередь это относится к ряду алгоритмов обработки элементов массива.
