Функция, вычисляющая расстояние между городами - Lisp

Узнай цену своей работы

Формулировка задачи:

Предположим, что у имени города есть свойства х и у, которые содержат коор- динаты места нахождения города относительно некоторого начала координат. Напишите функцию (РАССТОЯНИЕ a b), вычисляющую расстояние между го- родами а и b. Как это сделать?

Решение задачи: «Функция, вычисляющая расстояние между городами»

textual
Листинг программы
CL-USER 10 > (setf (get 'saratov 'x) -200)
-200
 
CL-USER 11 > (setf (get 'saratov 'y) 800)
800
 
CL-USER 12 > (setf (get 'moskow 'x) 0)
0
 
CL-USER 13 > (setf (get 'moskow 'y) 0)
0
 
CL-USER 16 > (defun dist (c1 c2)
  (let ((x1 (get c1 'x))
        (y1 (get c1 'y)) 
        (x2 (get c2 'x))
        (y2 (get c2 'y)))
   (sqrt (+ (expt (- x1 x2) 2) (expt (- y1 y2) 2)))))
DIST
 
CL-USER 19 : 1 > (dist 'moskow 'saratov)
824.62116

Объяснение кода листинга программы

  1. Первая строка устанавливает значение переменной saratov:x равное -200.
  2. Вторая строка устанавливает значение переменной saratov:y равное 800.
  3. Третья строка устанавливает значение переменной moscow:x равное 0.
  4. Четвертая строка устанавливает значение переменной moscow:y равное 0.
  5. Шестнадцатая строка определяет функцию dist с четырьмя свободными параметрами c1, c2, которые должны быть ассоциативными массивами с полями x и y.
  6. Семнадцатая строка объявляет начало блока let, который выполняет следующие действия: — Восемнадцатая строка получает значение поля x для города c1. — Девятнадцатая строка получает значение поля y для города c1. — Двадцатая строка получает значение поля x для города c2. — Двадцать первая строка получает значение поля y для города c2.
  7. Восемнадцатая строка блока let вычисляет гипотенузу прямоугольного треугольника с основанием, равным разности значений полей x двух городов, и высотой, равной произведению значений полей y двух городов.
  8. Двадцать первая строка блока let извлекает квадратный корень из результата, полученного на предыдущем шаге.
  9. Последняя строка вызывает функцию dist с аргументами 'moscow и 'saratov и выводит результат 824.62116.

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы