Довольно-таки типичная задача для большого количества данных — поиск максимума. Например, в списке успеваемости учеников класса найти самого прилежного. Иначе говоря, требуется выбрать наибольшее значение среднего балла и указать фамилию ученика.
Пример 8.3. Программа поиска максимального элемента в массиве и его индекса (см. блок-схему, алгоритма на рис. 8.5)
Program Maximum; const N=10; type Mas=array [1..N] of integer; var A: Mas; i: integer; { Счетчик.цикла } Мах: integer; { Переменная для хранения величины максимального элемента } Imax: integer; { Переменная для хранения индекса максимального элемента } begin { Тело программы } { Заполним элементы массива значениями датчика случайных чисел и выведем весь получейный массив на экран в одном цикле } Randomize; for i:= 1 to N do begin A[i]:= -50+Random(101); write(A[i]:5) end; writein: { V. Поиск максимального элемента и его индекса в массиве } Imax:=l: { Сначала считаем, что первый элемент массива и есть максимальный } Мах:=А[1]; { Его индекс и величину записываем соответственно в переменные Imax и Мах } for i: = 2 to N do { Сравним нашего кандидата в максимумы со всеми остальными элементами массива (со второго до последнего) } if Мах < A[i] then { Если наш кандидат в максимумы оказался меньше текущего элемента... } begin Max:=A[i]; { ... то будем считать теперь кандидатом в максимумы текущий элемент} Imax:=i { Запомним его значение и индекс в переменных Мах и Imax } end; writeln ('Максимальный элемент в массиве=', Мах:5); writeln('Его индекс=', Imах:5); readln end.
Рис. 8.5. Блок-схема алгоритма поиска максимального элемента массива и его индекса
Заметим, что в процессе поиска максимума не обязательно хранить обе величины — номер максимума и его значение. Достаточно хранить одну, в зависимости от поставленной задачи.
Если индекс максимума не нужно знать, достаточно будет переменной Мах. Если, наоборот, нужен только номер — достаточно Imax. Тонкость состоит в том, что если нужно найти и то и другое, все равно достаточно найти только Imax, ведь значение максимума легко может быть получено по его индексу (A[Imax]). Иными словами, нашу программу можно упростить следующим образом:
Пример 8.4. Программа поиска максимума, не хранящая значение максимума, а запоминающая только его номер
Program Maximum2; const N=10; type Mas=array [1..N] of integer; var A: Mas; i, imax: integer; begin Randomize; for i:= 1 to N do begin A[i]:=-50+Random(101); write(A[i]:5) end; writeln; { V. Поиск индекса максимального элемента в массиве } imax:=l; for i := 2 to N do if A[imax] < A[i] then imax:=i; writeln ('Максимальный элемент в массиве=', A[imax]:5); writeln('Его индекс=',imax:5); readln end.
Задание 8.5. Выполните поиск максимальйого и минимального элемента в массиве за один цикл (блок-схема алгоритма показана на рис. 8.6).
Рис. 8.6. Блок-схема алгоритма поиска индексов максимального и минимального элементов массива за один цикл
Задание 8.6. В одномерном массиве из 10 элементов определить местоположение минимального элемента. Обнулить элементы, стоящие до него, но не сам этот элемент. (Обнулить — значит записать 0 на место элемента, то есть выполнить A[i] := 0.) Измененный массив вывести на экран.
Задание 8.7. В одномерном массиве из 10 элементов определить местоположение минимального и максимального элементов. Обнулить элементы, стоящие между ними, а также сами эти элементы.
Вычисление суммы и количества элементов массива с заданными свойствами
Еще одна задача — посчитать сумму элементов, которые удовлетворяют какому-то условию. Наверное, вы уже поняли общий принцип: перебираем все элементы массива (цикл for) и проверяем для каждого элемента выполнение условия (оператор if). Если условие выполнено, добавим элемент к сумме (S := S+A[i]).
Пример 8.5. Вычисление суммы положительных элементов массива
program PositivSumm; const N=10; . type Mas=array [1..N] of integer; var a: Mas; i: integer; { Счетчик цикла} S: integer; { Копилка - переменная для суммирования , положительных элементов } begin { Заполним массив случайными числами в диапазоне -100. .+100 } randomize; for i:=1 to N do begin a[i]:=-100+random(201); write(a[i]:5) end; writeln; { Присвоим переменным начальные значения } S:=0; { Переменная S - аккумулятор. Она будет накапливать фшу всех положительных элементов. Нужно присвоить ей такое начальное значение, чтобы оно не повлияло на результат суммирования. Таким числом является ноль } for i:=l to N do { Перебираем все элементы массива } if A[i]>0 then { Проверяем каждый элемент на положительность } S:=S+A[i]; { Если элемент положительный, добавляем значение элемента к аккумулятору } { Выводим результат на экран: } writeln('Сумма положительных элементов=',S); readln end.
Вот задача, очень похожая на предыдущую: посчитать количество элементов массива с указанными свойствами. Решается аналогично: переберем все элементы, проверим для каждого условие и, если оно выполнено, увеличим счетчик на единицу (к := к+1).
Пример 8.6. Вычисление количества четных элементов массива (блок-схема алгоритма показана на рис. 8.7)
program EvenCount; const N=10: type Mas=array [1..N] of integer; var a:Mas; i:integer; { Счетчик цикла } К:integer; { Копилка - переменная для подсчета количества четных элементов } begin { Заполним массив случайными числами в диапазоне +10..+100 } randomize; for i:=1 to N do begin a[i]:=+10+random(91); write(a[i]:5) end; writeln; { Присвоим переменным начальные значения } К:=0; { Переменная К - счетчик. Она будет выполнять ту же функцию, что и пальцы на руке при счете: каждый раз, когда будет встречаться четное число, будем загибать один палец, то есть увеличивать переменную К на единицу. В начале нужно присвоить ей такое значение, чтобы оно не повлияло на результат суммирования. Таким числом является ноль } for i:=l to N do { Перебираем все элементы массива } if a[i] mod 2=0 then { Проверяем.каждый элемент на четность, то есть проверяем, что остаток от деления этого элемента массива на 2 равен нулю } К:=К+1; { Если элемент четный, увеличиваем счетчик на единицу } { Выводим результат на экран: } writeln ( 'Количество четных элементов=' ,K) ; readln end.