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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 21:23   #1
Stranger333
Пользователь
 
Аватар для Stranger333
 
Регистрация: 19.05.2009
Сообщений: 98
По умолчанию Бинарный поиск в Memo

У меня бинарной поиск работает хорошо если наперед известно количество слов в Мемо. Но я хочу загружать текст в Мемо, тоесть наперед не известно количество слов. Я для массива слов использую SetLength... Только когда я использую эту процедуру у меня не идет сортировка или сам же поиск. Вот код посмотрите, где же я ошибся

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function cutter(s:string;p1:integer;p2:integer):string;
var r:string;
i:integer;
begin
r:='';
if ((p1=p2)OR(p1<p2)) then result:= r; 
 for i:= p1 to p2 do
     r:=r+s[i];   
 result:= r;
end;

procedure Analiz(s:string);
var k,i,j,q,sl:integer;  a:array[1..6] of string;
w,s1,x:string;
fl:boolean;
label Kilkist;
begin
k:=1;
i:=1;
j:=1;
sl:=1;
while i<=length(s) do
  begin
  if s[i] in ['.',',',' ','!','?',#10,#13] then
    begin
    w:=cutter(s,k,i-1);  
    SetLength(a,sl+j);
    a[j]:=w;
    j:=j+1;
    repeat   
      k:=i+1;
      i:=i+1;
    until not (s[k] in ['.',',',' ','!','?',#10,#13] );
    end;
    i:=i+1;
   end;
   SetLength(a,sl);
   q:=0;
Kilkist:   for i:=1 to 5{Length(a)-1} do
 for k:=i downto 1 do
    if a[k]>a[k+1] then
        begin
             x:=a[k];
             a[k]:=a[k+1];
             a[k+1]:=x;
        end;
    x:=Form1.Edit1.Text;
 i := 0;  { индекс перед первым элементом массива }
  j :=Length(a)+ 1;  { индекс после последнего элемента массива }

  while i < j - 1 do begin
    { ищем элемент на интервале индексов от i до j, не включая i и j }
    k := (i + j) div 2;  { k = элемент посередине интервала }
    if x >= a[k] then
      i := k
    else
      j := k;
  end;
  if (i > 0) and (a[i] = x) then begin
    { элемент найден }
    q:=q+1;
    a[i]:=' ';
    goto Kilkist;

  end;


  if q>0 then begin
       with Form1.Memo2.Lines do
    begin
      Add(x + ' втречается ' + IntToStr(q) + 'раз');
    end;
    end
    else
       with Form1.Memo2.Lines do
    begin
      Add('Ничего не найдено');
    end;

end;



procedure TForm1.Button1Click(Sender: TObject);
var i,k1,k2,max:integer;
begin
  Memo2.Lines.Clear;
  with Memo1 do
  begin
    k1 := Length(Lines[0]);
    for i:=0 to Lines.Count-1 do
    begin
      k2 := Length(Lines[i]);
      if k1>k2 then max:=k1 else
      begin
        max:=k2;
        k1:=k2;
      end;
    end;
    for i:=1 to max-1 do
    Lines.Text := StringReplace(Lines.Text,'  ',' ',[rfReplaceAll]);
    Lines.Text := StringReplace(Lines.Text,#10+' ','',[rfReplaceAll]);
  end;
  Analiz(Memo1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

end.
Stranger333 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный поиск 0IceCube0 Паскаль, Turbo Pascal, PascalABC.NET 1 13.04.2010 15:52
Бинарный поиск (Паскаль) Zhanna5006 Помощь студентам 3 07.01.2010 09:52
бинарный поиск(паскаль) MetR Помощь студентам 6 14.12.2009 15:46
Бинарный поиск Gendalf Помощь студентам 1 07.07.2007 22:09