Структуры: определить номер курса, на котором наибольший процент мужчин - Lisp
Формулировка задачи:
Решение задачи: «Структуры: определить номер курса, на котором наибольший процент мужчин»
> (defstruct student surname name fathername gender age course) STUDENT > (defun st-lst (n) (cond ((= n 0) nil) (t (cons (make-student :surname (read) :name (read) :fathername (read) :gender (read) :age (read) :course (read)) (st-lst (- n 1)))))) ST-LST > (defun man (x) (cond ((eq x nil) nil) ((eq (student-gender (car x)) 'm) (cons (student-course (car x)) (man (cdr x)))) (t (man (cdr x))))) MAN > (defun f (a x &optional (p 0)) (cond ((eq x nil) p) (t (if (equal a (car x)) (f a (cdr x) (+ p 1)) (f a (cdr x) p))))) > (defun max-f (x &optional (n 0) z) (cond ((eq x nil) z) ((> (f (car x) x) n) (max-f (cdr x) (f (car x) x) (car x))) ((max-f (cdr x) n z)))) > (max-f (man (st-lst 5))) a a a m 19 1 b b b m 20 1 c c c w 19 2 d d d w 18 2 e e e m 19 2 1
Объяснение кода листинга программы
В коде используется язык программирования Lisp. Он определяет структуру данных студент
с полями: фамилия, имя, отчество, пол, возраст, курс.
Затем определяется функция st-lst
, которая запрашивает ввод 5 студентов и возвращает список из них.
Далее определена функция man
, которая принимает список студентов и возвращает список курсов, на которых учатся мужчины.
Затем определена функция f
, которая принимает список студентов и номер студента в списке и возвращает номер курса, на котором учится мужчина. Если номер студента больше списка, то возвращается 0.
Далее определена функция max-f
, которая принимает список студентов и номер студента в списке и возвращает номер курса, на котором учится мужчина с наибольшим процентом. Если номер студента больше списка, то возвращается 0.
В конце кода вызывается функция max-f
с аргументом man(st-lst 5)
, где она получает список студентов, состоящий из 5 элементов, и возвращает номер курса, на котором учится мужчина с наибольшим процентом. В данном случае возвращается 1.