Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей - Lisp

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

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

Помогите, пожалуйста!! Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей. Предусмотреть возможность выдачи адреса по введенной фамилии.

Решение задачи: «Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей»

textual
Листинг программы
  1. (defstruct person-address
  2.   first-name
  3.   (second-name nil)
  4.   last-name
  5.   city
  6.   street
  7.   building
  8.   (apartment nil))
  9.  
  10. (defmethod print-object ((a person-address) stream)
  11.   (with-slots (first-name second-name last-name city street building apartment) a
  12.     (format stream "[Address of~a~a~a:~a,~a~a~a]"
  13.             (fmt first-name)
  14.             (fmt second-name)
  15.             (fmt last-name)
  16.             (fmt city)
  17.             (fmt street "street")
  18.             (fmt building "building")
  19.             (fmt apartment "apartment"))))
  20.  
  21. (defparameter *friends*
  22.   (vector
  23.    (make-person-address
  24.     :first-name "Sherlock"
  25.     :last-name  "Holmes"
  26.     :city       "London"
  27.     :street     "Baker Street"
  28.     :building   "221B")
  29.    (make-person-address
  30.     :first-name "Mycroft"
  31.     :last-name  "Holmes"
  32.     :city       "London"
  33.     :street     :unknown
  34.     :building   :unknown
  35.     :apartment  :unknown)
  36.    (make-person-address
  37.     :first-name  "John"
  38.     :second-name "H"
  39.     :last-name   "Watson"
  40.     :city        "London"
  41.     :street      "Baker Street"
  42.     :building    "221B")))
  43.            
  44.          
  45.  
  46. (defun fmt (x &optional key)
  47.   (cond
  48.     ((null x)        "")
  49.     ((eq x :unknown) (format nil " (unknown ~a)" key))
  50.     (t               (format nil " ~a" x))))
  51.  
  52. (defun find-friends-by-last-name (ln)
  53.   (loop :for address :across *friends*
  54.         :when (string= (person-address-last-name address) ln)
  55.         :collect address))
  56.  
  57. (defun test (&rest last-names)
  58.   (dolist (ln last-names)
  59.     (format t "Request for last name ~a:~%" ln)
  60.     (let ((xs (find-friends-by-last-name ln)))
  61.       (if (null xs)
  62.           (format t "  Not found~%")
  63.         (dolist (x xs)
  64.           (format t "  ~a~%" x))))
  65.     (terpri)))
  66.  
  67. (defun main ()
  68.   (test "Holmes")
  69.   (test "Watson")
  70.   (test "Moriarty"))

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

  1. Сначала определен тип данных person-address с помощью функции defstruct, который содержит информацию о месте жительства человека.
  2. Затем определен метод print-object для вывода информации о структуре person-address на экран.
  3. Далее определен параметр friends, который содержит вектор структур person-address с информацией о местах жительства нескольких друзей.
  4. Для удобства работы с этим вектором, определена функция fmt, которая форматирует строку с информацией о месте жительства.
  5. Также определена функция find-friends-by-last-name, которая ищет в векторе friends структуры person-address с заданной фамилией.
  6. В функции test происходит вызов функции find-friends-by-last-name с переданными в качестве аргументов именами фамилий.
  7. Если функция find-friends-by-last-name не находит ни одной структуры person-address с заданной фамилией, выводится сообщение Not found.
  8. Если найдены структуры person-address с заданной фамилией, они выводятся на экран с помощью функции format.
  9. В функции main происходит вызов функции test с аргументами Holmes, Watson, Moriarty.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы