Page 1 of 1
Да простит меня Edred
Posted: 2006-12-05 06:00:58
by GAUHAR
Code: Select all
##########################################################################
# (c) Edred #
# Возвращает слово из строки str за номером num, если такого слова нет - #
# возвращаем '' #
# Разделителем слов считаем пробел. Несколько пробелов подряд считаются #
# за один. #
# Функция сделана без рекурсии специально для считывания слов из #
# сверхдлинных строк! #
# GAUHAR: #
# Сделал небольшие изменения. Теперь разделитем слов является не только #
# пробел, но и знаки пунктуации: запятая, двоеточие, точка с запятой, #
# точка, восклицательный знак, вопросительный знак. #
# Два подряд идущих разделителя считаются за один. #
# Заменил выражение dlin-1 на len(st), а переменную dlin удалил. Почему #
# я это сделал: не знаю почему, но если строка заканчивается словом без #
# знака пунктуаци (например: точки), то функция почему-то возвращала #
# последнее слово без последней буквы, а так работает все нормально. #
#------------------------------------------------------------------------#
SUB GetWord(st,nom )
VAR tmpst, i, kol = 0, start = 0
For i=0 To len(st)
If mid(st,i,1)==' ' OR mid(st,i,1)==',' OR mid(st,i,1)==':' OR mid(st,i,1)==';' OR mid(st,i,1)=='.' or mid(st,i,1)=='!' or mid(st,i,1)=='?' OR i==len(st) Then
kol = kol + 1
If kol==nom Then
; это первый разделитель после нужного нам слова
tmpst = mid( st, start, i - start )
return tmpst
Else
While mid(st,i,1)==' ' or mid(st,i,1)==',' or mid(st,i,1)==':' or mid(st,i,1)==';' OR mid(st,i,1)=='.' or mid(st,i,1)=='!' or mid(st,i,1)=='?'
i = i + 1
Wend
If kol==nom - 1 Then
start = i
Endif
Endif
Endif
Next
tmpst = ''
return tmpst
endsub
#------------------------------------------------------------------------#
##########################################################################
Posted: 2006-12-05 07:27:35
by Destruction
Ога, а теперь сделай так, чтобы то, что в кавычках было одним словом -)
Posted: 2006-12-05 07:35:37
by GAUHAR
Destruction wrote:Ога, а теперь сделай так, чтобы то, что в кавычках было одним словом -)
А твои функции Des.String.GetWord(string, num) и Des.String.GetWordsCount(string) на что )))
Posted: 2006-12-05 08:00:37
by Destruction
GAUHAR wrote:Destruction wrote:Ога, а теперь сделай так, чтобы то, что в кавычках было одним словом -)
А твои функции Des.String.GetWord(string, num) и Des.String.GetWordsCount(string) на что )))
На всякий случай.
Posted: 2006-12-05 08:02:06
by Destruction
У тебя строчка слишком длинная - посмотри в сторону int inArray( string, array, bool, int ) -)
Re: Да простит меня Edred
Posted: 2006-12-05 10:15:19
by Edred
GAUHAR wrote:...
За что прощать-то? Молодец!
Я, правда, этой функцией давно не пользуюсь... Предпочитаю:

Posted: 2006-12-05 11:56:52
by GAUHAR
Еще одна редакция:
Code: Select all
##################################################################
# (c) Edred #
# Edition: GAUHAR #
# Возвращает слово из строки str за номером num, если такого #
# слова нет - возвращаем '' #
# Разделителем слов считаем пробел и знаки пунктуации. Несколько #
# разделителей подряд считаются за один. #
# Примечание: работает чуть медленней, чей оригинальная функция, #
# но в ней легко можно добавить или удалить разделители. #
#----------------------------------------------------------------#
SUB GetWord(st,nom)
VAR tmpst, i, kol = 0, start = 0
VAR j, m, LastIndexArray = 12
DIM delimiter[13]
delimiter[0] = ' '
delimiter[1] = ','
delimiter[2] = ':'
delimiter[3] = ';'
delimiter[4] = '.'
delimiter[5] = '!'
delimiter[6] = '?'
delimiter[7] = '"'
delimiter[8] = '('
delimiter[9] = ')'
delimiter[10] = '['
delimiter[11] = ']'
delimiter[12] = '*'
for i=0 to len(st)
for j=0 to LastIndexArray
if mid(st,i,1)==delimiter[j] or i==len(st) then
kol = kol + 1
if kol==nom then
; это первый разделитель после нужного нам слова
tmpst = mid( st, start, i - start )
return tmpst
else
for m = 0 to LastIndexArray
while mid(st,i,1)==delimiter[m]
i = i + 1
m = 0
wend
next
if kol==nom - 1 then
start = i
endif
endif
endif
next
next
tmpst = ''
return tmpst
endsub
#----------------------------------------------------------------#
##################################################################
Re: Да простит меня Edred
Posted: 2006-12-05 12:00:17
by GAUHAR
Edred wrote: Я, правда, этой функцией давно не пользуюсь... Предпочитаю:

Я такой не знаю. (((
Re: Да простит меня Edred
Posted: 2006-12-05 13:19:54
by SLAK
GAUHAR wrote:Edred wrote: 
Я такой не знаю. (((
Это не с Инжекта

Posted: 2006-12-05 23:30:23
by Edred
viewtopic.php?t=7379
Сюда скинь свою функцию, чтобы народу была доступна...
Posted: 2006-12-06 09:01:45
by Destruction
Code: Select all
var delimeter = ' ,!.'
uo.print( delimeter[ n ] )
Такой код только у меня работает?.. В любом случае, если забить эту информацию в строковую переменную - можно будет убрать 1 переменную и сократить код.
Posted: 2006-12-06 15:36:30
by GAUHAR
Destruction wrote:Code: Select all
var delimeter = ' ,!.'
uo.print( delimeter[ n ] )
Такой код только у меня работает?.. В любом случае, если забить эту информацию в строковую переменную - можно будет убрать 1 переменную и сократить код.
Destruction спасибо за подсказку, я просто не знал (или забыл), что со строкой можно работать как с массивом символов.
Переделал предыдущий скрипт как ты сказал. Вот что получилось.
И еще я только сейчас узнал синтаксис функции int inArray( string, array, bool, int ), буду пробовать. Да и еще в доках указано isArray, как будет правильней?
Code: Select all
##################################################################
# (c) Edred #
# Edition: GAUHAR #
# Возвращает слово из строки str за номером num, если такого #
# слова нет - возвращаем '' #
# Разделителем слов считаем пробел и знаки пунктуации. Несколько #
# разделителей подряд считаются за один. #
# Примечание: работает чуть медленней, чем оригинальная функция, #
# но в ней легко можно добавить или удалить разделители. #
#----------------------------------------------------------------#
SUB GetWord(st,nom)
VAR tmpst, i, kol = 0, start = 0
VAR j, m, delimiters = ' ,:;.!?"()[]*'
for i=0 to len(st)
for j=0 to len(delimiters) - 1
if mid(st,i,1)==delimiters[j] or i==len(st) then
kol = kol + 1
if kol==nom then
; это первый разделитель после нужного нам слова
tmpst = mid( st, start, i - start )
return tmpst
else
for m = 0 to len(delimiters) - 1
while mid(st,i,1)==delimiters[m]
i = i + 1
m = 0
wend
next
if kol==nom - 1 then
start = i
endif
endif
endif
next
next
tmpst = ''
return tmpst
endsub
#----------------------------------------------------------------#
##################################################################