Функция перевода из вещественного значения в строку.
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Функция перевода из вещественного значения в строку.

Функция перевода из вещественного значения в строку.

Ответ
Поиск в этой теме
Непрочитано 14.06.2008, 11:22 #1
Функция перевода из вещественного значения в строку.
TimurX
 
Регистрация: 14.06.2008
Сообщений: 5

Есть такое задание.

Написать функцию grmnsec, переводящую число из вещественного значения в
строку.
вещественное значение - значение в виде:
градусы.минуты_секунды_десятыедолисекунд.

При этом при равенстве нулю градусы, минуты должны отбрасываться,
оставляя только значащую часть.
по знакам:
ГГ.ММССДДДДДДД

Необходимо отметить, что для вывода градусов на чертеж, используется
строка %%d

Параметр функции - вещественное значение.
Результат - список значений:
строка для вывода на чертеж в виде градусов, минут, секунд.
число градусов (целое)
число минут (целое)
число секунд (вещественное)

Пример:
(grmnsec 12.3456789)
должен быть результат:
("12%%d34'56.789''" 12 34 56.789)

Скажите, как сделать?
Просмотров: 3623
 
Непрочитано 14.06.2008, 13:34
#2
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Если тупо следовать твоим указаниям, тогда
эта функция выдаст тебе то что ты просил
Хотя я сомневаюсь в правильности условий
тобой поставленных
К примеру 0.34 градуса будет не 34 минуты
а примерно 38 минут или около того я в арифметике
не шибко-то

Код:
[Выделить все]
(defun grmnsec	(ang / grad mn sec sign str_ang)
  (setvar "angdir" 1)
  (if (minusp ang)
    (setq sign "-")
    (setq sign ""))
  (setq ang (rtos ang 2 7))
  (setq pos (vl-string-position 46 ang 0))
  (setq	grad (substr ang 1 pos)
	mn   (substr ang (+ pos 2) 2)
	sec  (rtos (/ (atof (substr ang (+ pos 4) 4)) 100.) 2 2)
	)
  (setvar "angdir" 0)
  (setq	str_ang
	 (cond ((and (zerop (atof grad)) (zerop (atof mn)))
		(strcat sign sec "''"))
	       ((and (zerop (atof grad)) (not (zerop (atof mn))))
		(strcat sign mn "'" sec "''"))
	       ((and (not (zerop (atof grad))) (zerop (atof mn)))
		(strcat grad "%%d" mn "'" sec "''"))
	       (T (strcat grad "%%d" mn "'" sec "''"))
	       )
	)
  ;; return value
  (list
    str_ang
    (atof grad)
    (atof mn)
    (atof sec)
    )
  )

;; TesT:
(print
(list
(grmnsec 10.155678)
(grmnsec -0.055678)
(grmnsec 10.005678)
(grmnsec 0.005678)
(grmnsec -10.005678)
(grmnsec -0.005678)))

;;Call: (grmnsec 12.3456789);==>("12%%d34'56.789''" 12 34 56.789)
~'J'~

Последний раз редактировалось fixo, 21.06.2008 в 07:07. Причина: опеть соврамши :)
fixo вне форума  
 
Автор темы   Непрочитано 14.06.2008, 23:20
#3
TimurX


 
Регистрация: 14.06.2008
Сообщений: 5


А чтобы и минуты точно переводились что нужно сделать? Не сложно будет?
TimurX вне форума  
 
Непрочитано 14.06.2008, 23:27
#4
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Вообще то я тоже сомневаюсь в правильности условий
1градус = 60минут => 0.34 градуса = (* 0.34 60.) = 20.4'
Код:
[Выделить все]
(defun grmnsec (a / lst)
  (repeat 2
    (setq lst (cons (atoi (vl-princ-to-string a)) lst))
    (setq a (* 60 (rem a 1.)))
  ) ;_ end of repeat
  (setq lst (vl-remove-if
       '(lambda (x) (equal x 0))
       (reverse (cons a lst))
     ) ;_ end of vl-remove-if
  ) ;_ end of setq
  (cons
    (apply 'strcat
    (mapcar '(lambda (x y)
        (strcat (vl-princ-to-string x) y)
      ) ;_ end of lambda
     lst
     '("%%d" "'" "''")
    ) ;_ end of mapcar
    ) ;_ end of apply
    lst
  ) ;_ end of cons
) ;_ end of defun
 
;;;(grmnsec 12.3456789) -> ("12%%d20'44.444''" 12 20 44.444)
;;;(grmnsec 12.5) => ("12%%d30'" 12 30)
;;;(grmnsec 12) => ("12%%d" 12)

Последний раз редактировалось CB, 14.06.2008 в 23:50.
CB вне форума  
 
Непрочитано 17.06.2008, 23:47
#5
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Мои 5 копеек
Код:
[Выделить все]
(defun DTR (a)(* pi (/ a 180.0)))
(angtos (dtr 12.3456789) 1 7) ;_-> "12d20'44.444\""
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 18.06.2008, 10:16 ...
#6
TimurX


 
Регистрация: 14.06.2008
Сообщений: 5


случайно продублировал, удалил сообщение.

Последний раз редактировалось TimurX, 18.06.2008 в 10:20. Причина: случайно продублировал, удалил сообщение.
TimurX вне форума  
 
Автор темы   Непрочитано 18.06.2008, 10:17 ...
#7
TimurX


 
Регистрация: 14.06.2008
Сообщений: 5


Переводить в углы не нужно, так как задача угла уже будет в нужном формате, т.е. 12.345678 это 12 град, 34 минуты 56.78 сек.
т.е. первый код больше подходит.
Единственное, не подскажите как сделать, чтобы отбрасывались нули, т.е. если градусов 0, то выводилось бы сразу 34 мин, 56.78 сек.
и если и минуты равны 0, то только секунды выводились. НО, если градусы имеют значащую часть, а минуты равны 0, то выводилось бы 12 град, 0 минут и 56.78 сек. ???
TimurX вне форума  
 
Непрочитано 21.06.2008, 07:05
#8
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Пробуй

Код:
[Выделить все]
(defun grmnsec	(ang / grad mn sec sign str_ang)
  (setvar "angdir" 1)
  (if (minusp ang)
    (setq sign "-")
    (setq sign ""))
  (setq ang (rtos ang 2 7))
  (setq pos (vl-string-position 46 ang 0))
  (setq	grad (substr ang 1 pos)
	mn   (substr ang (+ pos 2) 2)
	sec  (rtos (/ (atof (substr ang (+ pos 4) 4)) 100.) 2 2)
	)
  (setvar "angdir" 0)
  (setq	str_ang
	 (cond ((and (zerop (atof grad)) (zerop (atof mn)))
		(strcat sign sec "''"))
	       ((and (zerop (atof grad)) (not (zerop (atof mn))))
		(strcat sign mn "'" sec "''"))
	       ((and (not (zerop (atof grad))) (zerop (atof mn)))
		(strcat grad "%%d" mn "'" sec "''"))
	       (T (strcat grad "%%d" mn "'" sec "''"))
	       )
	)
  ;; return value
  (list
    str_ang
    (atof grad)
    (atof mn)
    (atof sec)
    )
  )

;; TesT:
(print
(list
(grmnsec 10.155678)
(grmnsec -0.055678)
(grmnsec 10.005678)
(grmnsec 0.005678)
(grmnsec -10.005678)
(grmnsec -0.005678)))
~'J'~
fixo вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Функция перевода из вещественного значения в строку.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение разбитого на слова текста Mist AutoCAD 46 24.05.2020 21:08
DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов) Supermax Библиотека функций 20 14.03.2018 10:05
DwgRuLispLib: Преобразование значения в строку Кулик Алексей aka kpblc Библиотека функций 26 06.12.2007 19:30
структурированный список Holon Программирование 22 11.09.2007 14:09