3. ОСНОВЫ ГРАФИЧЕСКОГО ЯЗЫКА АВТОЛИСП .Часть 4. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3.3.15. Ветвления и логические функции Функция (IF <условие> <выражение1> [выражение2]) вычисляет значение условия, и если оно не NIL, то выполняет <выражение1> , иначе - выполняет [выражение2], если оно присутствует. Функция IF возвращает результат выполнения функции. Таким образом, функция IF соответствует управляющим структурам псевдокода ЕСЛИ-ТО-ИНАЧЕ или ЕСЛИ-ТО. Для записи условий чаще всего используются логические функции. К ним относятся следующие функции: = (равно); < (меньше); > (больше); /= (не равно); <= (меньше или равно); >= (больше или равно). Эти функции позволяют выполнять сравнение чисел или текстов. Кроме выше приведенных функций, применяются функции AND, OR, NOT, позволяющие задать сложные условия. Все логические функции возвращают одно из двух значений: NIL ("нет", условие не выполняется) или Т ("да", условие выполняется). Функция (= <атом> <атом>...), если все атомы равны между собой, возвращает Т, иначе – NIL. Функция (/= <атом> <атом>), если атомы не равны между собой, возвращает Т, иначе - NIL. Функция имеет только два аргумента. Функция (< <атом> <атом>…), если каждый предыдущий атом меньше последующего, возвращает Т, иначе – NIL. Функция (<= <атом> <атом>…), если каждый предыдущий атом меньше последующего или равен ему, возвращает Т, иначе – NIL. Функция (> <атом> <атом>…), если каждый предыдущий атом больше последующего, возвращает Т, иначе – NIL. Функция (>= <атом> <атом>…), если каждый предыдущий атом больше последующего или равен ему, возвращает Т, иначе - NIL Для текстовых констант сравнение “больше” “меньше” производится по первой не совпадающей букве. "Меньшим" считается тот символ, ASCII-код которого меньше. Для букв алфавита коды нарастают в алфавитном порядке отдельно для заглавных и строчных букв. Функция (AND <выражение>...) выполняет операцию логического 'И' над списком выражений. Функция AND возвращает NIL, если хотя бы одно выражение имеет значение NIL, иначе возвращается Т. Функция (OR <выражение>...) выполняет операцию логического 'ИЛИ'. Функция OR возвращает Т, если хотя бы одно выражение имеет значение не NIL, иначе возвращается NIL. Функция (NOT <выражение>) выполняет операцию логического 'НЕ'. Функция NOT возвращает Т, если выражение имеет значение NIL, иначе возвращается NIL. Например:
3.3.16. Организация циклов Функция (WHILE <условие> <выражение>…) вычисляет выражения, пока значение условия не станет NIL. WHILE возвращает последнее значение конечного выражения. Таким образом, функция WHILE соответствует структуре псевдокода ПОКА-ЦИКЛ. Приведенная ниже программа выводит на экран пять раз надпись “Loop-While” и возвращает число 6 – последнее значение конечного выражения (1+ TEST). ; Программа цикла WHILE
Функция (REPEAT <целое число> <выражение> ...) вычисляет выражения заданное число раз аргументом <целое число> и возвращает последнее вычисленное значение. Аргумент <целое число> должен быть положительным. Например:
В результате вычислений значение A= 60, B = 100, и возвращается 100 - последнее вычисленное значение B. 3.3.17. Функции программирования управляющих структур Функция(COND (<условие1> <выражение1>…)…) выполняет выбор из нескольких вариантов, заменяя многократное использование функции IF. Обычно последним по умолчанию условием используется переменная (истина) T. Ниже приведен пример использования функции COND: при вводе символа Y или y возвращается “ДА!”, иначе, выводится “НЕТ”:
Функция (PROGN [выражение]...) последовательно вычисляет каждое выражение и возвращает последнее вычисленное значение. Функция PROGN является вспомогательной. Например, PROGN можно использовать совместно с функцией IF, если необходимо, чтобы при выполнении <условия> вычислялись несколько последовательных функций. Например:
Если введенные значения переменных A и B равны, то выводится текст A=B, курсор переводится на новую строку, к переменной A прибавляется 10, вычисляется произведение A на B, присваивается A, и возвращается результат произведения, иначе, при A ? B возвращается NIL. Например:
3.3.18. Функции обмена информации с файлами данных Для обмена данными между программами могут быть использованы файлы данных из различных программ Автолиспа, из программ, написанных на других языках, файлы данных, созданные другими средствами - текстовыми редакторами, СУБД. Например, программа расчета параметров изображения, написанная на универсальном языке программирования (Паскаль, С, ФОРТРАН и др.), может записать результаты расчета в файл данных, который затем будет использован в программе построения изображения на Автолиспе. Файл данных можно использовать для ввода исходных данных в программу вместо ввода в режиме диалога. Это целесообразно, когда при каждом запуске программы вводится большой объем данных. Функция (OPEN <имя файла> <режим>) открывает файл, указанный аргументом <имя файла>, для процедур, заявленных аргументом <режим>. Аргументы функции являются строковыми переменными. Данные записываются в отрытый файл только после его закрытия функцией CLOSE. Аргумент <режим> принимает следующие значения: "r" – открывается уже существующий файл для чтения, если такого файла нет, то функция возвращает NIL; "w" - файл открывается для записи, если файла с таким именем нет, то создается новый файл с указанным именем, если такой файл уже существует, то он заменяется новым файлом с тем же именем; "а" - файл открывается для добавления данных в конец файла, если такого файла нет, то он создается. Функция OPEN возвращает системное имя файла (дескриптор файла), которое с помощью функции SETQ можно присвоить переменной; в дальнейшем она может быть использована в процедурах ввода-вывода. Например: (SETQ DATA (OPEN "DET.DAT" "r")) ; Если существует файл DET.DAT возвращается его дескриптор <File: #2673c80>, иначе – NIL. Аргумент <имя файла> может включать путь к файлу, состоящий из строки “<дисковод>:<каталог>/<подкаталог>/<имя файла>.<расши-рение>”. Допускается в описании пути вместо прямого слеша (/) использовать обратный двойной слеш (\\). Например : (SETQ F (OPEN “C:/CAD/AutoCAD/Data/Det.Dat” “w”)) > <File: #2673b84>. Функция (CLOSE < дескриптор файла >) закрывает открытый файл. Работа с файлом по обмену данными должна начинаться его открытием функцией OPEN и заканчиваться закрытием функцией CLOSE. Например: Пусть в файл FD.DAT необходимо записать сумму переменных A B C.
Функция (FINDFILE <имя файла>), если файл найден, возвращает путь и имя файла, иначе - NIL. Если в аргументе <имя файла> указано только имя файла, то его поиск производится в текущем каталоге Автокада. Например : (FINDFILE "FD.DAT") > "C:\\Program Files\\AutoCAD R14\\fd.dat". (FINDFILE "C:/CAD/AUTOCAD/DATA/FF.DAT") > NIL. 3.3.19. Вызов команд Автокада Функция (COMMAND “<имя команды>” [ <аргумент >...]) вызывает команду графического редактора Автокада [7-10, 13]. Аргумент <имя команды > - имя требуемой команды, определенной в данной версии Автокада. Если вызываемой командой предусмотрены аргументы, то их значения необходимо перечислить в последовательности, в которой они вводятся в команду в режиме диалога. В качестве аргументов могут использоваться выражения Автолиспа. При этом необходимо, чтобы значение, возвращаемое выражением, соответствовало тому значению, которого требует команда Автокада. В качестве аргументов могут быть заданы переменные, если значения этих переменных были ранее определены в программе. Такие значения необходимо заключать в кавычки. PAUSE в качестве аргумента обозначает переключение в режим графического диалога. Одной функцией COMMAND можно вызывать последовательно нескольких команд. Например: Программа вычерчивает квадрат 50x50 единиц со вписанной окружностью
3.3.20. Описание создаваемых функций пользователя В Автолиспе функции разделяются на три группы - встроенные, пользователя и функции других программ. Описание новой функции пользователя приводится до обращения к ней в программе. Для описания функции пользователя используется встроенная функция Автокада DEFUN. (DEFUN <имя функции>([<аргумент>…][ / <локальная переменная>…]) <выражение>…), где <имя функции> - цепочка символов; <аргумент>… - список аргументов, соответствующий данным, которые передают в функцию из программы при ее вызове; <локальная переменная >… -переменные, действующие только внутри описываемой функции; <выражение>… - любая запись, выполненная по правилам Автолиспа. Аргументы и локальные переменные могут отсутствовать, но скобки () после имени функции обязательны. Между именем функции и списком аргументов не должно быть пробелов, иначе имя функции считается переменной. Значение, возвращаемое функцией, присваивается переменной с именем функции. Например: ; Программа вычисления тангенса угла. ; Функция TAN : AR- аргумент функции; ; ANN, SI, CO – локальные переменные.
; Проверка условия деления на нуль
; Пример применения функции TAN (вычисление тангенса угла).
Функция (*ERROR* <сообщение>) определяется пользователем и выводит сообщение об ошибке в случаях, когда возникают условия для ее возникновения. Функция *ERROR* возвращает NIL . Например: (DEFUN *ERROR* (MSG) (PRINC "ERROR: ") (PRINC MSG) (PRINC)) Вызов функции (*ERROR* MSG ) выводит сообщение ERROR : Функция (LAMBDA <аргументы> <выражение>…) определяет функцию без имени, возвращает значение последнего выражения. Функция LAMBDA используется часто совместно с функциями APPLY и MAPCAR. Например : (APPLY '(LAMBDA (X Y Z) (/(+ Y Z)X)) '(5 25 15)) > 8; Если (SETQ CNT 0), то (MAPCAR '(LAMBDA (X) (SETQ CNT (1+ CNT)) (* X 5)) '(1 2 3)) > 5 10 15. Контрольные вопросы
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||