
- •7. Типовые алгоритмы обработки массивов
- •А1. Ввод массива с клавиатуры
- •А2. Вывод одномерного массива целых по k чисел в строке
- •А3. Вывод элементов прямоугольной матрицы по строкам
- •А4. Сумма элементов массива:
- •А5. Поиск максимального / минимального элемента
- •А6. Подсчет числа элементов массива, удовлетворяющих условию
- •А7. Выбор элементов по условию
- •А8. Проверка выполнения некоторого условия
- •А9. Поиск номера элемента, удовлетворяющего условию
- •Примеры использования типовых алгоритмов Пример 1. ”Сформировать массив ”с”, включив в него четные элементы массива ”а”, которые присутствуют в массиве ”в”.
- •Пример 2. ”Найти значение элемента, встречающегося в массиве наибольшее количество раз”.
- •Пример 3. В матрице a[1..N, 1..M] поменять местами первый и третий отрицательные элементы, встретившиеся при просмотре матрицы по строкам слева направо и сверху вниз.
7. Типовые алгоритмы обработки массивов
Анализ программ обработки массивов позволяет выделить несколько типовых алгоритмов. Ниже приводится несколько часто встречающихся алгоритмов. Алгоритмы будут представлены в основном на языке «псевдоПаскаль», т.е. в таком виде, когда на Паскале записаны «инвариантные» части алгоритма, а на русском языке - та часть текста, которая зависит от специфики применения алгоритма.
А1. Ввод массива с клавиатуры
Д
План
”Ввод-массива-вещественных-чисел” Внутр.
перем.:
n, j : цел
{n – фактический
объем массива} a[1..nmax]
: вещ
{
nmax = 100 - константа} Нач {ввод
числа элементов массива} цикл вывод
(’Введите
число элементов ’) ввод
(n) если
(n<1) или
(n>nmax) то вывод
(’Ошибка’) все кцикл-до
(n>=1) и
(n<=nmax) {ввод
элементов массива} цикл-для
j от
1 до
n вывод
(’введите
’,j,’-й
элемент ’) ввод
(a[j]) кцикл Кон
Как видно из текста исполнимой части, алгоритм сводится к последовательному выполнению двух действий: вводу числа элементов и вводу элементов. Логика первого действия построена таким образом, что она будет завершена только в том случае, когда значение вводимого числа будет допустимым, т.е. принадлежать интервалу {1 . . nmax}.
Примечание. Объявление внутренних переменных приведено только для того, чтобы при кодировании на Паскале использовать корректные средства этого языка. Однако приведенный алгоритм корректный и для случая вещественных элементов массива.
Исполнимая часть алгоритма приведена ниже в виде фрагмента на Паскале:
{ввод
числа элементов массива} repeat write
(’Введите
число элементов ’); readln(n); if
(n<1) or
(n>nmax)
then writeln(’Ошибка’); {if} until
(n>=1) and
(n>=nmax); {ввод
элементов массива} for
j:=1 to
n do
begin write(’
введите
’,j,’-й
элемент’); readln(a[j]); end;
{for}
При этом предполагается, что в программе, где расположен этот фрагмент, объявлены следующие переменные:
Const nmax
= 100; {максимальный
объем массива}
Var n,
j : integer; {n – фактический
объем массива а} {j
– счетчик
цикла} a
: array [1..nmax] of real;
А2. Вывод одномерного массива целых по k чисел в строке
Идея алгоритма заключается в том, что в теле цикла каждый раз выводится без смены строки один элемент, а строка меняется только после вывода элемента, номер которого кратен значению k.
Т
for
j:=1 to
n do
begin
{повторить
для каждого элемента} write
(a[j]:7); {напечатать текущий в 7-ми позициях} if
(j mod
k)=0 then
{если текущий k–й в строке то} writeln;
{сменить строку} {end
if} end;
{for} writeln;
{перейти на новую строку}
А3. Вывод элементов прямоугольной матрицы по строкам
Алгоритм приведен для случая, когда число столбцов матрицы позволяет напечатать строку матрицы в одной строке экрана (при выводе на экран монитора в текстовом режиме ширина строки равна 80 символам).
{Пусть
матрица имеет n
строк
и m
столбцов,} {а
ее элементы – вещественные числа
} {Пусть
также все m
элементов
помещаются в одной строке печати} for
i:=1 to
n do
begin for
j:=1 to
m do
{печатать все элементы строки j} write
(a[i,j]:8:2); {напечатать
число в 8-ми позициях, } {отобразив
в нем 2 десятичные цифры} {end
if} writeln;
{сменить
строку печати перед выводом новой
строки матрицы} end;