- •; Програма 3. Квадрат з вписаним колом
- •Підпрограми, розгалуження і цикли. Логічні функції. Функції while і if.
- •; Програма 4. Обчислення тангенса
- •; Програма 5. Побудова сімейства квадратів:
- •2.5. Використання програм мовою Автолісп при роботі в системі AutoCad
- •3.5. Програмування керуючих структур. Функції cond, progn, repeat
Лекція 2_LISP Використання змінних. Функція SETQ. Функції GET.
Якщо при виконанні функції який-небудь аргумент представлений змінною, то цій змінній повинно бути раніше присвоєне значення (число, рядок тексту, список і ін.). Основний засіб для присвоєння значень змінних - функція SETQ:
(SETQ <змінна1> <вираз1> [<змінна2> < вираз2 >]...)
Приклади:
(SETQ A 10.0) ; записує 10 в А
(SETQ B ( + 1 2 3)) ; записує в B результат додавання
; 1,2 і 3, тобто 6
(SETQ А 1 В 2 С 3) ; записує 1 в А, 2 в B, З в С, .
; повертає значення 3
; Тому
(SETQ D (SETQ A 1 В 2 С 3)) ; записує 3 у D – повертає значення останнього виразу
Для введення значень змінних користувачем служать функції типу GET. До них відносяться:
GETINT - уведення цілого числа;
GETREAL - уведення речовинного числа;
GETSTRING - уведення рядка тексту;
GETPOINT - уведення точки;
GETDIST - уведення відстані;
GETANGLE - уведення кута і деякі інші функції.
Роботу функцій GETINT, GETREAL, GETSTRING розглянемо на прикладі функції GETINT, що у загальному виді виглядає так:
(GETINT [<підказка>])
Ця функція створює паузу у виконанні програми й очікує, поки користувач уведе з клавіатури ціле число. Функція повертає введене число. Необов'язковий аргумент < підказка > - це текстова константа. Якщо цей аргумент присутній, то під час паузи на екрані буде высвечиваться текст підказки.
Аналогічно записуються і діють функції GETREAL і GETSTRING.
(GETPOINT [ <крапка > ] [ <підказка > ])
Функція створює паузу й очікує введення крапки. Крапка може бути введена шляхом указівки на екрані або шляхом набору її координат на клавіатурі у виді X, Y. Функція повертає координати крапки (у виді списку - див. п. 2.4.). Аргумент < підказка > має той же зміст, що і для функції GETINT. Якщо задано аргумент <крапка>, то при переміщенні курсору на екрані буде відображатися "гумова лінія" від даної "опорної" крапки до поточного положення курсору.
(GETDIST [ < крапка >][< підказка > ])
Функція створює паузу й очікує уведення відстані. Відстань може бути зазначено трьома способами:
як дійсне число з клавіатури;
шляхом указівки двох крапок (буде визначена відстань між крапками);
шляхом указівки другої крапки при наявності аргументу < крапка >.
У двох останніх випадках між першою крапкою і поточним положенням курсору малюється "гумова лінія".
Функція повертає дійсне число, рівне уведеній відстані. Неважко бачити, що перший спосіб завдання відстані для користувача (і для програми) буде еквівалентний дії функції GETREAL.
Аналогічно записується і діє функція GETANGLE, що повертає кут (у радидианах) між прямій, заданої двома крапками, і віссю X.
Приклади:
; Програма 1. Побудова кола через режим команд AutoCAD в рядку COMMAND:
(SETQ PC (GETPOINT "\n Введіть центр кола:"))
; Введення центра кола
(SETQ R (GETDIST PC "\n Введіть радіус:"))
; Уведення радіуса
(COMMAND "CIRCLE" PC R)
; Коло з'являється на екрані
Але програма в такому вигляді невдала, тому що для її виконання прийдеться набирати рядок за рядком, введення рядків буде чергуватися з їхнім виконанням, а для повторного використання програми її прийдеться набрати заново. Реальний користувач так працювати не буде.
Остаточний варіант:
; Програма 2. Побудова кола через функцію ALISP:
(DEFUN KOLO () ; Ім'я описуваної функції
(SETQ PC (GETPOINT "\n Введіть центр:"))
(SETQ R (GETDIST PC "\nпВведіть радіус:"))
(COMMAND "CIRCLE" PC R)
) ; defun
Таку програму можна записати на диск, потім у будь-який час викликати з диска (докладніше про це див. у п. 2.5) і запустити на виконання, набравши (KOLO) у відповідь на запрошення ACAD. (Нагадаємо, символ "\n" у тексті підказок означає "переведення рядка").
; Програма 3. Квадрат з вписаним колом
(DEFUN CQUADR ( ) ; заголовок описуваної функції
; Задамо початкову точку - лівий нижній кут квадрата:
(SETQ P1 (GETPOINT "\n Початкова точка:”))
; Задамо довжину квадрата:
(SETQ L (GETDIST “\n Довжина сторони:"))
; визначимо три вершини квадрата, що залишилися:
(SETQ Р2 (POLAR P1 0.0 L))
(SETQ P3 (POLAR P2 (/ PI 2) L)) ; кут = PI/2
(SETQ P4 (POLAR P3 PI L)) ; кут = PI
; Побудуємо квадрат на екрані:
(COMMAND "LINE" P1 P2 РЗ Р4 "C")
; (Тут "С" задає опцію "Замикання")
;Визначимо радіус кола:
(SETQ R (/ L 2)) ;R = L/2
; Визначимо центр кола PC:
(SETQ PR (POLAR P1 0.0 R)) ;PR - точка торкання
; на нижній стороні
(SETQ PC (POLAR PR (/ PI 2) R))
; Побудуємо коло на екрані:
(COMMAND "CIRCLE" PC R) ) ; Кінець опису функції QUADR
) ; defun
Зверніть увагу на трохи незвичайне ім'я функції - C:QUADR. Символ "C:" дозволяє створити за допомогою функції QUADR нову команду AutoCAD ”QUADR”.
Підпрограми, розгалуження і цикли. Логічні функції. Функції while і if.
У будь-якій мові програмування є засоби для створення підпрограм, циклів, розгалужень у програмах у залежності від результатів перевірки умов. Такі засоби є й в Автоліспі.
Підпрограма дозволяє описати деяку послідовність дій один раз, а використовувати її в різних місцях програми і навіть включати в інші програми, що значно спрощує програмування.
Для цих цілей в Автоліспі служить вже відома функція DEFUN. Опис деякої функції за допомогою DEFUN і можна вважати підпрограмою, а звертання до описаної раніше функції - викликом підпрограми. При звертанні на місце символічних аргументів в описі функції підставляються значення цих змінних. Наприклад, описана в Програмі 1 функція SINCOS(A) може розглядатися як підпрограма. А рядок (SINCOS 0.0), який зустрічається в якій-небудь програмі, є звертанням до цій підпрограми, причому аргумент А приймає значення 0.
Розгалуження в програмі організуються за допомогою функції IF:
(IF <умова> <функція1> [<функція2>])
Тут < умова> - такий вираз Автоліспа, який серед інших значень може в якійсь ситуації одержати значення NIL.
Функція IF обчислює значення умови і, якщо воно не NIL, те виконує < функцію1 >, інакше - виконує <функцію2>, якщо та присутня. Функція IF повертає результат виконання функції. Таким чином, функція IF відповідає керуючій структурі псевдокоду ЯКЩО - ТО - ІНАКШЕ.
Для запису умов найчастіше використовуються функції, що назвемо логічними. До них відносяться функції
= (дорівнює) < (менше) > (більше)
/= (не дорівнює) < = (менше або дорівнює)
> = (більше або дорівнює),
які дозволяють виконувати порівняння чисел або текстів, а також функції AND, OR, NOT, що забезпечують можливість будувати складні умови з простих.
Усі ці функції можуть повертати одне з двох значень: NIL ("ні", умова не виконується) або Т ("так", умова виконується).
Наприклад, функція " = " має вигляд:
(= <атом> <атом>...)
Тут як атоми можуть стояти або числа (як цілі, гак і речовинні), або текстові дані. Функція повертає Т, якщо всі атоми рівні між собою, інакше - NIL.
Функція "/=" визначена тільки для двох атомів.
Функція "<":
(< <атом> <атом>...)
Якщо кожен попередній атом менше наступного, то повертається Т, інакше - NIL.
Аналогічно визначаються інші функції порівняння. Для текстових констант поняття "менше" означає наступне: порівняння виконується по першій літері. "Меншим" вважається той символ, ASCII-код якого менше. Для літер алфавіту коди наростають за абеткою (окремо для заголовних, окремо для малих літер).
Функції AND, OR, NOT є функціями алгебри логіки.
(AND <вираз> ...)
Функція виконує операцію логічного “І” над списком виразів, тобто функція повертає NIL, якщо хоча б один вираз має значення NIL. Інакше повертається Т.
(OR <вираз> ...)
Виконується операція логічного “АБО”. Повертається Т, якщо хоча б один вираз має значення Т, інакше - NIL.
(NOT < вираз >)
Виконується логічна функція “НІ”. Якщо вираз має значення NIL, то повертається Т, у всіх інших випадках повертається NIL.
Приклади:
Нехай маються .наступні значення:
А = 5
В = "ТЕХТ1”
С = NIL
Тоді
(= А 5) повертає Т
(= А 5.0) - Т
(>= A 10) - NIL
(< У “ТЕХТ2") -Т
(AND А В С) - NIL
(OR А В С)-Т
(NOT З) - Т
(OR(= A5)(= A 10))-Т
Наведена нижче Програма 4 ілюструє розгалуження за умовою з використанням функції IF.
