Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2007, 12:20   #1
ILDAR@GIZmo
 
Регистрация: 02.12.2007
Сообщений: 3
По умолчанию Бинарный поиск в 1мерном массиве, ошибка в программе из книги

Люди помогите, требуется составить программулину ищет элемент в массиве при помощи бинарного поиска.
Нашел такую в книжке - но она почемута не работает ((
Помогите понять где тут ошибка))
p/s/ прога просил ввести искомый элемент Q и 10 элементов массива
и в зависимости от того какую цифру вводишь, по разному выдаёт результат...

Код:
program bin;
const m=10;
var i,a,b,q:integer;
p:array[1..m] of integer;
begin
write('vvod Q ');
readln(q);
for i:=1 to M do
begin
write('vvod ',i,' elementa massiva ');readln(p[i])
end;
a:=0;
b:=m;
i:=(a+b)div 2;    {opredelenie seredini intervala}
{cikl do vstreci p[i]=q ili do nylevogo intervala a=i}
while (p[i]<>q) and (a<i) do
begin
if q>p[i] then a:=i else b:=i;
i:=(a+B)div 2;   {ceredina nowogo intervala}
if a=i then writeln('v massive net znacenia ',q)
else writeln('nomer ',i,' znacenie ',q)
end;
end.
ILDAR@GIZmo вне форума Ответить с цитированием
Старый 02.12.2007, 14:08   #2
kommunist
C# developer
Форумчанин
 
Аватар для kommunist
 
Регистрация: 03.10.2007
Сообщений: 393
Восклицание бинарный поиск!!!

Код:
program massiv;
uses crt;
const
  n=10;
var
  a:array[1..n] of integer;
  q:integer;   { образец поиска}
  verh:integer; { верхняя граница }
  niz: integer; { нижняя граница }
  sred:integer;   {средний элемент }
  found:boolean; { TRUE — есть ли в массиве число}
  i:integer;
begin
 writeln('введите число q');
 readln(q);
 for i:= 1 to n do
begin
  a[i]:=random(10);
  write(a[i],' ' );
  end;
  for i:= 1 to n do
begin
 verh:=1; 
 niz:=n;
 repeat
 sred:=Trunc ( (niz-verh) /2)+verh;

 if a[sred] = q then found:=TRUE else
 if q < a[sred]
 then niz:=sred-1 else verh:=sred+1; 
until (verh > niz) or found;
 if found
 then
 writeln('совпадает с элементом под номером',sred)
 else writeln('такого элемента в массиве нет');
 readln;
end;
end.
I like WPF
kommunist вне форума Ответить с цитированием
Старый 02.12.2007, 14:24   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Извините, не то написал.

Последний раз редактировалось puporev; 02.12.2007 в 14:28.
puporev вне форума Ответить с цитированием
Старый 02.12.2007, 15:51   #4
ILDAR@GIZmo
 
Регистрация: 02.12.2007
Сообщений: 3
Смех

И так для покалений:
Нахождение номера элемента массива при помощи бинарного поиска.
Алгоритм заточен под отсортированный массив по убыванию.

Код:
program massiv;
uses crt;
const
  n=10;
var
  a:array[1..n] of integer;
  Q:integer;   { образец поиска}
  verh:integer; { верхняя граница }
  niz: integer; { нижняя граница }
  sred:integer;   {средний элемент }
  found:boolean; { TRUE ? есть ли в массиве число}
  i:integer;
begin
 writeln('введите число dla poiska Q');
 readln(Q);
{Zapolnaem massiv}
for i:= 1 to n do
begin
  write('Vvedite ',i,' element massiva');
  readln(a[i]);
  end;

{Chitaem}
begin
 niz:=1;
 verh:=n;
repeat
 sred:=((niz+verh) div 2)+1;

 if a[sred] = q then found:=TRUE
    else if q < a[sred] then niz:=sred-1
         else verh:=sred+1;

until (verh < niz) or found=true;
 if found
 then
 writeln('совпадает с элементом под номером',sred)
 else writeln('такого элемента в массиве нет');
 readln;
end;
end.
p/s/ Огромное спасибо за помошь kommunist'у. Без него я б еще очень долго мучал компилятор бессмысленными экспериментами..)))

Последний раз редактировалось ILDAR@GIZmo; 02.12.2007 в 15:53.
ILDAR@GIZmo вне форума Ответить с цитированием
Старый 02.12.2007, 22:22   #5
ILDAR@GIZmo
 
Регистрация: 02.12.2007
Сообщений: 3
По умолчанию

Код:
program pr1;
uses crt;

var
    i,j:integer;
begin
     clrscr;         {очистка экрана}
     randomize;
     assign(output,'d:\marix.dat');  {имя файла для записи значеий}
     rewrite(output);
     for i:=1 to 12 do
         begin
         for j:=1 to 8 do
             begin
             write(random(50));  
             write(' ');
             end;
         writeln('');
     end;
     readln;
     close(output);
end.

Последний раз редактировалось ILDAR@GIZmo; 02.12.2007 в 23:52.
ILDAR@GIZmo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе на рекурсию vitekbest Помощь студентам 13 14.06.2008 20:54
Нужен совет(бинарный поиск в 2-d массиве) sergey31 Помощь студентам 2 27.04.2008 13:49
Ошибка в программе. Массивы RECREATOR Общие вопросы Delphi 5 21.12.2007 12:13
Ошибка в программе RoadTrain Общие вопросы Delphi 5 24.10.2007 22:16
Бинарный поиск Gendalf Помощь студентам 1 07.07.2007 22:09