Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей - Lisp
Формулировка задачи:
Помогите, пожалуйста!!
Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей. Предусмотреть возможность выдачи адреса по введенной фамилии.
Решение задачи: «Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей»
textual
Листинг программы
- (defstruct person-address
- first-name
- (second-name nil)
- last-name
- city
- street
- building
- (apartment nil))
- (defmethod print-object ((a person-address) stream)
- (with-slots (first-name second-name last-name city street building apartment) a
- (format stream "[Address of~a~a~a:~a,~a~a~a]"
- (fmt first-name)
- (fmt second-name)
- (fmt last-name)
- (fmt city)
- (fmt street "street")
- (fmt building "building")
- (fmt apartment "apartment"))))
- (defparameter *friends*
- (vector
- (make-person-address
- :first-name "Sherlock"
- :last-name "Holmes"
- :city "London"
- :street "Baker Street"
- :building "221B")
- (make-person-address
- :first-name "Mycroft"
- :last-name "Holmes"
- :city "London"
- :street :unknown
- :building :unknown
- :apartment :unknown)
- (make-person-address
- :first-name "John"
- :second-name "H"
- :last-name "Watson"
- :city "London"
- :street "Baker Street"
- :building "221B")))
- (defun fmt (x &optional key)
- (cond
- ((null x) "")
- ((eq x :unknown) (format nil " (unknown ~a)" key))
- (t (format nil " ~a" x))))
- (defun find-friends-by-last-name (ln)
- (loop :for address :across *friends*
- :when (string= (person-address-last-name address) ln)
- :collect address))
- (defun test (&rest last-names)
- (dolist (ln last-names)
- (format t "Request for last name ~a:~%" ln)
- (let ((xs (find-friends-by-last-name ln)))
- (if (null xs)
- (format t " Not found~%")
- (dolist (x xs)
- (format t " ~a~%" x))))
- (terpri)))
- (defun main ()
- (test "Holmes")
- (test "Watson")
- (test "Moriarty"))
Объяснение кода листинга программы
- Сначала определен тип данных person-address с помощью функции defstruct, который содержит информацию о месте жительства человека.
- Затем определен метод print-object для вывода информации о структуре person-address на экран.
- Далее определен параметр friends, который содержит вектор структур person-address с информацией о местах жительства нескольких друзей.
- Для удобства работы с этим вектором, определена функция fmt, которая форматирует строку с информацией о месте жительства.
- Также определена функция find-friends-by-last-name, которая ищет в векторе friends структуры person-address с заданной фамилией.
- В функции test происходит вызов функции find-friends-by-last-name с переданными в качестве аргументов именами фамилий.
- Если функция find-friends-by-last-name не находит ни одной структуры person-address с заданной фамилией, выводится сообщение
Not found
. - Если найдены структуры person-address с заданной фамилией, они выводятся на экран с помощью функции format.
- В функции main происходит вызов функции test с аргументами
Holmes
,Watson
,Moriarty
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д