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:...


За что прощать-то? Молодец!

Я, правда, этой функцией давно не пользуюсь... Предпочитаю:

Code: Select all

Copy(s,1,Pos(' ',s)-1)


:lol:

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: Я, правда, этой функцией давно не пользуюсь... Предпочитаю:

Code: Select all

Copy(s,1,Pos(' ',s)-1)


:lol:


Я такой не знаю. (((

Re: Да простит меня Edred

Posted: 2006-12-05 13:19:54
by SLAK
GAUHAR wrote:
Edred wrote:

Code: Select all

Copy(s,1,Pos(' ',s)-1)


:lol:

Я такой не знаю. (((

Это не с Инжекта :D

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
#----------------------------------------------------------------#
##################################################################