Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
массивы.DOC
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
269.31 Кб
Скачать

Поиск максимального и минимального элементов

...

s:=a[1]; {Поиск максимального элемента }

for i:=2 to 10 do

if a[i]>s then s:=a[i];

...

s:=a[1]; {Поиск минимального элемента }

for i:=2 to 10 do

if a[i]<s then s:=a[i];

...

Пусть одномерный массив A[i] содержит числа - рост 10 учеников в сантиметрах. Требуется найти рост самого высокого из учеников.

По обыкновению, рассмотрим задачу построчно.

s:=a[1];

Вначале в переменной S запоминаем рост первого ученика

for i:=2 to 10 do

Для всех остальных учеников от 2-го до 10-го делать

if a[i]>s then s:=a[i];

Если рост текущего (I-того) ученика больше чем тот, что мы помним в переменной S, то в S занести это большее значение.

Таким образом, когда эта процедура будет проделана для всех учеников, в переменной S окажется значение, соответствующее максимальному из всех, которые были введены в массив A.

А если требуется найти не максимальный, а минимальный элемент (т.е. рост самого маленького ученика), что тогда нужно изменить в данном алгоритме?

Верно - вместо знака ">" (больше) поставить знак "<" в операторе IF, получим:

s:=a[1]; {Поиск минимального элемента }

for i:=2 to 10 do

if a[i]<s then s:=a[i];

А если, например, в задаче 4 требуется найти разность наибольшего и наименьшего элементов, что тогда делать?

Завести разные переменные для максимального и минимального элементов:

max:=a[1]; {Поиск минимального элемента }

for i:=2 to 10 do

if a[i]>max then max:=a[i];

min:=a[1]; {Поиск минимального элемента }

for i:=2 to 10 do

if a[i]<min then min:=a[i];

s:=max-min;

Конечно, надо не забыть добавить объявление этих переменных

Var

i,s,MAX,MIN :integer;

...

Замечание: одновременный поиск максимального и минимального элементов в одномерном массиве можно было записать немного короче так:

max:=a[1]; min:=a[1];

for i:=2 to 10 do

begin

if a[i]>max then max:=a[i];

if a[i]<min then min:=a[i];

end;

s:=max-min;

В данном случае, когда внутри оператора FOR мы хотим выполнить 2 (или более) оператора IF, необходимо использовать так называемые операторные скобки BEGIN END. Такую последовательность операторов

BEGIN оператор1; оператор 2; ... ; END; принято называть составным оператором.

Обратите внимание на сдвиги вправо, отражающие вложенность выполнения операторов.

Поиск элементов, обладающих заданным свойством

i:=1; {Поиск элементов равных заданному например – 3}

while (i<=10) and (a[i]<>3) do i:=i+1;

if i>10

then writeln('3 нет ')

else writeln('первая 3 имеет индекс ',i);

Пусть у нас A[i] содержит оценки по информатике 10 учеников. Требуется выяснить имеется ли среди них хоть один ученик, имеющий тройку.

Конечно, можно было воспользоваться алгоритмом подсчета элементов, обладающих заданным свойством :

s:=0;

for i:=1 to 10 do

if a[i]=3 then s:=s+1;

if s=0

then writeln ('троечников нет')

else writeln ('троечник есть');

Правда в таком варианте нам не удается выяснить, а кто именно троечник (т.е. какой номер элемента, равного 3)?

Можно подправить предыдущий алгоритм следующим образом:

s:=0;

for i:=1 to 10 do

if a[i]=3 then begin s:=s+1; k:=i; end;

if s=0

then writeln ('троечников нет')

else writeln ('троечник есть, его номер',k);

Но основной недостаток такого подхода заключается в том, что мы вынуждены просматривать все элементы массива, хотя ответ на свой вопрос мы могли узнать уже после просмотра первого элемента - если он и оказался троечником. В случае 10 элементов в массиве это может и не трагедия, а если элементов в массиве 10 миллионов?

На этот случай в языке программирования ПАСКАЛЬ и предусмотрен оператор WHILE, используемый в данном алгоритме:

i:=1; {Поиск элементов равных заданному например – 3}

while (i<=10) and (a[i]<>3) do i:=i+1;

if i>10

then writeln('3 нет ')

else writeln('первая 3 имеет индекс ',i);

По обыкновению рассмотрим алгоритм построчно:

i:=1;

I присваиваем значение 1. I у нас будет переменная, в которой хранится номер текущего элемента массива A.

while (i<=10) and (a[i]<>3) do i:=i+1;

Буквально это читается так: Пока (i<=10) и (a[i]<>3) делать i:=i+1. А применительно к нашей задаче : Пока (массив не кончился) и (текущий элемент в массиве не тот, что мы ищем) (т.е. элемент не обладает нужным нам свойством) делать – взять следующий элемент. Из этого оператора ПОКА программа может выйти одним из двух способов:

  1. в процессе прибавления 1 к I (взятия следующих элементов) так и не нашлось нужного нам элемента

  2. нужный элемент нашелся при некотором i

if i>10

then writeln('3 нет ')

else writeln('первая 3 имеет индекс ',i);

Как раз по причине 2-х вариантов следом и стоит оператор IF (ЕСЛИ) анализирующий, как именно закончился оператор ПОКА, и выдающий нам соответствующее сообщение.

Еще раз отметим, что основное достоинство такого способа обработки массива заключается в том, что поиск будет прекращен сразу, как только нужный элемент будет найден.