Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д