Помощь - Поиск - Пользователи - Календарь
Полная версия: двоичный поиск
Форум «Всё о Паскале» > 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(c);
  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 а если плюс один то все в порядке странно можете объяснить что не так я сделал.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.