После сортировки произвести поиск в массиве введенного значения - Pascal
Формулировка задачи:
Подскажите пожалуйста у меня в этом коде, точнее в процедуре: Poisk (Поиск искомого значения с барьером), есть ошибка, она может найти почти любое число из массива, кроме последнего, в чем может быть проблема?
{
Задача:
Дано натуральное число N (1N100), целочисленный линейный массив a0, a1, …, aN-1.
Элементы массива заполняются случайными целыми числами из диапазона [0, N].
Требуется отсортировать массив. Метод сортировки определяется вариантом в соответствии с таблицей № 1.
После сортировки произвести поиск в массиве введенного значения. Алгоритм поиска определяется в таблице № 2.
}
const
n = 10;
type
TIndex = 1..n;
TElement = integer;
Tvector = array [TIndex] of TElement;
var
m :TElement;
a : Tvector;
i,k : TElement;
{Заполнение массива}
procedure MakeVector (var a : TVector; n : word);
var
i : TIndex;
begin {MakeVector}
randomize;
for i:=1 to n do
a[i] := random(m);
end; {MakeVector}
{Вывод массива на экран}
procedure PrintVector (var a : TVector; n : word);
var
i : TIndex;
begin {PrintVector}
for i:=1 to n do
write(a[i]:4);
writeln;
end; {PrintVector}
{Процедура сортировки массива}
procedure Sortirovka (var a : TVector; n : word);
var
i,j,imin : integer;
begin {Sort}
for i:=1 to n-1 do
begin
imin := i;
for j:= i+1 to n do
if a[j]<a[imin] then
imin:=j;
swap(a[i], a[imin]);
end;
end; {Sort}
{Поиск искомого значения с барьером}
procedure Poisk (var a : TVector; n : word);
var
k:integer;
begin
write('Введите искомое число k= ');
read(k);
i:=1;
a[n]:=k;{барьер}
while a[i]<>k do
inc(i);
if i<n then
writeln('Hайден элемент с индексом i= ', i)
else
writeln('Элемент не найден');
end;
Begin
write('Введите диапозон max числа :');
read(m);
{Создание массива}
MakeVector(a,n);
PrintVector(a,n);
{Сортировка массива}
Sortirovka(a,n);
PrintVector(a,n);
{Поиск искомого значения с барьером}
writeln;
Poisk(a,n);
End.Решение задачи: «После сортировки произвести поиск в массиве введенного значения»
textual
Листинг программы
{Поиск искомого значения с барьером}
procedure Poisk(var a: TVector; n: word; k: Integer);
var t: integer;
begin
t:=a[n]; a[n]:=k; {сохраним крайний элемент, установим барьер}
i:=1; while a[i]<>k do Inc(i); a[n]:=t; {выполним поиск, вернем крайний элемент}
if a[i]=k {проверим, что же было найдено}
then WriteLn('Hайден элемент с индексом i= ', i)
else WriteLn('Элемент не найден');
end;
Объяснение кода листинга программы
- В процедуре Poisk объявлены три переменные: a (массив), n (индекс текущего элемента) и k (значение, которое нужно найти).
- Переменная t инициализируется значением a[n], а значение a[n] заменяется на k (барьер).
- Переменная i инициализируется единицей и начинается цикл while, который выполняется до тех пор, пока a[i] не станет равным k.
- После цикла значение a[n] заменяется на t (сохраненное начальное значение).
- Если a[i] равно k, то это означает, что искомое значение было найдено. В этом случае выводится сообщение
Hайден элемент с индексом i=, i. - Если a[i] не равно k, то это означает, что искомое значение не было найдено. В этом случае выводится сообщение
Элемент не найден.