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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp Как узнать, что число четное

Autolisp Как узнать, что число четное

Ответ
Поиск в этой теме
Непрочитано 18.11.2010, 11:56 #1
Autolisp Как узнать, что число четное
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, подскажите как узнать, что число четное, т.е. я делю свое число на 2.0 и получаю в ответ, например, 99/2.0 = 44.5, 99,5/2.0 = 44.75, 100/2.0 = 50.0, делить числа буду в цикле, шаг изменения числа 0.5. Из этогой кучи мне нужно только четное число, т.е., которое делится на 2 без остатка. Как можно это сделать по-быстрому не перебирая ответ по символам и анализирую цифры после точки? Если так нельзя, то подскажите код перебора ответа...непонятно как делать(((
Просмотров: 4128
 
Непрочитано 18.11.2010, 12:25
1 | #2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Четными и нечетными могут быть только целые числа, так что первая проверка - целое число или нет:
Код:
[Выделить все]
(= (type num) (quote int))
Второе-четное число кратно 2:
Код:
[Выделить все]
(= (* 2 (/ num 2)) num)
Итого:
Код:
[Выделить все]
(defun evenp (num)
  (and (= (type num) (quote int))
       (= (* 2 (/ num 2)) num)
  ) ;_ end of and
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 18.11.2010, 12:34
1 | #3
dyr

Мы считаем, ...таем, ...таем!
 
Регистрация: 12.08.2008
Europe
Сообщений: 763


Делится на 2 без остатка.
__________________
The cat that walks by itself.
dyr вне форума  
 
Непрочитано 18.11.2010, 12:34
1 | #4
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Do$ Посмотреть сообщение
Четными и нечетными могут быть только целые числа
Подозреваю, что Zaghim нужно чтобы и число например 100.0 тоже считалось четным, тогда предлягяю такой вариант
Код:
[Выделить все]
(defun evenp (num)
  (= (rem num 2) 0) ;_ end of and
) ;_ end of defun
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 18.11.2010, 12:46
1 | #5
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Описание функции rem
Если с англицким туго
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 18.11.2010, 14:42
1 | #6
VVA

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


Еще вариант
Код:
[Выделить все]
;;Возвращает T если число четное
(defun isEven ( num )(zerop(logand num 1)))
(isEven 22) ;->T
(isEven 33) ;->Nil
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 18.11.2010, 14:59
1 | #7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Еще:
Код:
[Выделить все]
(defun ru-match-is-even	(i)
    ;;(ru-match-is-even 2) T
    ;;(ru-match-is-even 123) nil   
    ;;(ru-match-is-even 0) T   
    ;;(ru-match-is-even -1) nil   
    ;;(ru-match-is-even -2) T   
    (zerop (rem i 2))
)
ShaggyDoc вне форума  
 
Непрочитано 18.11.2010, 15:01
1 | #8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


необходимо обратить внимание на происхождение тестового числа, возможно оно не целое, например имеет погрешность в десятом знаке после запятой. На этот случай, стоит добавить некоторое округление, а уже потом проверку. Например безобидное выражение:
Код:
[Выделить все]
(rtos (- 100.1 4.1) 2 20)
возвращает совсем не целое число "96.00000000000001"
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 19.11.2010, 10:56
#9
Zaghim


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


В общем я как всегда извратился)
Код:
[Выделить все]
(setq data (rtos XYZtest 2 3))
      (setq maxs  (strlen data)
	    count 1
	    chrct 1
      );setq
      (while (< count maxs)
	(if (/= "." (substr data count 1))
	  (setq chrct (1+ chrct))
	  (setq	numb  (atof (substr data (1+ (- count chrct)) chrct))
		dlist (append dlist (list numb))
		chrct 1
	  );setq
	);if
	(setq count (1+ count))
      );while
      (setq numb  (atof (substr data (1+ (- count chrct))))
	    dlist (append dlist (list numb))
      );

      (setq dlist1 (nth 0 dlist))
      (if (= numb dlist1)
	(progn
          (setq zskl (nth 0 zskl))
	  (setq zosi (list zskl riskl))
	  (command "line" risdlo zosi "")
	)  
      )
В общем имея высотную отметку делим ее на 2 и потом смотрим на окончание если оно равно целой чайти, то значт оно четное, если не равно значит нет))))))
Zaghim вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp Как узнать, что число четное

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать длинну всех выделенных линий ? bdfy AutoCAD 33 21.05.2014 08:31
Как определить число посетителей одновременно пребывающих в торговом зале? Tyssen Архитектура 7 27.04.2010 16:20
ГОСТ Р 53231-2008 UnyqUm Поиск литературы, чертежей, моделей и прочих материалов 5 15.09.2009 14:41
Большое число знаков в "свойствах" Shoorup AutoCAD 18 06.08.2008 13:26