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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2018, 04:45   #1
Tynya
Пользователь
 
Регистрация: 06.12.2017
Сообщений: 13
По умолчанию Бинарный поиск

Страшшшно туплю и, в принципе, даже не въезжаю.
Бинарный поиск. БД. Делфи.
Может, кто поможет?
Мои жалкие попытки (не кидайтесь камнями):
Код:
 type
 TInfo=record
 name:string[50];
 data:string[35];
 genre:string[20];
 rating:integer;
 dlc:string[4];
 engine:string[15];
 end;         
var i,z,l,r,c,x:Integer; rec:array[1..300] of TInfo;
begin
  Form5.Show;
for i:=0 to strngrd1.rowcount do
 begin
 if cbb1_search.ItemIndex=0 then
  begin
  l:=0; r:=strngrd1.rowcount-1;
  while l>=r do
  begin
   c:=(l+r) div 2;
  if edt1_search.Text=strngrd1.Cells[0,c] then
   begin
    z:=1;
    x:=c;
    Form5.strngrd1.Cells[0,i]:=strngrd1.cells[0,c];
    //form5.strngrd1.RowCount:=form5.strngrd1.RowCount+1;
    r:=l-1;
   end;
  if edt1_search.Text<strngrd1.Cells[0,c] then
   r:=c-1;
  if edt1_search.Text>strngrd1.Cells[0,c] then
   l:=c+1;
  end;
  end;
  end;
  end;

Последний раз редактировалось Tynya; 18.06.2018 в 05:04.
Tynya вне форума Ответить с цитированием
Старый 18.06.2018, 11:11   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
type
 TInfo=record
   name:string[50];
   data:string[35];
   genre:string[20];
   rating:integer;
   dlc:string[4];
   engine:string[15];
 end;         
 
var
  i,z,left,right,c,x:Integer; 
  rec:array[1..300] of TInfo;
begin
  Form5.Show;
//  for i:=0 to strngrd1.rowcount -1 do begin ??? зачем что-то перебирать если мы не знаем что хотим сделать
    if cbb1_search.ItemIndex=0 then begin //?? если это тот поиск ???
      left:=0; right:=strngrd1.rowcount-1;//НАЧАЛЬНЫЕ границы
      x:=-1; //мы пока НИЧЕГО не нашли
// а вот теперь да, мы будем повторять пока границы не сойдутся {left=rifht}, или даже пересекутся {left>right}
// стало быть если мы хотим ОСТАНОВИТЬСЯ при (left>=right)
      while left < right do begin  // то повторять мы должны пока (left<right)
        c:=(left+right) div 2;
        if edt1_search.Text=strngrd1.Cells[0,c] then begin// мы нашли !!! 
          left:=c; right:=c;//чтобы остановиться сведем границы до минимума(до найденного элемента)
          // ну и прочее что хотим, хотя ОБЫЧНО это удобнее и логичнее сделать после цикла поиска
          x:=c; // НАШЛИ и запомнили что ГДЕ именно.
//          z:=1;
//          Form5.strngrd1.Cells[0,i]:=strngrd1.cells[0,c];
//          //form5.strngrd1.RowCount:=form5.strngrd1.RowCount+1;
//          right:=left-1;
        end
        {;}else // нам же не надо повторять если мы проверили(сравнили) и при этом успешно(они оказались равны)
        if edt1_search.Text<strngrd1.Cells[0,c] then 
          right:=c-1 //она может и ВЫСКОЧИТЬ за left
        {;}else // и опять повторять при предыдущем успехе ?..
        if edt1_search.Text>strngrd1.Cells[0,c] then
          left:=c+1; //аналогично за right
      end;
      
      if x>=0 then begin 
      // ну вот поиск закончили и знаем что мы что-то нашли
      ...
      end
     else //А ЕСЛИ мы не нашли ТОЧНОГО совпадения, то мы хотя бы ДОЛЖНЫ узнать 
//-- где у нас <ed1_search.Text 
//-- и где прочие (т.е. >edt1_search.Text
    end;
//  end;
end;
left, right у ВАС это l, r (просто читаемость человеком лучше, ну а компьютеру это БЕЗ разницы).

ЕСТЬ и несколько других замечаний.
0.для начинающего очень неплохо.

1. Сравнение чисел в программе ОТЛИЧАЕТСЯ от сравнения строк.
22 > 3 (это сравнение ЧИСЕЛ)
'22' < '3' (это сравнение СТРОК)
а практически во всех визуальных (как минимум там где фигурирует Text, Caption) используются СТРОКИ.
чтобы сравнить записанные в них числа, их надобно превратить в числа
StrToint(edt_1.Text) < StrToint(strngrd1.Cells[0,c])
не стал вставлять чтобы код не сильно отличался.

2.в классическом варианте поиске совпадение НЕ выделяется в отдельный вариант проверок.
а делается РОВНО одна проверка и соответственно двигается ВСЕГДА ровно одна граница
Код:
if edt1_search.Text <= strngrd1.Cells[0,c] then begin
  right:=c //элемент может и совпасть потому мы ВКЛЮЧАЕМ эту границу
else 
  left:=c+1; // здесь совпадения не будет границу можно и исключить
3. для "экономии" работы компьютера частенько делают
Код:
r:=Strtoint(edt_1.Text); // ДО начала работ цикла
...
и потом (внутри цикла)
...
if r <=StrToint(srngrd1.Cells[0,c]) then
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.06.2018 в 11:16.
evg_m вне форума Ответить с цитированием
Старый 25.06.2018, 22:36   #3
Tynya
Пользователь
 
Регистрация: 06.12.2017
Сообщений: 13
По умолчанию

Спасибо! Уже все работает.
Tynya вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный поиск Praud Помощь студентам 20 20.12.2014 21:22
Помощь в доработке программы на языке паскаль (бинарный поиск, поиск перебором) DimzNOVIchok45 Помощь студентам 0 13.10.2014 20:11
Реализовать два метода поиска строк в массиве: поиск перебором, бинарный поиск на языке Pascal DimzNOVIchok45 Помощь студентам 7 19.09.2014 21:40
Бинарный поиск C++ vladislav23 Помощь студентам 7 01.06.2013 01:06
Бинарный поиск ds.Dante Свободное общение 0 25.11.2011 11:51