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