После сортировки произвести поиск в массиве введенного значения - 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, то это означает, что искомое значение не было найдено. В этом случае выводится сообщение
Элемент не найден
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д