Белеты по САПР 60-69


Билет№60
Использование переменных. Функции присвоения.
Если используются переменная, то ее значение м.б. число, NIL, строка текста, список и т.п. Для этой цели при множестве псевдофункций, которые помимо того, что имеют значения, обладают эффектом образования связи между символом и его значением. К псевдофункциям относятся SET, SETQ, (SETQ <символ_1> <S выражение> [<символ_2> <S выражение>]) символы – это переменные, S_выражения — символьные выражения. 
Действия: выполняются действие заданное S_выражением и результатом, возвращаемый им, становится текущим значением символа. Функция возвращает на экран результат последнего выражения.
(SETQ A 2.5)
(SETQ A 2 B 5 C 6) на экран выводится только 6, а заносится значение и в А и в В.
Если в функции SETQ, какой либо переменной присваивается значение, то его можно использовать из командной строки графического редактора системы AtuCad.
(SET <символ> <S-выражение>)
Если перед сиволом поставить апостроф (равносильно quote), то переменной будет занесно выражение, а не результат его.
(SET `A (+ 2 3))-(+ 2 3)
Использование SET позволить проверить более сложные операции, связанные с косвенным присвоением символа.
(SET A 10)
(SET `B `A)-> B<>10, B=A.
Для ввода значений переменных используются функции семейства GET.
(GETINT [<подсказка>])
Создают паузу в программе и ждет ввода целого числа.
(GETINT “\n введите базовую точку:”)
(GETREAL [<подсказка>])
Для ввода действительного числа
(GETSRING [<элемент>][<подсказка>])
функция делает паузу и ожидает ввода строки символов, определенной параметром элемента. Если он присутствует и не обращен в NIL, то окончание операции будет при нажатии ENTER. Если же элемент отсутствует, то окончание операции – первый пробел после строки символов.
(GETPOINT [<точка>][<подсказка>]) функция ввода точки.
Создает паузу и ожидает ввода точки, которая может быть введена путем указания на экране или с клавиатуры. Если аргумент <точка> задан, то при перемещении курсора на экране будет тянуться «резиновая» нить:
(GETDIST [<точка>][<точка>]) создает паузу и ожидает ввода расстояния, которое может быть задано тремя способами:
1. как действительное число с клавиатуры
2. путем задания 2-х точек
3. путем указания 2-ой точки при наличии аргумента <точка>
Возвращает результат – действительное число.

Билет№61
Функции, используемые при построении изображений.
Для использования AutoLisp при построении геометрических изображений (даже без участия пользователя) используются специальные функции. Базовым объектом при построении является точка которую можно задать в виде списка координат или через другую точку. Существуют и другие приемы:
1. Используемые функции
(POLAR <точка><угол><расстояние>) функция возвращает точку, находящуюся под определенным углом относительно другой точки на расстоянии L.
(SETQ P2 (POLAR P1 0.5 25))

2. Определение точки как места, пересечения двух отрезков
(INTERS <точка_1><точка_2><точка_3><точка_4>[<признак>]) функция находит пересечение отрезков (точка_1; точка_2) и (точка_3; точка_4) и возвращает найденную точку в виде списка координат. Если признак равен NIL, то будет определена точка пересечения линий бесконечной длины, наложенных на заданные отрезки. Если признак отсутствует или имеет другое значение, то точка пересечения находится внутри отрезка.
3. Определение положения точки с помощью
(ANGLE <точка_1><точка_2>) вычисляется угол между точкой_1, точкой_2 и осью ОХ.
4. (DISTANCE <точка_1><точка_2>)
(SETQ P3 (DISTANCE P1 P2))

Билет№62
Подпрограммы. Организация ветвлений. Логические функции.
Функции ветвления
(IF <условие><функция 1>[<функция 2>]) условие любое выражение. Функция 1 вычисляет значение условия, если оно не NIL. Если условие пусто, то выполняется функция 2
1)выполняется несколько действий в результате выполнения одного условия
(PROGN <выражение>…)
Объединяем последовательность функций в макрофункцию
(IF(AND
(EQUAL(GETVAR “GRIDMODE” “1”)
(EQUAL(GETVAR “SNAPMODE” ”0”)
(PROGN
(COMMAND “LIMITS” “0,0” “210,297” “”)
(PROMPT “\n Установлена форма A4”)
); end prong
);end if
3)Функция проверки нескольких условий
(COND (<условие1><выражение1>…)
(<условие2><выражение2>))
Вычисляем 1-е условие. Если оно выполняется, то вычисляется выражение1. Если уловие1 не выполняется то проверяется условие2.
(COND (=X 0)(SETQ Y 0)
(<X 0)(SETQ Y (-X2))
(>X 0)(SETQ Y (*Y2))
); end cond
логические функции
1. Логическая “И”
(AND <выраж.1>…) если все функции определены (не являются пустым списком), то результатом функции будет T. Если хотя бы одно равно NIL, то результат NIL.
(SETQ X “Вася” Z NIL F 5)
(AND X Z F) — > NIL
(AND X F) — > T
2. Логическая “ИЛИ”
(OR <выраж.1>…) если хоть одно выраж. Т, то результат – Т
(OR X Z F) — > T
3. Логическое “НЕТ”
(NOT <выраж.>…) функция возвращает Т, если аргумент NIL и наоборот.
(SETQ P1 `(10 20 30) P2 NIL P3 ( ))
(NOT P1) — > NIL
(NOT P2) — > T
(NOT P3) — > T

Билет№63
Организация циклов. Используемые функции.
Одной из трех базовых структур в любом языке программирования является цикл.
Нужно ясно понимать, что цикл выполняет двоякую функцию:
1. Выполнение одного и того же участка программы более одного раза;
2. Передача управления (под управлением понимается выполняемый в данный момент элемент программы) «назад» или «вверх» (т.е. ближе к началу программы).
Вторая функция цикла менее очевидна, чем первая, хотя в структурных языках и в Липе цикл — единственный способ передать управление назад.
Кстати, если необходимость многократного выполнения участка программы более-менее понятна (например, нам нужно нарисовать сотню окружностей), то необходимость возвратов в программе менее очевидна. Поэтому приведем хотя бы один простейший пример: пользователь вводит данные, программа что-то рисует, а затем пользователь смотрит на результат, ужасается увиденному и очень хочет повторить ввод. Вот здесь и придется возвращаться назад — к тому куску программы, который вводит данные.
Циклы в Лиспе, разумеется, обеспечиваются функциями. Простейшая из них — функция REPEAT вида
( REPEAT n f1 f2 … fm )
Здесь n — число повторений, а f1..fm — те функции, которые будут выполняться n раз.
В цикле REPEAT, в отличие от, например, цикла FOR..TO в Паскале, нет переменной, значение которой изменяется от 1 до n. Поэтому таким циклом не стоит решать задачи перебора элементов списка. Для этого существуют специальные функции.
Назначение цикла REPEAT — в основном решение задач отрисовки. Например, если деталь имеет повторяющиеся элементы, можно запросить у пользователя их количество, затем вычленить повторяющийся участок и отрисовать его нужное число раз.
В Лиспе цикл по условию задается функцией WHILE:
( WHILE c
f1 f2 … fm )
Здесь c — логическое условие. Цикл выполняется, пока это условие истинно.
В Лиспе нет цикла с переменной, которая меняется от min до max с заданным шагом. Между тем такие циклы есть практически во всех других языках программирования. В чем же дело? В том, что список — особая структура данных. Наиболее часто цикл с переменной нужен для прохода по всем элементам массива и их обработки (например, суммирования для нахождения среднего). В Лиспе для обработки каждого элемента списка предусмотрены два особых цикла: FOREACH и MAPCAR.
Рассмотрим цикл FOREACH:
( FOREACH name list exp )
Здесь name — имя переменной, в которую последовательно записываются элементы списка list, а exp — выражение Лиспа, выполняемое столько раз, сколько элементов есть в списке list.
Рассмотрим работу цикла на примере. Пусть нам нужно просуммировать все элементы списка data и записать сумму в переменную s. Делается это так:
; Обнуление суммы
( SETQ s 0 )
( FOREACH cur data ( SETQ s ( + s cur ) ) )
При выполнении этого фрагмента происходит следующее: берется список data, по очереди каждый его элемент, начиная с первого, записывается в переменную cur, после чего выполняется выражение
( SETQ s ( + s cur ) )
Функция FOREACH имеет одним из своих параметров не число или строку, а выражение Лиспа, поскольку оно является просто списком — еще одна возможность, отсутствующая в большинстве других языков.
Например, если нужно и сложить, и перемножить элементы списка, это можно сделать в одном цикле:
; Инициализация суммы и произведения
( SETQ s 0 p 1 )
( FOREACH cur data
( PROGN ( SETQ s ( + s cur ) )
( SETQ P ( * p cur ) )
)
)
В Лиспе нет возможности изменить значение отдельного элемента списка, хотя такая задача возникает довольно часто. Например, при масштабировании изображения нужно все элементы списка размеров size умножить на масштабный коэффициент k.
Существует элегантный способ сделать это при помощи функции MAPCAR. Ее общий вид:
( MAPCAR ‘f l1 l2 … ln )
MAPCAR выполняет функцию f поочередно над первыми, вторыми, третьими… элементами списков l1 .. ln. При этом n должно быть равно числу аргументов функции f, а все списки l1 … ln должны содержать одинаковое число элементов. Самое главное — функция возвращает список результатов выполнения функции f.
Перед функцией нужно ставить апостроф, потому что MAPCAR нужна просто ссылка на то место в памяти, где эта функция находится, а не результат выполнения этой функции.
( SETQ coeff NIL )
( REPEAT ( LENGTH size )
( SETQ coeff ( APPEND coeff ( LIST k ) ) )
);REPEAT

Билет№65
Функции для работы с числами (оценка, преобразования).
Преобразование типов: (N-число, S-строка)
ITOA N S Преобразует целое число N в его текстовое представление S. ( PROMPT ( ITOA 5 ) )
ATOI S N Преобразует текстовую строку S в целое число N. ( ATOI «4» )
RTOS N1 N2 N3 S Преобразует вещественное число N1 в текстовую сроку S. N2 — код формата числа (1 — научный; 2 — десятичный), N3 — точность (число знаков после запятой). ( RTOS 5.255467 1 3 )
ATOF S N Преобразует текстовую строку S в действительное число N. ( ATOF «3.141459» )

Билет№66
Функции проверки условий.
B – логическое значение (T или NIL)
= N1 N2 или S1 S2 B Проверка равенства двух чисел или строк ( = x 0.5 )
/= N1 N2 или S1 S2 B Проверка неравенства двух чисел или строк ( /= a «ABC» )
> N1 N2 или S1 S2 B Проверка «N1 больше N2» или «S1 больше S2»? ( > c ( + 3 d ) )
< N1 N2 или S1 S2 B Проверка «N1 меньше N2» или «S1 меньше S2»? ( < e 1 )
>= N1 N2 или S1 S2 B Проверка «N1 больше или равно N2» или «S1 больше или равно S2»? ( >= f 4.0 )
<= N1 N2 или S1 S2 B Проверка «N1 меньше или равно N2» или «S1 меньше или равно S2»? ( <= 5 a1 )

Билет№67
Функции для работы с текстом.
Ф-я записи строки на экран или в файл
(Write-Line<литера>[<дескриптор>])
(write-line “text”) -> “text”
Ф-я считывания символа
(read-char [<дескриптор>] – считывает из буфера ввода клавиатуры или из файла заданного дескриптором. Возвращает соответствующий Asci код символа. Если введено несколько литер, после чего нажимается Enter, то ф-я считывает первую из них и возвращает на экран. При очередном вызове – следующий символ.
Ф-я считывания строки
Read-line [<дескриптор>]
Функция считывает строку с клавиатуры или текстового файла
Ф-я выделения 1го аргумента
Read <литерал>
Ф-я не используется непосредственно для считывания информации, но применяется для её обработки. Возвращает 1ый аргумент – список или символ, при этом литерал не должен содержать пробелы.
(Read “12.5 13”) -> 12.5
Вывод на печать явл. Частным случаем вывода в файл.
(write “prn” F1). Файл д.б. предварительно открыт перед первым обращением и закрыт после последнего.

Билет№69
Функции для программирование управляющих структур и процедур.
(AL-атом или список, V-имя переменной, E-выражение АвтоЛиспа)
DEFUN

S [AL1 … ALN] [/ V1 … VM] AL Создание пользовательской функции с именем S, аргументами AL1 … ALN (могут отсутствовать) и локальными переменными V1 … VM(также могут отсутствовать, тогда знак «/» не ставится) ( FUN myfunc ( a / n )
( SETQ a ( + a 10 ) )
)
IF E1 E2 [E3] NIL Вычисляется выражение E1. Если оно истинно (не NIL), то выполняется выражение E2, иначе — E3 ( IF ( = a b )
( PRINT «\nA=B» )
( PRINT «\nA<>B» )
)
PROGN E1 .. EN EN Объединяет несколько выражений в одно для использования в функции IF, если в ветвях «то» или «иначе» нужно выполнить более одной функции.. ( IF ( = a 0 )
( PROGN
( SETQ a 1 )
( PROMPT «\nA=0» )
)
)
REPEAT N E1 [… EN] EN Выражения E1 .. EN циклически выполняются N раз ( REPEAT 10 ( PRINT «\n» )
)
WHILE E1 E2 [… EN] EN Выражения E2 .. EN (тело цикла) выполняются до тех пор, пока E1 не NIL. ( WHILE ( <= i 10 )
( SETQ i ( + i 1 ) )
)

Загрузка...