Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как создать алгоритм возвращения поряд. номера слова в строке. [D7, WinXP]


Страницы:   1 2

Dr. Andrew ©   (2006-05-10 15:23:00) 

Мастера, пожалуйста, подскажите алгоритм возвращения порядкового номера слова в строке (для меня желательно в WideString). Как можно создать такой алгоритм, например, function GetNumWord(WStr : WideString; Word : Widestring) : Integer, где WStr - строка в которой находится слово Word. И как быть, если это слово в одной и той же форме может повторяться в строке? Нужен последовательный порядковый номер слова в строке, например - "эта строка содержит слова и эти слова в этой строке." Здесь слова "слова" имеют порядковые номера 4 и 7. Всем спасибо, особенно за конкретный пример или ссылку на конкретный алгоритм.


Dstr   (2006-05-10 17:54:00) [21]

А ты блин прав,Токгда мош ето подойдет?:

function Seps(As_Arg: Char): Boolean;
begin
 Seps := As_Arg in
   [ #0..#$1F, ' ', '.', ',', '?', ':', ';', '(', ')', '/', '\'];
end;

function WordCount(CText: string): Longint;
var
 Ix: Word;
 Work_Count: Longint;
begin
 Work_Count := 0;
 Ix         := 1;
 while Ix <= Length(CText) do
 begin
   while (Ix <= Length(CText)) and (Seps(CText[Ix])) do
     Inc(Ix);
   if Ix <= Length(CText) then
   begin
     Inc(Work_Count);

     while (Ix <= Length(CText)) and (not Seps(CText[Ix])) do
       Inc(Ix);
   end;
 end;
 Word_Count := Work_Count;
end;

Function NumWorld(S: String; Pos: Integer): Longint;  //Ну если ето не поможет,то не знаю,Нужно конечно указать позицию курсора в Pos
Begin;
Delete(S, Pos, Length(S) - Pos);
Result := WordCount(S);
End;


Jeer   (2006-05-10 17:35:00) [22]

Ок.
В тексте объемом с "Война и мир" слово война встречается 515 раз и каждое из них имеет свою позицию, т.е. имее 515 чисел.
Вам в каком виде надо это представить и кому ?


Dstr   (2006-05-10 17:31:00) [23]


> Нет, Вы не совсем правильно истолковали вопрос. Да, GetWord
> действительно возвратит третье слово из строки или текста.
>  Но мне неоходимо, например в обработчике события onMouseDown,
>  чтобы при щелчке на слове "текст" я получил как результат
> этой функцииего порядковый номер, то есть число 3. теперь
> более понятнее я написал. А функция Pos мне не годится,
> потому что она возвращает символы слова, а не порядковый
> номер слова. Спасибо всем за участие и жду новых решений


Ой,извини я сегодня чето тормажу,
Тогда используешь также StrBreakApart и в цикле сравнивай Строки Из TstringList С твоим словом...


Dr. Andrew   (2006-05-10 17:27:00) [24]

Jeer! Я ведь обращаюсь к профессионалам, мастерам. Для того это и форум, чтобы найти мысль, на которую тебя натолкнут. Пока такой мысли нет. И я не профессиональный программист, а детский врач. И необходимость в коде по моей работе (это долго объяснять). У врачей теперь тоже есть компьютеры и они немного программируют для себя и своих пациентов. Так что может кто-то из мастеров все же поможет отечественной науке?


Dr. Andrew   (2006-05-10 17:22:00) [25]

С огромным удовольствием, если бы было над чем.


Dr. Andrew   (2006-05-10 17:22:00) [26]

С огромным удовольствием, если бы было над чем.


Jeer   (2006-05-10 17:14:00) [27]

Dr. Andrew   (10.05.06 17:11) [10]


> и жду новых решений.


А самому поработать ?


Dr. Andrew   (2006-05-10 17:11:00) [28]

Нет, Вы не совсем правильно истолковали вопрос. Да, GetWord действительно возвратит третье слово из строки или текста. Но мне неоходимо, например в обработчике события onMouseDown, чтобы при щелчке на слове "текст" я получил как результат этой функцииего порядковый номер, то есть число 3. теперь более понятнее я написал. А функция Pos мне не годится, потому что она возвращает символы слова, а не порядковый номер слова. Спасибо всем за участие и жду новых решений.


Dstr   (2006-05-10 16:48:00) [29]

ААааа,ну ето эшо проще:

function GetWord(Str, Smb: string; WordNmbr: Byte): string;
var
 SWord: string;
 StrLen, N: Byte;
begin

 StrLen := SizeOf(Str);
 N := 1;

 while ((WordNmbr >= N) and (StrLen <> 0)) do
 begin
   StrLen := Pos(Smb, str);
   if StrLen <> 0 then
   begin
     SWord := Copy(Str, 1, StrLen - 1);
     Delete(Str, 1, StrLen);
     Inc(N);
   end
   else
     SWord := Str;
 end;

 if WordNmbr <= N then
   Result := SWord
 else
   Result := '';
end;


//А вот так используйте   GetWord('Здесь ваш текст',' ',3); // Возвращает -> 'текст'

А вот насчет ICQ ето зря,ведь RealTime куда лучше чем етот Email...Я сам в протоколе разбырался аси,он кривой конечно,но зато работает,и работает быстро.В прогах я всегда уважаю быстроту больше красотулек...


Jeer   (2006-05-10 16:40:00) [30]

Dr. Andrew   (10.05.06 16:20) [6]

определись с понятием "слово" и "разделитель(и)" слов.
Все сразу станет на место.
Позиция символа в строке - pos()


Dr. Andrew   (2006-05-10 16:22:00) [31]

Спасибо. ICQ не имею и не уважаю, как программу. Извините - у каждого свои пристрастия. :-) Может тогда посмотрите на мою задачу с нового угла зрения. Номер слова нужен по тексту, а не слово в тексте по номеру.


