Помощь - Поиск - Пользователи - Календарь
Полная версия: двоичный поиск
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
maksimla
Задание
Предположим, имеем первичных цифр массив. Напишите функцию, реализующую алгоритм двоичного поиска в таком массиве. Результаты функции - элемент массива, который равен функции аргументу, номер или 0.


я так непонел результаты какие надо вывести пример можете написать
Ozzя
Задание коряво написано.
Я понял так, что нужно вывести элемент массива и его номер в случае успеха поиска и 0, если поиск потерпел неудачу (нет такого элемента в массиве).
maksimla
чтото неищит у меня цыфров
Код
program Bevarde2;
const count =10;
m:array [1..count] of byte=(10,9,8,7,6,5,4,3,2,1);
var n,i,first,last:integer;
a,low, high, mid:integer;
    found:boolean;
begin
  WriteLn('massiv uporedocennij');
  for i:= 1 to count do write(m[i]:3,' '); writeln; writeln;
  write('vvedite cislo kotoroe icete');
  readln(a);
         low:=1; high:=count;
       found:=false;        
       while (low<=high) and (not found) do
       begin
         i:=(low+high) div 2;
         if a<m[i] then high:=i-1
         else if a>m[i] then low:=i+1
         else found:=true;  
       end;
       if found then writeln('naiden')
       else writeln('nenaiden');  
    

  Readln;
end.


Добавлено через 2 мин.
вот эту нашол но чегото у меня неищит

Код
function BSearch (item: DataArray; count:integer;
                             key:DataItem):integer;
     var
       low, high, mid: integer;
       found:boolean;
     begin
       low:=1; high:=count;
       found:=false;         { не найден }
       while (low<=high) and (not found) do
       begin
         mid:=(low+high) div 2;
         if key<item[mid] then high:=mid-1
         else if key>item[mid] then low:=mid+1
         else found:=true;  { найден }
       end;
       if found then BSearch:=mid
       else BSearch:=0;  { не найден }
     end; { конец поиска }
Lapp
Цитата(maksimla @ 5.12.2008 20:32) *
вот эту нашол но чегото у меня неищит
Когда же ты научишься точнее формулировать проблему? Это же в первую очередь тебе самому лучше..

Приведи ВСЮ программу и опиши, что именно работает неправильно.
"Не ищет" можно понимать тысячью разных способов. В том числе, и что ты ее не запускал, например..
maksimla
вот массив есть в программе у меня я ввожу в поиск цифру которая есть в массиве а выводит что нету ее в массиве
Lapp
Цитата(maksimla @ 5.12.2008 21:11) *
вот массив есть в программе у меня я ввожу в поиск цифру которая есть в массиве а выводит что нету ее в массиве
Еще раз прошу: приведи полный текст программы.
maksimla
перегрелся я уже вот программка все работает сечас надо както поиск в функцию перевести
 program Bevarde2;
const count =10;
m:array [1..count] of byte=(10,9,8,7,6,5,4,3,2,1);
var n,i,first,last,a:integer;
found:boolean;
begin
WriteLn('massiv uporedocennij');
for i:= 1 to count do write(m[i]:3,' '); writeln; writeln;
write('vvedite cislo kotoroe icete');
readln(n);
first:=1;
last:= count;
found:= false;
repeat
i:=(first +last) div 2;
writeln(i);
if m[i] = n then found:=true
else
begin
if m[i]>n then first :=i+1
else last:=i-1
end;
until (found= true) or (first>last);
if found then writeln ('iskomii',n,'v massive',i)
else
writeln('netu cisla ',n,'v massive');
Readln;
end.

непонел этого как это в незу что выводить надо
Результаты функции - элемент массива, который равен функции аргументу, номер или 0.
Lapp
Цитата(maksimla @ 5.12.2008 21:26) *
перегрелся я уже вот программка все работает сечас надо както поиск в функцию перевести
Явно перегрелся smile.gif. У тебя уже была функция (см. выше) чем она тебе не понравилась? Ну, надо - переводи..

Цитата(maksimla @ 5.12.2008 21:26) *
непонел этого как это в незу что выводить надо
Результаты функции - элемент массива, который равен функции аргументу, номер или 0.
Тебе же Ozzя сказал: функция должна давать номер найденного элемента. Кстати, в той функции все было правильно..
maksimla
а теперь процедуру сказали сделать я сделал но одна ошибка есть. Ошибку не нашел но добавил единицу и все в порядке можете сказать что не так я сделал?

это двоичный поиск

program rasti;
const max=100;
type masyv=array [1..max] of integer;
var x:masyv;
a,n,i:integer;
c:text;
procedure poisk(m:masyv; max,j:integer);
var tr:boolean; i1,i2:integer;
begin
tr:=false;
i1:=1; i2:=max+1;
while (i1<i2) and (not tr) do
begin i:=(i1+i2)div 2;
if x[i]=a then tr:=true
else if x[i]<a then i1:=i+1
else i2:=i;
end;
if not tr then
writeln('v masyve x cisla ',a,' netu')
else
writeln('Skaiciui ',a,' lygus ',i,' masyvo narys');
end;

begin
assign(c,'test.txt');
Reset©;
Readln(c,n);
for i:=1 to n do
begin
read(c,x[i]);
writeln(i:4,' ',x[i]);
end;
write('vvedite iskomoe cislo ');
readln(a);
poisk(x,n,a);
readln
end.


числа записаны в файл в возвращающем порядке и если в поиск вводишь самое последнее число то оно не находится при в процедуре i2:=max а если плюс один то все в порядке странно можете объяснить что не так я сделал.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.