![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать алгоритм возвращения поряд. номера слова в строке. [D7, WinXP]
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]
> Как создать алгоритм возвращения поряд. номера слова в строке
Каком кверху.
ТЗ готовь.