Page 2 of 2

Posted: 2006-03-16 08:38:22
by CFA
Destruction wrote:

Code: Select all

if (30<x) and (x<40)

Не вижу логики, будет верно если x < 30, зачем тогда двойное условие? Возможно имелось в виду так:

Code: Select all

if (30>x) and (x<40)


30<x == x>30
x<40 == x<40 => x> 30 and x<40

Posted: 2006-03-16 09:12:03
by CRazych
Вы на условие не сматрите это для примера!

Просто мне нужно знать если способ просто упрастить конструкцию.

Я просто подозреваю, что скорость работы этого скрипта будет давольно не быстрая!

Posted: 2006-03-16 10:06:28
by Destruction
CRazych wrote:Вы на условие не сматрите это для примера!

Просто мне нужно знать если способ просто упрастить конструкцию.

Я просто подозреваю, что скорость работы этого скрипта будет давольно не быстрая!

Условия обрабатываются достаточно быстро.

Сократить можно - загнать всяку нечисть в массив и пустить циклом.

Posted: 2006-03-17 01:30:31
by CRazych
Чо то у мен мазгов нехватает.
Помагите плиз логикой. Как обработать строку
"coordinates 71o 53' S 83o 15' E"

Нужно вытащить координыты.
Просблема в том что они плавают тоесь нельзя просто указывать номер символа в строке.
Допустим следущая строка.
"location 171o 53' S 183o 15' E"

Ктонить может подсказать?

Posted: 2006-03-17 10:38:58
by Grin
ну и что чт оплавает?
Вырезаешь статическую часть "location "
дальше на чинаешь в строчке искать пробелы, выризать МИДом

А вообще была такая хорошая функция scanint описание ее правда так и не попадалось на глаза;)

Posted: 2006-03-17 15:10:21
by CRazych
Как это понять вырезаешь?
Каким образом? (пример приведи)

Posted: 2006-03-17 22:31:15
by Grin
CRazych wrote:всё уже разобрался всё проще некуда )


Есть куча команд для работы со строчками... основные для тебя тут будет Left(str, n) Right(str, n) Mid(str, p, n)
первая возврашает подстроку на чиная с левого края длинной Н
Вторая тоже самая только справа...
третья возврашает подстрокку на чиная с позиции П и длиной Н

Posted: 2006-03-17 23:28:17
by Edred
CRazych wrote:Как это понять вырезаешь?
Каким образом? (пример приведи)


Вот тебе удобная для таких случаев функция:

Code: Select all

Sub GetWord( st, nom )
; (c) Edred
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
   VAR tmpst, i, dlin, kol = 0, start = 0
   dlin = len( st )
   For i=0 To dlin - 1
      If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
         kol = kol + 1
         If kol == nom Then
            ; это первый пробел после нужного нам слова
            tmpst = mid( st, start, i - start )
            return tmpst
         Else
            While 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-03-18 00:06:20
by CRazych
Для нюба можно каждую строку с коминтарием?
Я просто ниразу в сваей жизне не использвал такого рода операторы.

Posted: 2006-03-18 00:13:55
by Grin
чего тут не понятного? вот ты как определяешь зрительно что в строчке есть слова? правельно буковки и пустоты... так вот у этой пустоты есть имя... "ПРОБЕЛ" как не страно но у пустоты есть номер...
так вот что бы делить строчки достаточно искать эти пустоты... и найдя определять границы...
Самы простой алгоритм это с 2-мя переменными посиции начала и конца (начало_слова, конец_слова (числовые переменные)).

для простоты можно в конец строки добавить пробел...
изначально:
строка = строка + пробел
начало_слова = 0
конец_слова = 0
ищем пробел
нашли (текущая_позиция)
начало_слова = конец_слова
конец_слова = текущая_позиция

после первого прохода мы уже можем выделить первое слово...
и так далее...

Posted: 2006-03-18 02:14:37
by CRazych
Давай по примерам, что б я доконца разобрался.
Допустим есть переменная num=abc1 abc2 abc3

Задание вывести в отдельную переменную "z" abc2

Code: Select all

sub main()
var num,z
num=abc1 abc2 abc3
нужно продолжить код дальше


Первые вопросы:
Что делают функции len( ) mid( )



Я сильно извеняюсь за глыпые вопросы, но больше мне их задать негде.

И надеюсь с вашей помащью у меня ченить получится.
Заранее спасибо!

Posted: 2006-03-18 11:51:32
by Grin
Исходное:
строка = 'abc1 abc2 abc3'
номер_слова = 3 (номер слова, которое нам надо выделить из строки)
z = 0

Как искать пробел?
в инжекте строки это массив символов, по этому кним можно обращаться как к масиву.
строках[0] = 'a' строка[1] = 'b'
Следовательно достаточно обращатся к элементам массива, что бы найти пробел.

дальше найдя пробел надо обновить указатели на чалиа и конца слова. сна хождением нового пробела конец предшествующего слова становится на чалом следующего, по этому и происходит обмен у казателей (следует только соблюдать правельный порядок обмена).

Code: Select all

sub GetWord(строка, номер_слова)
var текущая_позиция = 0, начало_слова = 0, конец_слова = 0
   строка = строка + ' '
   while номер_слова <> 0
      if строка[текущая_позиция] == ' ' then
         номер_слова = номер_слова - 1
         начало_слова = конец_слова
         конец_слова = текущая_позиция
      end if
      текущая_позиция = текущая_позиция + 1
   wend
   return Mid(строка, начало_слова, конец_слова - начало_слова)
end sub
z=val(GetWord('abc1 abc2 abc3', 3))

Posted: 2006-03-18 14:50:28
by CRazych
<> что это означает?

Posted: 2006-03-18 16:46:29
by Kynep
CRazych wrote:<> что это означает?


<> - означает "не равно"