
- •Простейшие алгоритмы на одномерном массиве:
- •Подсчет элементов, обладающих заданным свойством
- •Поиск максимального и минимального элементов
- •Поиск элементов, обладающих заданным свойством
- •Сортировка элементов одномерного массива
- •Методические указания по решению задач 1-5,7,9,12,13 из пункта 1.1.5
Поиск элементов, обладающих заданным свойством
i:=1; { Поиск элементов }
while (i<=10) and (a[i]<>3) do i:=i+1; { равных данному (3) }
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; { Поиск элементов }
while (i<=10) and (a[i]<>3) do i:=i+1; { равных данному (3) }
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 (ЕСЛИ) анализирующий, как именно закончился оператор ПОКА, и выдающий нам соответствующее сообщение.
Еще раз отметим, что основное достоинство такого способа обработки массива заключается в том, что поиск будет прекращен сразу, как только нужный элемент будет найден.