Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ман по автолиспу.doc
Скачиваний:
4
Добавлен:
13.07.2019
Размер:
74 Кб
Скачать
☆
  1. Проверка значений на соответствие их допустимому диапазону:

Листинг 1.2 Запрос координат 2D точки, соответствующих допустимому диапазону.

(setq p1 (if p1 p1 (list 0 0)))

(setq szP1 (strcat “Enter point 1 <” (rtos (car p1)) “, ” (rtos (cadr p1)) “>:”))

(setq Paux (getpoint szP1))

(setq p1 (if Paux Paux p1))

(setq Xmin 12 Xmax 120 Ymin –300 Ymax 300)

(while (not (and (< Xmin (car p1))

(> Xmax (car p1))

(< Ymin (cadr p1))

(> Ymax (cadr p1))

)

)

(setq szP1 (strcat “Enter point 1 <” (rtos (car p1)) “, ” (rtos (cadr p1)) “>:”))

(setq Paux (getpoint szP1))

(setq p1 (if Paux Paux p1))

)

По сравнению с листингом 1.1 здесь добавлены строки инициализации диапазона допустимых значений координат 2D точки и цикл проверки их текущих значений на соответствие допустимому диапазону с требованием повторного ввода координат в случае недопустимых значений.

Первые 4 строки точно такие же, как и в листинге 1.1. Их подробное обсуждение см. в п.1.

Пятая строка задает (setq Xmin 12 Xmax 120 Ymin –300 Ymax 300) границы диапазона допустимых значений для каждой из координат 2D точки.

В шестой строке начинается цикл проверки текущих значений координат 2D точки на соответствие диапазону допустимых значений. К этому моменту координаты точки или заданы пользователем в ответ на первый вызов функции getpoint в строке 3, или сохранились без изменений с момента предыдущего исполнения программы (повторный вызов программы и пользователь отказался от ввода новых значений, нажав [Enter]), или проинициализированы значениями по умолчанию (0 0), заданными в строке 1 (первый вызов программы и пользователь отказался от ввода значений, нажав [Enter]). Цикл проверки реализован с помощью функции while. Она имеет следующий формат:

(while <условие> <выражение 1> [<выражение 2> …[<выражение N>]…])

В листинге 1.2 условие имеет следующий вид

(not (and (< Xmin (car p1)) (> Xmax (car p1)) (< Ymin (cadr p1)) (> Ymax (cadr p1))))

Здесь функции car и cadr извлекают координаты точки p1. Функции сравнения < и > сравнивают значения координат с границами диапазона, например, (< Ymin (cadr p1)) проверяет превышает ли значение ординаты точки p1 нижнюю границу Ymin диапазона допустимых значений. Функции сравнения возвращают логические значения T или nil.

Функция and определяет есть ли выход текущих значений координат за какую-либо из границ диапазона, т.е. есть ли хотя бы одно значение nil, возвращенное какой-либо из функций сравнения. Если есть выход за границы диапазона, то функция and возвращает значение nil, которое инвертируется в T с помощью функции not. В этом случае, когда условие равно T, происходит переход к выполнению тела цикла, позволяющего пользователю повторно ввести значения. Запрос повторного ввода будет продолжатся до тех пор, пока пользователь не задаст точку находящуюся в пределах указанного диапазона.

Если при вычислении условия было получено значение nil, т.е. обе координаты точки оказались в пределах диапазона допустимых значений, тело цикла не выполняется и от пользователя не требуется повторного задания точки.