Пусть имеется некоторый набор данных и
требуется определить, где в этом наборе находится заданный элемент ( и
есть ли он в наборе ). Такая задача называется задачей поиска.
Большинство задач поиска сводится к поиску в таблице ( массиве )
элемента с заданным значением.
Пример
Написать программу поиска элемента x в массиве из n элементов. Значение элемента x вводится с клавиатуры.
Решение
Пусть имеются следующие описания:
Const n = 10; { размерность массива }
Var a: array ( 1...n ) Of Integer;
{ массив из n элементов целого типа }
x: Integer; { искомый элемент целого типа }
В данном случае известно только значение разыскиваемого элемента,
никакой дополнительной информации о нем или о массиве, в котором его
надо искать, нет. Проверка одного элемента не дает никакой информации об
остальных. Поэтому для решения задачи разумно применить очевидный метод
- последовательный просмотр массива и сравнение значения очередного
рассматриваемого элемента с данным. Если значение очередного элемента
совпадает с x, то запомним его номер в переменной к.
For i: =1 To n Do If a[i] = x Then k: = i;
Этот способ решения поставленной задачи, безусловно, приводит к цели, но обладает рядом существенных недостатков:
• если значение x встречается в массиве несколько раз, то найдено будет последнее из них;
• после того, как нужное значение уже найдено, массив просматривается до конца, то есть всегда выполняется n сравнений.
Разумно прекратить просмотр сразу после
обнаружения заданного элемента. Так как в этом случае число повторений
не известно, необходимо использовать цикл с предусловием. В результате:
- либо будет найден искомый элемент, то есть найдется такой индекс i, что а [ i ] = x;
- либо будет просмотрен весь массив, и искомый элемент не обнаружится.
Таким
образом, поскольку нужно продолжать поиск до обнаружения искомого
элемента или до конца массива, условие окончания цикла может выглядеть
так:
While ( i <= n ) And ( a[ i ] x ) Do Inc ( i );
Примечание: Необходимо обратить внимание на порядок простых условий в
составном условии цикла. Здесь предполагается, что второе условие не
проверяется, если результат логического выражения ясен после проверки
первого условия. В противном случае возникнет отказ из-за выхода индекса
за границы массива.
Программа линейного поиска:
program n6;
const n=5;
var a:array[1..n] of integer;
{ массив из n элементов целого типа }
x:integer; { искомый элемент целого типа }
i,k:integer;
begin
writeln('Введите исходный массив:');
for i:=1 to n do read(a[i]);
writeln('Введите x');
readln(x);
for i:=1 to n do if a[i]=x then k:=i;
while (i<=n) and (a[i]x) do inc(i);
writeln('a[',k,']=',x,'=x');
end.