Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 16.06.2012, 13:14   #1
Ксения Юрьевна
 
Аватар для Ксения Юрьевна
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию Метод бинарного поиска

Здравствуйте,Нужна помощь в написание программы Бинарного поиска в массиве Помогите пожалуйста
Ксения Юрьевна вне форума Ответить с цитированием
Старый 16.06.2012, 13:29   #2
Niro
Форумчанин
 
Аватар для Niro
 
Регистрация: 23.09.2010
Сообщений: 682
По умолчанию

Вот держите, взял из одной своей прожки, ищется первое вхождение нужного элемента.
Массив называется mas, нумерация от 0 до n-1.
Результат заностится в переменную average, вернее туда заносится индекс элемента массива,
Ну дальше думаю сами сообразите
Код:
procedure TForm1.Start_findClick(Sender: TObject);
var
    first, last, average: word;
    word: string;
    flag, found: boolean;
begin
    word:= enter_word.Text;
    flag:= false;
    first:= 0;
    last:= n - 1;

    while flag <> true do
      begin
        average:= trunc ( (last - first)*0.5 + first);

        if last - first = 0 then
          begin
            flag:= true;
            if word = mas [average]
              then found:= true;
          end;

        if word > mas[average] then first:= average + 1;
        if word <= mas [average] then last:= average;
      end;

  if found = true then edit2.Text:= inttostr (average)
                    else edit2.Text:= 'Not found';
end;
Проще всего признать свою ошибку.
Гораздо труднее еЁ осознать и исправить.

Последний раз редактировалось Niro; 16.06.2012 в 13:34.
Niro вне форума Ответить с цитированием
Старый 16.06.2012, 13:36   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Ыть: http://ru.wikipedia.org/wiki/%D0%91%...B8%D1%81%D0%BA
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2012, 13:38   #4
Ксения Юрьевна
 
Аватар для Ксения Юрьевна
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

спасибо,попробую разобраться)
Ксения Юрьевна вне форума Ответить с цитированием
Старый 16.06.2012, 14:26   #5
Ксения Юрьевна
 
Аватар для Ксения Юрьевна
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

Вот что-то накидала с помощью интернета Но при запуске вылетает вот такая ошибка. (project1.exe raised exception class EConvertError with message ""is not a valid integer value')
Вот код
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,StdCtrls, Grids;

type
  TForm1 = class(TForm)
    strngrd1: TStringGrid;
    edt1: TEdit;
    btn1: TButton;
    chk1: TCheckBox;
    lbl1: TLabel;
    lbl2: TLabel;
    lbl3: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure StrnGrd1KeyPress(Sender: TObject; var Key: Char);

procedure Edt1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 {бинарный поиск в массиве}
procedure TForm1.btn1Click(Sender: TObject);
const
SIZE=10;
 var

a:array[1..SIZE] of integer;


obr:integer;

verh:integer; { ??????? ??????? ?????? } 

niz: integer; { ?????? ??????? ?????? } 

sred:integer;

found:boolean; { TRUE — ?????????? ??????? ? ????????? ??????? } 

n:integer;

i:integer;

begin
//ввод массива


for i:=1 to SIZE do

a[i]:=StrToInt(StrnGrd1.Cells[i-1,0] ) ;

obr:= StrToInt(Edt1.text);

// ????? verh:=1;

niz:=SIZE; n:=0;

found:=FALSE; lbl3.caption:='';

if Chk1.State = cbChecked

then lbl3.caption:='verh'+#9+'niz'#9'sred'#13;

  repeat

sred:=Trunc ( (niz-verh) /2)+verh; if Chk1.Checked

then Lbl3.caption:=lbl3.caption +IntToStr(verh) + #9

+IntToStr(niz) + #9 +IntToStr(sred) + #13; n:=n+1;

if a[sred] = obr then found:=TRUE else

if obr < a[sred]

then niz:=sred-1 else verh:=sred+1;

 until (verh > niz) or found;

if found

then lbl3.caption:=lbl3.caption

+'Совпадение с элементом номер '

+ IntToStr(sred)+#13 + 'Сравнений '

+ IntToStr(n)

else lbl3.caption:=lbl3.caption

+'Образец в массиве не найден.1';

end;

// ??????? ??????? ? ?????? StringGrid 

procedure TForm1.StrnGrd1KeyPress(Sender: TObject; var Key: Char);

begin

if Key = #13 then // ?????? ??????? <Enter> 

if StrnGrd1.Col < StrnGrd1.ColCount - 1

then // ?????? ? ????????? ?????? ???????

StrnGrd1.Col := StrnGrd1.Col +1

else // ?????? ? ???? Editl, ? ???? ????? ???????

Edt1.SetFocus;

end;

// ??????? ??????? ? ???? Editl

procedure TForm1.Edt1KeyPress(Sender: TObject; var Key: Char);

begin

if Key = #13 // ?????? ??????? <Enter> 

then // ??????? ???????? ????????? ?????? 

Btn1.SetFocus;

end;

end.
Что я не так сделала?

Последний раз редактировалось Stilet; 16.06.2012 в 15:11.
Ксения Юрьевна вне форума Ответить с цитированием
Старый 16.06.2012, 15:12   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

На какой строке?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2012, 15:19   #7
Ксения Юрьевна
 
Аватар для Ксения Юрьевна
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

Ну она уже запускается,а когда вводишь что-либо в edt1 и нажимаешь на кнопку вылетает вот такая ошибка
Ксения Юрьевна вне форума Ответить с цитированием
Старый 16.06.2012, 15:21   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

StrToInt замени на StrToIntDEF(что там у тебя, 0) тогда если не удастся преобразовывать строки в числа выдаст 0
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.06.2012, 15:25   #9
Ксения Юрьевна
 
Аватар для Ксения Юрьевна
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

это в a[i]:=StrToInt(StrnGrd1.Cells[i-1,0] ) ; заменять?
заменили,пишет [Error] Unit2.pas(63): Not enough actual parameters
Вот сейчас ещё одну увидела [Warning] Unit2.pas(79): Variable 'verh' might not have been initialized

Последний раз редактировалось Ксения Юрьевна; 16.06.2012 в 15:28.
Ксения Юрьевна вне форума Ответить с цитированием
Старый 16.06.2012, 16:02   #10
Ксения Юрьевна
 
Аватар для Ксения Юрьевна
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

во всём разобралась) Аж самой стыдно за такие ошибки^^всем спасибо
Ксения Юрьевна вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс Бинарного дерева поиска Godfather07 Помощь студентам 1 15.06.2012 12:29
Дерево бинарного поиска vika911 Помощь студентам 3 17.03.2012 19:57
Распечатка бинарного дерева поиска xMURNx Помощь студентам 0 05.04.2011 21:59
Алгоритмы линейного и бинарного поиска. Seafulf Паскаль, Turbo Pascal, PascalABC.NET 4 01.03.2008 21:39


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS