Проверка наличия элемента в массиве методом половинного деления (бинарный, бисекция) - Free Pascal
Формулировка задачи:
Задан массив. С клавиатуры вводится значение и нужно проверить методом половинного деления есть ли такой элемент в массиве. Сортирую его пузырьком.
Какой бы я элемент из массива не вводила - выдает ошибку. Не могу понять почему, алгоритм вроде правильный.
Подскажите, пожалуйста.
нашла в чем ошибка. вот только крайние элементы не находит( -8).
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;
Решение задачи: «Проверка наличия элемента в массиве методом половинного деления (бинарный, бисекция)»
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.
Объяснение кода листинга программы
- Объявление переменных и массива — x: массив из 10 целых чисел с элементами (2,-3,7,3,0,-2,5,4,2,-8) — a, i, j, temp, left, right, middle: целочисленные переменные — flag: булевая переменная
- Вывод содержимого массива x — Цикл for i:=1 to 10 выводит каждый элемент массива x
- Ввод значения переменной a — Пользователю предлагается ввести значение a
- Сортировка массива x методом половинного деления — Два вложенных цикла for i:=1 to 10 и for j:=1 to 10-i осуществляют сортировку массива методом половинного деления — Если текущий элемент x[j] больше следующего элемента x[j+1], то они меняются местами с помощью временной переменной temp
- Вывод отсортированного массива x — Цикл for i:=1 to 10 выводит каждый элемент отсортированного массива x
- Установка начальных значений переменных left, right и flag — left и right устанавливаются равными 1 и 10 соответственно — flag устанавливается равным FALSE
- Основной цикл для поиска элемента 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 в массиве
- Проверка наличия элемента a в массиве — Если flag равно FALSE, то выводится сообщение об ошибке — Если flag равно TRUE, то выводится сообщение x[middle]=a и значение middle
- Чтение значения из файла или с клавиатуры — readln считывает строку из файла или с клавиатуры