Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб июн 23, 2018 21:31

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 67 ]  На страницу Пред.  1, 2, 3, 4, 5
Автор Сообщение
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Пн май 20, 2013 14:32 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
VoidVolker писал(а):
Не? А еще можно без всех этих кружочков, апострофов и кавычек просто написать три числа.

конечно проще, а еще проще вообще только бинарные числа писать, скажем, надо 10 набрать, набираем 1010, подумаешь, в уме числа в двоичную систему из любой другой переводить! зато просто 8)
Углы читают люди, более того, люди не имеющие понятия на каком языке написана программа, более того, программа не одна, а с десяток. И данных не одна две строчки, а мегабайты.
VoidVolker писал(а):
зачем так все усложнять-то?


VoidVolker писал(а):
0x как-то привычнее, а hex - переключение системы счисления.

я иллюстрирую смысл, можно и так: 0x 2E3BA9 (главное пробел не забыть 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Пн май 20, 2013 17:13 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 231
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Да Вы правы, можно проще, в исходном строковом представлении угла
сделать замену символов на подстроки:

на стек 0 ( или дописать 0 с пробелом перед началом строки)
° -> <пробел>3600<пробел>*<пробел>+<пробел>
' -> <пробел>60<пробел>*<пробел>+<пробел>
" -> <пробел>+<пробел>

а затем просто EVALUATE полученную строку


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Пн май 20, 2013 18:25 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1254
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Да, или так.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Пн май 20, 2013 19:04 
Не в сети
Аватара пользователя

Зарегистрирован: Чт дек 31, 2009 18:36
Сообщения: 2105
Откуда: Питер
Благодарил (а): 15 раз.
Поблагодарили: 34 раз.
Alex писал(а):
можно заметить, что запись немного напоминает стековые манипуляторы.
Думаю, если не заморачиваться построением универсального конвертера "на всякий случай", а решать задачу "по месту", удастся ограничиться "обычными" словами: "градусы", "минуты-секунды" и т.д.

_________________
Когда я говорю "понимаю" - это не значит, что я согласен, не значит, что я понимаю, и вообще не значит, что я слушаю тебя. /Чарли, "2 1/2 человека"/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Ср май 22, 2013 08:04 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 231
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
Последний вариант можно подправить для читабельности и красоты
Код:
: градусы-в-секунды ( g->s ) 3600 * + ;
: минуты-в-секунды ( m->s ) 60 * + ;
: добавить-секунды ( +->s ) + ;

ну и тогда после соответствующей подстановки получим форт-программу
Цитата:
вход: 12°12'12" волшебное-слово выход: 12 градусы-в-секунды 12 минуты-в-секунды 12 добавить-секунды

Вот возможен еще один вариант (алгоритм):
Цитата:
mOleg писал:
можно, но нужно учесть, что полная запись 12°12'12" часто не нужна, удобно, скажем 12°12" или 12'12" так же как и 12", 12'
VoidVolker писал:
Код:
ms>s gm>s
Не?

входная строка 12°12'12" заменяем символы 0..9 на символ d, получаем dd°dd'dd"
редуцируем повторные символы d°d'd", делаем замену d° -> g ; d' -> m ; d" -> s
добавляем в конце суффикс >s Вот мы и получили имя слова, которое заменит
во входной строке символы градусов, минут и секунд на пробелы и произведет расчет.

кажется chess как-то назвал подобное - символьными вычислениями над строками.
беглый обзор по интернетам показал, что самая подходящая библиотечка это
strings от VoidVolker, найти можно на форуме nncron. А на нашем форуме
к сожалению не было презентации этой замечательной либы :(
VoidVolker а Вы еще занимаетесь этой либой? встроить бы туда макроподстановку
символа на строку, и строку на символ (как некие действия над SPAD-ом).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Ср май 22, 2013 08:23 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1254
Благодарил (а): 3 раз.
Поблагодарили: 16 раз.
Alex писал(а):
кажется chess как-то назвал подобное - символьными вычислениями над строками.
беглый обзор по интернетам показал, что самая подходящая библиотечка это
strings от VoidVolker, найти можно на форуме nncron. А на нашем форуме
к сожалению не было презентации этой замечательной либы :(
VoidVolker а Вы еще занимаетесь этой либой?

Конечно занимаюсь - просто некогда. Она пока в статусе беты, есть несколько непринципиальных багов и моментов, которые надо переделать. Предназначена как раз для всяких смешанных операций со строками, числами, переменными и прочим.
Alex писал(а):
встроить бы туда макроподстановку символа на строку, и строку на символ (как некие действия над SPAD-ом).

Как бы есть:
Код:
" Текст из кода: %<любой форт код без двойной кавычки>% Еще какой-то текст."

А если заглянуть внутрь, то можно найти код для добавления любой реакции на любую последовательность символов.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: преобразование строкового представления угла вида 12°12'
СообщениеДобавлено: Ср май 22, 2013 21:59 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2107
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 34 раз.
Первое, что пришло в голову ( "потоковое решение" ), сразу заработало без отладки(задачка очень проста).
Подумав, можно убрать комбинаторику и сократить текст, за счет независимой обработки трех видов подстрок.
Код:
: NOTFOUND ( a u -- g m s ) u! a! 0. g! m! 0. s! n! 1 k!  \ n - рез-т в минутах
\ os - смещения символов ° ' " , если символа нет то смещение = 0
os( u 0 DO '°' I a + C@ = IF I is g THEN
           ''' I a + C@ = IF I is m THEN
           '"' I a + C@ = IF I is s THEN LOOP g m s )
\ sq - преобразование подстроки в число
sq( DO a I + C@ '0' - k * n + is n k 10 * is k -1 +LOOP n 0 is n 1 is k )
1 u 11 3\21>23<&Z os 3\1Z2Z3Z&& AND IF a u NOTFOUND EXIT THEN
os 3600 60 5\1z2z3z&&iy1`1-[sq]4*1`1+2`1-[sq]5*2`1+3`1-[sq]++t_
             1z2z3Z&&iy1`1-[sq]4*1`1+2`1-[sq]5*+t_
             1z2Z3z&&iy1`1-[sq]4*1`1+3`1-[sq]+t_
             1z2Z3Z&&iy1`1-[sq]4*t_
             1Z2z3z&&iy2`1-[sq]5*2`1+3`1-[sq]+t_
             1Z2z3Z&&iy2`1-[sq]5*t_
             1Z2Z3z&&iy3`1-[sq]t ;

\ тест
STARTLOG

  1°1'1"   1°1'   1°1"   1°   1'1"   1'  1"


Log
Код:
Ok ( 3661 3660 3601 3600 61 60 1 )


Реализация предложения от Alex
Код:
gs:  3600 * ;   ms:  60 * ;   ds:  + + ;   ws:  + ;  \ процедуры преобразования градусов, минут в секунды

: NOTFOUND ( a u -- s ) u! a! 0. sm! p! 0 c! 30 ns]
sw( ns p + C! p 1+ is p ) \ процедура записи символов чисел и символов процедур в строку
sp( BL sw sm '°' = IF 'g' sw 's' sw ELSE sm ''' = IF 'm' sw 's' sw THEN THEN BL sw )
sd( sm '°' = sm ''' = sm '"' = OR OR )
os( u 0 DO I a + C@ is sm sd IF sp c 1+ is c ELSE sm sw THEN LOOP ) \ преобразование исходной лексемы в строку для EVALUATE
os c 0= IF a u NOTFOUND EXIT THEN  \ собственно интерпретатор лексем
c 3 = IF 'd' sw 's' sw ELSE c 2 = IF 'w' sw 's' sw THEN THEN BL sw ns p EVALUATE ;

\ test
STARTLOG
1°23'45"  23'45"  45"23'  45"1°

лог
Код:
Ok ( 5025 1425 1425 3645 )

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 67 ]  На страницу Пред.  1, 2, 3, 4, 5

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB