Организовать массив записей, содержащий информацию о месте жительства нескольких ваших товарищей - 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"))

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

  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
Похожие ответы