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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2009, 20:20   #1
MetR
Пользователь
 
Регистрация: 26.12.2008
Сообщений: 50
По умолчанию бинарный поиск(паскаль)

Код:
program poisk;
{$APPTYPE CONSOLE}
uses crt;
const n=100;
type mas=array[1..n] of string;
var
slova:text;
A:mas;
i,j,h,z:integer;
s,sp:string;
b:boolean;
 
procedure sort(nword:integer; var word:mas); {лексикографическое }
var
isort,jsort:integer;
e:string;
begin
For isort:=1 to nword-1 do                       { упорядочение }
    For jsort:=isort+1 to nword do
      If word[isort]>word[jsort] then
        begin
           e:=word[isort]; word[isort]:=word[jsort]; word[jsort]:=e; { слов }
        end;
end;
 
procedure vivod(nB:integer; var P:mas);  { процедура }
var k,l,iv:integer;
begin
  k:=0; l:=1;
  for iv:=1 to nB do begin                  { вывода }
  k:=length(P[iv])+k+4;
  if k/69 > l then begin writeln; inc(l);end;
  write(iv,') ',P[iv],' '); end;
writeln;                                  { массива }
end;
 
procedure massiv( sm:string; var C:mas; var count:integer);   { процедура }
var im:integer;
begin
count:=1;                                       { заполняет }
 im:=1; while (im<=length(sm)) do begin
   if sm[im]=' ' then begin inc(count); inc(im); end;  { массив }
   C[count]:=C[count]+sm[im];
   inc(im);                                      { словами }
 end;
end;                                              { из файла }
 
 
begin
clrscr;
assign(slova,'massiv.txt');
for i:=1 to n do A[i]:='';
s:='';
reset(slova);
read(slova,s);
close(slova);
massiv(s,A,j);
sort(j,A);
vivod(J,A);
 
h:=1;
b:=False;
z:=j;
writeln('vedite slovo dla poiska: '); readln(sp);
while (h<=z)and not b do
begin
  i:=z+(h-z) div 2;
  if A[i]=sp then begin  b:=True; writeln('slovo naideno pod nomerom ',i) end
  else
    if sp<A[i] then h:=i-1 else z:=i+1;
end;
 
if b=false then writeln('zadanogo slova net v massive');
 
end.
сначала все работает нормально, выводит и сортирует массив, но после ввода слова для поиска почему то нечего не происходит... где тут может быть ошибка?
MetR вне форума Ответить с цитированием
Старый 14.12.2009, 09:20   #2
Nowar
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 23
По умолчанию

Дали бы хоть условие задачи. А то какой-то код с пометкой "не работает" :-) Может, вам его в Quake работающий нужно превратить...
Nowar вне форума Ответить с цитированием
Старый 14.12.2009, 09:39   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
MetR
помоему у тебя подход неверный... не проще просто в цикле пройтись? все равно отсортированно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 10:46   #4
MetR
Пользователь
 
Регистрация: 26.12.2008
Сообщений: 50
По умолчанию

имеется таблица слов, затем поступает слово, узнать есть ли это слово в таблице(бинарным поиском)
MetR вне форума Ответить с цитированием
Старый 14.12.2009, 11:06   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Попробуй так:
Код:
i:=z div 2;
b:=true;
while (i<>1) and b do
begin
  if A[i]=sp then begin
    writeln('slovo naideno pod nomerom ',i);break;
  end  else begin
    if sp<A[i] then begin
      i:=i-abs(z-i) div 2;
      if abs(z-i)=1 then begin  b:=false; end
    end else begin
      if abs(z-i)=1 then begin  b:=false; end;
      i:=i+abs(z-i) div 2
     end;
   end;
end;

if b=false then writeln('zadanogo slova net v massive');
 readln;
end.
Единственное что крайние слова не учитываются, но это ты уж сам поправь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2009, 11:43   #6
MetR
Пользователь
 
Регистрация: 26.12.2008
Сообщений: 50
По умолчанию

так программа вообще странно работает... у меня в масиве 10 слов, слова 3 по 9 находит, при вводе 10 слова пишет что заданного слова нет в массиве, при вводе любого другого слова курсор просто переносится на следующую строчку... %)
MetR вне форума Ответить с цитированием
Старый 14.12.2009, 15:46   #7
MetR
Пользователь
 
Регистрация: 26.12.2008
Сообщений: 50
По умолчанию

Код:
h:=1;
b:=False;
z:=j;
write('vedite slovo dla poiska: '); readln(sp);
while (h<=z)and not b do
begin
  i:=h+(z-h) div 2;
  if A[i]=sp then begin  b:=True; writeln('slovo naideno pod nomerom ',i) end
  else
    if sp<A[i] then z:=i-1 else h:=i+1;
end;

if b=false then writeln('zadanogo slova net v massive');
все, я понял в чем ошибка была, надо было весго лишь h и z местами поменять)))
MetR вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный файл Bayazet Общие вопросы Delphi 1 04.03.2009 16:39
Нужен совет(бинарный поиск в 2-d массиве) sergey31 Помощь студентам 2 27.04.2008 13:49
Бинарный поиск в 1мерном массиве, ошибка в программе из книги ILDAR@GIZmo Помощь студентам 4 02.12.2007 22:22
Бинарный поиск Gendalf Помощь студентам 1 07.07.2007 22:09