После сортировки произвести поиск в массиве введенного значения - 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;

Объяснение кода листинга программы

  1. В процедуре Poisk объявлены три переменные: a (массив), n (индекс текущего элемента) и k (значение, которое нужно найти).
  2. Переменная t инициализируется значением a[n], а значение a[n] заменяется на k (барьер).
  3. Переменная i инициализируется единицей и начинается цикл while, который выполняется до тех пор, пока a[i] не станет равным k.
  4. После цикла значение a[n] заменяется на t (сохраненное начальное значение).
  5. Если a[i] равно k, то это означает, что искомое значение было найдено. В этом случае выводится сообщение Hайден элемент с индексом i=, i.
  6. Если a[i] не равно k, то это означает, что искомое значение не было найдено. В этом случае выводится сообщение Элемент не найден.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы