Проверка наличия элемента в массиве методом половинного деления (бинарный, бисекция) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Задан массив. С клавиатуры вводится значение и нужно проверить методом половинного деления есть ли такой элемент в массиве. Сортирую его пузырьком. Какой бы я элемент из массива не вводила - выдает ошибку. Не могу понять почему, алгоритм вроде правильный. Подскажите, пожалуйста.
program ex1;
var x:array[1..10] of integer=(2,-3,7,3,0,-2,5,4,2,-8);
    a,i,j,temp,left,right,middle:integer;
    flag:boolean;
begin
for i:=1 to 10 do  
    write(x[i]:4);
writeln;
 write('Enter a='); 
readln(a);
 
for i:=1 to 10 do 
begin
        for j:=1 to 10-i do
        if x[j]<x[j+1] then
            begin 
            temp:=x[j];
            x[j]:=x[j+1];
            x[j+1]:=temp;
            end;
end;
 
writeln;
writeln('Vporjadkovanij'); 
for i:=1 to 10 do 
write(x[i],' ');
 
left:=1; 
right:=10;
flag:=FALSE;
 
writeln;
while left<right do 
begin
    middle:=(left+right) div 2;
    if a=x[middle] then 
    begin
        writeln('x[',middle,']=',a); 
        flag:=TRUE;
    end;
    if a<x[middle] then right:=middle-1
    else left:=middle+1;
end;
 
if not(flag) then writeln('Error!'); 
 
readln;
end.
if a<x[middle] then left:=middle+1 * * else right:=middle-1;
нашла в чем ошибка. вот только крайние элементы не находит( -8).

Решение задачи: «Проверка наличия элемента в массиве методом половинного деления (бинарный, бисекция)»

textual
Листинг программы
program ex1;
var x:array[1..10] of integer=(2,-3,7,3,0,-2,5,4,2,-8);
    a,i,j,temp,left,right,middle:integer;
    flag:boolean;
begin
for i:=1 to 10 do
write(x[i]:4);
writeln;
write('Enter a=');
readln(a);
for i:=1 to 10 do
 begin
   for j:=1 to 10-i do
   if x[j]>x[j+1] then
    begin
     temp:=x[j];
     x[j]:=x[j+1];
     x[j+1]:=temp;
    end;
 end;
writeln('Vporjadkovanij');
for i:=1 to 10 do
write(x[i],' ');
writeln;
left:=1;
right:=10;
flag:=FALSE;
while (left<=right)and not flag do
 begin
  middle:=(left+right) div 2;
  if a<x[middle] then right:=middle-1
  else if a>x[middle] then left:=middle+1
  else flag:=true;
 end;
if not flag then writeln('Error!')
else write('x[',middle,']=',a);
readln;
end.

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

  1. Объявление переменных и массива — x: массив из 10 целых чисел с элементами (2,-3,7,3,0,-2,5,4,2,-8) — a, i, j, temp, left, right, middle: целочисленные переменные — flag: булевая переменная
  2. Вывод содержимого массива x — Цикл for i:=1 to 10 выводит каждый элемент массива x
  3. Ввод значения переменной a — Пользователю предлагается ввести значение a
  4. Сортировка массива x методом половинного деления — Два вложенных цикла for i:=1 to 10 и for j:=1 to 10-i осуществляют сортировку массива методом половинного деления — Если текущий элемент x[j] больше следующего элемента x[j+1], то они меняются местами с помощью временной переменной temp
  5. Вывод отсортированного массива x — Цикл for i:=1 to 10 выводит каждый элемент отсортированного массива x
  6. Установка начальных значений переменных left, right и flag — left и right устанавливаются равными 1 и 10 соответственно — flag устанавливается равным FALSE
  7. Основной цикл для поиска элемента a в отсортированном массиве — while (left<=right)and not flag выполняет поиск элемента a в отсортированном массиве до тех пор, пока left меньше или равно right и flag равно FALSE — middle:=(left+right) div 2 вычисляет средний индекс — Если a меньше x[middle], то right устанавливается равным middle-1, чтобы продолжить поиск в левой половине массива — Если a больше x[middle], то left устанавливается равным middle+1, чтобы продолжить поиск в правой половине массива — Если a равно x[middle], то flag устанавливается равным TRUE, что означает нахождение элемента a в массиве
  8. Проверка наличия элемента a в массиве — Если flag равно FALSE, то выводится сообщение об ошибке — Если flag равно TRUE, то выводится сообщение x[middle]=a и значение middle
  9. Чтение значения из файла или с клавиатуры — readln считывает строку из файла или с клавиатуры

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


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

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

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