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

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

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

Post 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
#------------------------------------------------------------------------#
##########################################################################
Last edited by GAUHAR on 2006-12-05 07:34:26, edited 1 time in total.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Ога, а теперь сделай так, чтобы то, что в кавычках было одним словом -)
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Post by GAUHAR »

Destruction wrote:Ога, а теперь сделай так, чтобы то, что в кавычках было одним словом -)

А твои функции Des.String.GetWord(string, num) и Des.String.GetWordsCount(string) на что )))
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

GAUHAR wrote:
Destruction wrote:Ога, а теперь сделай так, чтобы то, что в кавычках было одним словом -)

А твои функции Des.String.GetWord(string, num) и Des.String.GetWordsCount(string) на что )))

На всякий случай.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

У тебя строчка слишком длинная - посмотри в сторону int inArray( string, array, bool, int ) -)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

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

Post by Edred »

GAUHAR wrote:...


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

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

Code: Select all

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


:lol:
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Post 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
#----------------------------------------------------------------#
##################################################################
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

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

Post by GAUHAR »

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

Code: Select all

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


:lol:


Я такой не знаю. (((
SLAK
Posts: 182
Joined: 2005-08-19 16:12:23
Contact:

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

Post by SLAK »

GAUHAR wrote:
Edred wrote:

Code: Select all

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


:lol:

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

Это не с Инжекта :D
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

viewtopic.php?t=7379

Сюда скинь свою функцию, чтобы народу была доступна...
Ни один скрипт не работает? Пора обновить Инжект...
Все работает, но хочется большего? Пора переходить на стелс...
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Code: Select all

var delimeter = ' ,!.'
uo.print( delimeter[ n ] )


Такой код только у меня работает?.. В любом случае, если забить эту информацию в строковую переменную - можно будет убрать 1 переменную и сократить код.
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

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