
- •7. Типовые алгоритмы обработки массивов
- •А1. Ввод массива с клавиатуры
- •А2. Вывод одномерного массива целых по k чисел в строке
- •А3. Вывод элементов прямоугольной матрицы по строкам
- •А4. Сумма элементов массива:
- •А5. Поиск максимального / минимального элемента
- •А6. Подсчет числа элементов массива, удовлетворяющих условию
- •А7. Выбор элементов по условию
- •А8. Проверка выполнения некоторого условия
- •А9. Поиск номера элемента, удовлетворяющего условию
- •Примеры использования типовых алгоритмов Пример 1. ”Сформировать массив ”с”, включив в него четные элементы массива ”а”, которые присутствуют в массиве ”в”.
- •Пример 2. ”Найти значение элемента, встречающегося в массиве наибольшее количество раз”.
- •Пример 3. В матрице a[1..N, 1..M] поменять местами первый и третий отрицательные элементы, встретившиеся при просмотре матрицы по строкам слева направо и сверху вниз.
А9. Поиск номера элемента, удовлетворяющего условию
Для решения данной задачи можно воспользоваться алгоритмом A8, вернув результат в переменной j, выполняющей функцию счетчика цикла и индекса элемента массива одновременно, и связав факт того, найден элемент или нет, со значением переменнойFlagFound.
Примеры использования типовых алгоритмов Пример 1. ”Сформировать массив ”с”, включив в него четные элементы массива ”а”, которые присутствуют в массиве ”в”.
В
Алг
”Выбор
из массива” нач ввод-массивов-А-и-В формирование-массива-С вывод-массива-С кон
Анализируя этот алгоритм мы видим, что ”ввод-массивов-А-и-В” можно реализовать, применив дважды алгоритм А1 (поменяв при этом имена переменных и скорректировав тексты сообщений на экран), а ”вывод-массива-С” несложно обеспечить, воспользовавшись алгоритмом А2. Нам остается только разработать алгоритм ”формирование-массива-С”.
Приведем план решения этой задачи:
План
”формирование-массива-С
” нач nC
:= 0; {массив
С пуст} for
i:=1 to
nA do
{повторить
для каждого элемента
массива А} if
(A[i] четное)
then
begin искать-A[i]-в-массиве-В
{установить
FlagFound} if
FlagFound then добавить-A[i]-в-массив-C {end
if} end;
{if} {end
for} кон
Теперь нужно раскрыть планы действий ”искать-A[i]-в-массиве-В ” и ”добавить-A[i]-в-массив-C”.
Первый план –это модификация алгоритма А8:
FlagFound
:= FALSE; {не
найден пока} j
:= 1; while
(j<=nB) and
(not
FlagFound) do if
(A[i] = B[j]) then
{значение
A[i] имеется в массиве В} FlagFound
:= TRUE else j
:= j + 1; {end
if} {end
while}
В
План
”добавить-A[i]-в-массив-C” нач nC
:= nC + 1; C[nC]
:= A[i]; кон
И
(A[i]
mod
2) = 0
(A[i]
mod
2) = 0
Т
План
”формирование-массива-С
” нач nC
:= 0; {массив
С пуст} for
i:=1 to
nA do
{повторить
для каждого элемента массива А} if
(A[i] mod
2) = 0
then
begin {искать-A[i]-в-массиве-В
{установить
FlagFound}} FlagFound
:= FALSE; {не
найден пока}
j := 1; while
(j<=nB) and
(not
FlagFound) do if
(A[i] = B[j]) then
{значение
A[i] имеется в В} FlagFound
:= TRUE else j
:= j + 1; {end
if} {end
while} if
FlagFound then
{добавить-A[i]-в-массив-C} begin nC
:= nC + 1; C[nC]
:= A[i]; end;
{end
if} end;
{if} {end
for} кон
Задача разработки отдельных фрагментов решена, и теперь остается только получить итоговый (детальный) алгоритм, выполнив подстановку отдельных планов в укрупненный алгоритм. Эту работу читателю предлагается выполнить самостоятельно.
Пример 2. ”Найти значение элемента, встречающегося в массиве наибольшее количество раз”.
В
План нач ввод-массива вычисление-числа-повторений вывод-результата кон
При решении этой задачи можно воспользоваться алгоритмами ввода массива, выбора максимального числа и алгоритма подсчета числа элементов, удовлетворяющих условию.
П
План
”вычисление-числа-повторений” Var MaxCount
: integer; {макс.
число повторений} Count
: integer; {число
повторений текущ. элемента} Elem
: integer; {величина
элемента, встретившегося чаще всего} A:array[1..10]
оf
integer; n
: integer; {число
элементов в массиве А} нач
MaxCount
:= 0; for
j:=1 to
n do
begin
подсчет-числа-повторений–A[j]-в-массива-А
{результат
записать в Count} if
Count>MaxCount then
begin MaxCount
:= Count; Elem
:= A[j]; end;
{if} end;
{for} кон
Р
План
”подсчет-числа-повторений–A[j]-в-массива-А” нач
Count
:= 0; for
i:=1 to n do if
A[j]=A[i] then Count
:= Count +1; {end
if} {end
for} кон
Детальный алгоритм решения задачи читателю предлагается выполнить самостоятельно.