Yoko
http://forum.yoko.com.ua/

Да простит меня Edred
http://forum.yoko.com.ua/viewtopic.php?f=20&t=10320
Page 1 of 1

Author:  GAUHAR [ 2006-12-05 06:00:58 ]
Post subject:  Да простит меня Edred

Code:
##########################################################################
# (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
#------------------------------------------------------------------------#
##########################################################################

Author:  Destruction [ 2006-12-05 07:27:35 ]
Post subject: 

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

Author:  GAUHAR [ 2006-12-05 07:35:37 ]
Post subject: 

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

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

Author:  Destruction [ 2006-12-05 08:00:37 ]
Post subject: 

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

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

На всякий случай.

Author:  Destruction [ 2006-12-05 08:02:06 ]
Post subject: 

У тебя строчка слишком длинная - посмотри в сторону int inArray( string, array, bool, int ) -)

Author:  Edred [ 2006-12-05 10:15:19 ]
Post subject:  Re: Да простит меня Edred

GAUHAR wrote:
...


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

Я, правда, этой функцией давно не пользуюсь... Предпочитаю:
Code:
Copy(s,1,Pos(' ',s)-1)


:lol:

Author:  GAUHAR [ 2006-12-05 11:56:52 ]
Post subject: 

Еще одна редакция:
Code:
##################################################################
# (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
#----------------------------------------------------------------#
##################################################################

Author:  GAUHAR [ 2006-12-05 12:00:17 ]
Post subject:  Re: Да простит меня Edred

Edred wrote:
Я, правда, этой функцией давно не пользуюсь... Предпочитаю:
Code:
Copy(s,1,Pos(' ',s)-1)


:lol:


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

Author:  SLAK [ 2006-12-05 13:19:54 ]
Post subject:  Re: Да простит меня Edred

GAUHAR wrote:
Edred wrote:

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


:lol:

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

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

Author:  Edred [ 2006-12-05 23:30:23 ]
Post subject: 

viewtopic.php?t=7379

Сюда скинь свою функцию, чтобы народу была доступна...

Author:  Destruction [ 2006-12-06 09:01:45 ]
Post subject: 

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


Такой код только у меня работает?.. В любом случае, если забить эту информацию в строковую переменную - можно будет убрать 1 переменную и сократить код.

Author:  GAUHAR [ 2006-12-06 15:36:30 ]
Post subject: 

Destruction wrote:
Code:
var delimeter = ' ,!.'
uo.print( delimeter[ n ] )


Такой код только у меня работает?.. В любом случае, если забить эту информацию в строковую переменную - можно будет убрать 1 переменную и сократить код.


Destruction спасибо за подсказку, я просто не знал (или забыл), что со строкой можно работать как с массивом символов.
Переделал предыдущий скрипт как ты сказал. Вот что получилось.
И еще я только сейчас узнал синтаксис функции int inArray( string, array, bool, int ), буду пробовать. Да и еще в доках указано isArray, как будет правильней?

Code:
##################################################################
# (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
#----------------------------------------------------------------#
##################################################################

Page 1 of 1 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/