Skip to content

Instantly share code, notes, and snippets.

@attatrol
Last active May 10, 2016 17:31
Show Gist options
  • Save attatrol/dd45a87e4273359edb9b4ed30ec41f5d to your computer and use it in GitHub Desktop.
Save attatrol/dd45a87e4273359edb9b4ed30ec41f5d to your computer and use it in GitHub Desktop.
;;входная таблица
(setq marks '((Иванов ((Матан 2)(Физра 4)(ООП 5)(ФП 3)))
(Петров ((Матан 2)(Физра 4)(ФП 2)(ООП 2)))
(Уткин ((Физра 3)(ФП 5)(БД 2)(Матан 3)(ООП 4))
)))
;выводит список с именами всех студентов, которые получили определенну оценку markValue по предмету subject
;использует список-таблицу с инфой по студентам - table
(defun getPeopleWithMark(subject markValue table) (progn (setq result nil)
(loop for x in table do (if (hasMark subject markValue x)
(setq result (cons (car x) result))
nil))
result))
;; проверка на наличие пары предмет-оценка (subject markValue) в списке x некоторого студента
(defun hasMark(subject markValue x) (cond ((null x) nil)
((atom (car x)) (hasMark subject markValue (cadr x)))
((and (eql subject (caar x)) (eql markValue (cadar x))) T)
(T (hasMark subject markValue (cdr x)))))
;; предикат, истина, если атом x есть в списке l
(defun memp (x l) (cond ((and (atom l) (equal l x)) T)
((atom l) Nil)
((and(atom (car l)) (equal x (car l))) T)
((atom (car l)) (memp x (cdr l)))
(T (or (memp x (car l)) (memp x (cdr l))))))
;; формирует список существующих предметов
(defun getSubjects(table) (setq result nil) (loop for x in table do (loop for y in x do (cond ((atom y) NIL)
(T (loop for z in y do (if (memp (car z) result) NIL
(setq result (cons (car z) result)))))))) result)
;; формирует список из пар предмет-список_двоечников
(defun getBadStudents(table) (setq subjects (getSubjects table)) (getBadStudents2 table subjects))
(defun getBadStudents2 (table subjects) (cond ((null subjects) nil)
(T (append(list (car subjects) (getPeopleWithMark (car subjects) '2 table)) (getBadStudents2 table (cdr subjects))))))
;; пример использования
(getBadStudents marks) -> (БД (УТКИН) ФП (ПЕТРОВ) ООП (ПЕТРОВ) ФИЗРА NIL МАТАН (ПЕТРОВ ИВАНОВ))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment