Третья строка выполняет запрос данных у пользователя. Функция getpoint выводит в зону подсказки содержимое строковой переменной szP1, информируя пользователя о требуемых действиях с его стороны и предлагая в угловых скобках значение по умолчанию. После этого функция getpoint ожидает действий пользователя. Если пользователь согласится со значениями по умолчанию, то он должен нажать клавишу [Enter]. Это действие будет воспринято как отказ от ввода данных и функция getpoint возвратит значение nil. Если пользователь не согласен со значением по умолчанию, то он должен указать точку с помощью мыши или ввести ее координаты с клавиатуры. В этом случае функция getpoint возвратит список с координатами введенной точки. Результат выполнения функции getpoint будет сохранен во вспомогательной переменной Paux.
В четвертой строке проводится анализ ответа пользователя. Если пользователь ввел значения координат точки в ответ на запрос функции getpoint, то они были сохранены в переменной Paux и, в случае подстановки этой переменной в качестве условия в функцию if, она будет трактоваться как значение T (истинно). Поскольку эта же переменная стоит в качестве выражения выполняемого в случае выполнения условия в функции if, то ее же значение и будет возвращено функцией if, а затем сохранено в качестве нового значения переменной p1. Если пользователь согласился со значениями по умолчанию, отказавшись от ввода других значений, то переменная Paux в качестве условия будет трактоваться как nil (ложно) и в качестве возвращаемого значения функции if будут переданы неизмененные координаты точки p1.
Таким образом, в зависимости от предыстории работы программы и действий пользователя в результате выполняемого фрагмента кода может реализоваться одна из трех ситуаций:
1) точка p1 инициализируется координатами 0,0;
2) точка p1 сохраняет свои координаты без изменений;
3) пользователь задает мышью или с клавиатуры новые значения координат точки p1.
Листинг 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. Она имеет следующий формат:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.