Dr. Andrew   (2006-05-10 16:20:00) [32]

Dstr.

Функция SelWord возвращает слово по его порядковому номеру и то неверно, почему-то, а у меня совсем другая задача. Возвращать порядковый номер слова в тексте, например - "Это мой текст и я его написал.", где "Это" - 1, "мой" - 2, "текст" - 3 ... "написал" - N.


Dstr   (2006-05-10 16:12:00) [33]

Не,лучше ICQ 209-298-286


Dr. Andrew   (2006-05-10 16:06:00) [34]

Спасибо Dstr! Сейчас попробую. А можно с Вами держать связь по e-mail?


Dstr   (2006-05-10 16:04:00) [35]

//Разделить строку S на слова используя разделительный символ Delimeter
//и поместить результат в TStrings
procedure StrBreakApart(const S, Delimeter: string; Parts: TStrings);
var
 CurPos: integer;
 CurStr: string;
begin
 Parts.clear;
 Parts.BeginUpdate();
 try
   CurStr := S;
   repeat
     CurPos := Pos(Delimeter, CurStr);
     if (CurPos > 0) then
     begin
       Parts.Add(Copy(CurStr, 1, Pred(CurPos)));
       CurStr := Copy(CurStr, CurPos + Length(Delimeter),
         Length(CurStr) - CurPos - Length(Delimeter) + 1);
     end
     else
       Parts.Add(CurStr);
   until CurPos = 0;
 finally
   Parts.EndUpdate();
 end;
end;

//поиск слова ета функция написана мной сейчас "на скорую руку"
procedure SelWord(Where: String;What: Integer): String;
Var Tmp: TStringList;
Begin;
Tmp := TStringList.Create;
StrBreakApart(Where, ' ', Tmp);
Result := Tmp.Strings[What + 1];
End;

//Если у тебя многострочный текст - Создаешь временую строку,помешаешь туда текст и заменяешь \n\r или \r\n на пробелы и реализуешь то что я написал


Dr. Andrew   (2006-05-10 15:42:00) [36]

Сергей, от первого слова в строке или тексте до последнего необходимо восстанавливать его порядковый номер.


Сергей М.   (2006-05-10 15:34:00) [37]


> Как создать алгоритм возвращения поряд. номера слова в строке


Каком кверху.

ТЗ готовь.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо