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