Найти все элементы массива равные Х, используя бинарный поиск. Х вводится с клавиатуры ,...

0 голосов
65 просмотров

Найти все элементы массива равные Х, используя бинарный поиск. Х вводится с
клавиатуры , на паскале, методом " Поиск элементов в одномерном массиве", Решить с процедурой.


Информатика (153 баллов) | 65 просмотров
0

Объектно-ориентированное программирование? Конструирование класса и определение в нем метода? Или Вы словом "метод" бросаетесь, не понимая, что это в программировании особая концепция?

0

Скорее всего, не понимает, иначе формулировка была бы другая, без слова "процедура". К тому же метод здесь требуется весьма интересный (метод " Поиск элементов в одномерном массиве").

0

Да нет, в PascalABC.NET этот метод уже есть и его просто нужно вызвать))

0

Да, но как это сочетать с "используя бинарный поиск"?

0

Например так: function BinarySearch(self: array of T; x: T): integer; extensionmethod; Выполняет бинарный поиск в отсортированном массиве

0

Вызвать и написать - не совсем одно и то же. Тем более, что в условии не сказано, что бинарный поиск нужно именно НАПИСАТЬ.

0

Вы правы, как всегда. Ещё один вопрос. BinarySearch находит один номер? А если в массиве несколько элементов = X?

0

По алгоритму бинарного поиска находится "один из". Какой - не уточняет алгоритм, это зависит от того, сколько одинаковых, где они находятся, каков шаг поиска, общая ширина интервала... К примеру, если на первом же шаге k=(a+b)/2 выясняется, что a[k] - искомое значение, то какое дело до того, есть ли еще такие элементы?

0

Всё понятно. Спасибо.

Дан 1 ответ
0 голосов
Правильный ответ

Если часть программы, в которой выполняется поиск, оформить в виде процедуры, то получится вот так:
const n=20;
type arr=array[1..n] of integer;
var a:arr;
i,x:integer;

procedure f(a:arr; x:integer);
var i,i1,i2:integer;
begin
i1:=1; i2:=n;
repeat
i:=(i1+i2) div 2;
if a[i]if a[i]>x then i2:=(i1+i2) div 2-1;
until (a[i]=x)or(i1>i2);
if a[i]=x then 
 begin
 writeln('Искомый(ые) номер(а) элемента(ов):');
 while (i>0)and(a[i]=x) do i:=i-1;
 i:=i+1;
 while (i<=n)and(a[i]=x) do begin write(i,' '); i:=i+1; end;<br> end
 else writeln('Элемент не найден');
writeln;
end;

begin
Randomize;
a[1]:=random(10);
write(a[1],' ');
for i:=2 to n do
 begin
 a[i]:=a[i-1]+random(10);
 write(a[i],' ');
 end;
writeln;
write('x = '); readln(x);
f(a,x);
end.

Пример:
9 9 15 21 30 33 35 35 36 44 45 45 52 54 62 63 70 70 77 78 
x = 35
Искомый(ые) номер(а) элемента(ов):
7 8 

(194k баллов)