Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти слово в строке 
V
    Опции темы
GELEAF
Дата 12.1.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.3.2006

Репутация: нет
Всего: нет



Я попытался сделать свой алгоритм поиска текста он у меня неполучилось,вернее получилось но неправильно.Короче он находит но буквы.Короче вот смотрите:
Код

function TForm1.findText(oldtext, findtext: string): boolean;
Var slovo:string;
i,ii:integer;
begin
for ii:=1 to length(findtext) do
for i:=ii to length(oldtext) do begin
if oldtext[i]=findtext[ii] then
begin
slovo:=slovo+oldtext[i];
Break;
end
end;
if findtext=slovo then Result:=True else result:=false;
end;


Подскажите ошибку,или посоветуйте другой алгоритм
PM MAIL ICQ   Вверх
Snowy
Дата 12.1.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А не проще использовать стандартный Pos?
PM MAIL   Вверх
aktuba
Дата 12.1.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



GELEAF, что-то я не пойму, что ты делаешь...
Чем не устраивет Pos(oldtext, findtext)? А если хочешь заменять (мне так кажется) - используй StringReplace.

Ну, а если все-же хочется свое:

Код

function TForm1.findText(oldtext, findtext: string): boolean;
var
  Idx, len: Integer;
begin
  Result := False;
  Idx := 1;
  len := Length(findtext);
  while Idx <= Length(oldtext) do
    if Copy(oldtext, Idx, len) = findtext then
      begin
        Result := True;
        Break
      end;
end;


P.S.: пока писал - уже ответили  smile 

Это сообщение отредактировал(а) aktuba - 12.1.2007, 20:50


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Beltar
Дата 12.1.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Ну я как-то извращался. Фрагмент юнита.

Код

unit Common;

interface

uses Windows, SysUtils, DateUtils, IniFiles, Controls, Forms,
  Dialogs, Registry, StdCtrls, Grids, ShellAPI, SHFolder, ComCtrls;


type

TChars=set of Char;

var

  Letters:TChars=['A'..'Z','a'..'z'];
  Digits:TChars=['0'..'9'];

function SimpleTextSearch(P,Text:String;MatchCase,FullWord,Fwd:Boolean;
  Start:Integer):Integer;
{-1 ничего не найдено, иначе номер начала вхождения}
function IsLetterOrDigit(C:Char):Boolean;
function IsDividor(C:Char):Boolean;
function SearchNode(Items:TTreeNodes;P:String;MatchCase,FullWord,Fwd:Boolean;
  Start:Integer):Integer;

implementation




function IsLetterOrDigit(C:Char):Boolean;
begin
case byte(C) of
  48..57:Result:=true;
  65..90:Result:=true;
  97..122:Result:=true;
  184:Result:=true;
  192..255:Result:=true
  else Result:=false;
end
end;

function IsDividor(C:Char):Boolean;
begin
case Byte(C) of
  0..32:Result:=true;
  42..47:Result:=true;
  58..63:Result:=true;
  182:Result:=true
  else Result:=false;
end
end;

function SimpleTextSearch(P,Text:String;MatchCase,FullWord,Fwd:Boolean;
  Start:Integer):Integer;
var pos,i,l,Last:Integer;

function CheckFullWord:Boolean;
begin
Result:=false;
if Pos-1<>0 then
  if not IsDividor(Text[Pos-1]) then exit;
if Pos+l<=Length(Text) then
  if not isDividor(Text[Pos+l]) then exit;
Result:=true;
end;

function CheckCase:Boolean;
var s:String;
begin
s:=copy(Text,Pos,l);
if s<>P then Result:=false
        else Result:=true;
end;

begin

l:=Length(P);
if ((length(Text)=0) or (l=0)) then
  begin
  Result:=-1;
  exit;
  end;
if Fwd then
  begin
  Last:=Length(Text)-l+1;
  for Pos:=Start to Last do
    begin
    i:=0;
    while ANSICompareText(P[i+1],Text[Pos+i])=0 do
      begin
      inc(i);
      if i=l then
        begin
        //Проверка на слово целиком
        if FullWord then
          if not CheckFullWord then break;
        //Проверка на соответствие регистру
        if MatchCase then
          if not CheckCase then break;
        Result:=Pos;
        exit;
        end
      end
    end;
  end//endfor
       else
  begin
  for Pos:=Start-l+1 downto 1 do
    begin
    i:=0;
    while ANSICompareText(P[l-i],Text[Pos-i])=0 do
      begin
      inc(i);
      //inc(count);
      if i=l then
        begin
        //Проверка на слово целиком
        if FullWord then
          if not CheckFullWord then break;
        //Проверка на соответствие регистру
        if MatchCase then
          if not CheckCase then break;
        Result:=Pos-l+1;
        exit;
        end
      end;
    end;
  end;
Result:=-1;
end;

end.


Кстати, Fwd можно сделать целочисленным и давать ему 1 и -1, а вместо двух for использовать один while прибавляя к счетчику в каждой итерации Fwd. Странно, что я тогда не додумался.

Это сообщение отредактировал(а) Beltar - 12.1.2007, 21:57


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
GELEAF
Дата 12.1.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 11.3.2006

Репутация: нет
Всего: нет



Всем спасибо.вы мне очень помогли.
Тему можно закрыть
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.