Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебники по паскалю / Простейшие алгоритмы на одномерном массиве.doc
Скачиваний:
68
Добавлен:
25.03.2015
Размер:
66.05 Кб
Скачать

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

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 (ЕСЛИ) анализирующий, как именно закончился оператор ПОКА, и выдающий нам соответствующее сообщение.

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