Определить "качество успеваемости", т.е процент студентов, сдавших все экзамены на 4 и 5 - Lisp
Формулировка задачи:
Объясните пожалуйста как работает программа. Имеется список студентов с информацией об итогах сессии, в котором указаны фамилия, номер группы, оценки по трем предметам. Определить "качество успеваемости", т.е процент студентов, сдавших все экзамены на 4 и 5.
(defstruct stud fam gr pr1 pr2 pr3) ==>STUD (setq x (cons (make-stud :fam 'Valeev :gr '41-4 :pr1 5 :pr2 '4 :pr3 '5) (cons (make-stud :fam 'Petrov :gr '22-6 :pr1 4 :pr2 '2 :pr3 '4) (cons (make-stud :fam 'Ivanov :gr '22-6 :pr1 3 :pr2 '4 :pr3 '5) nil)))) ==>(#S(STUD :FAM VALEEV :GR |41-4| :PR1 5 :PR2 4 :PR3 5) #S(STUD :FAM PETROV :GR |22-6| :PR1 4 :PR2 2 :PR3 4) #S(STUD :FAM IVANOV :GR |22-6| :PR1 3 :PR2 4 :PR3 5)) (defun ysp (el) (and (> (stud-pr1 el) 2) (> (stud-pr2 el) 2) (> (stud-pr3 el) 2))) ==>YSP (defun kach (x kvo kvy) (cond ((eq x nil) (list kvo kvy)) ((ysp (car x)) (kach (cdr x) (+ kvo 1) (+ kvy 1))) (t (kach (cdr x) (+ kvo 1) kvy)))) ==>KACH (setq vk (kach x 0 0)) ==>(3 2) (/ (car (cdr vk)) (car vk)) ==>2/3
Решение задачи: «Определить "качество успеваемости", т.е процент студентов, сдавших все экзамены на 4 и 5»
textual
Листинг программы
(defstruct stud fam gr pr1 pr2 pr3) ;; определение структуры stud с полями fam, gr, pr1,pr2,pr3 (setq x ;; создание списка из трех студентов (cons (make-stud :fam 'Valeev :gr '41-4 :pr1 5 :pr2 '4 :pr3 '5) (cons (make-stud :fam 'Petrov :gr '22-6 :pr1 4 :pr2 '2 :pr3 '4) (cons (make-stud :fam 'Ivanov :gr '22-6 :pr1 3 :pr2 '4 :pr3 '5) nil)))) ;; Функция, возвращающая t если студент сдал без неудов и nil - если двоечник (defun ysp (el) (and (> (stud-pr1 el) 2) (> (stud-pr2 el) 2) (> (stud-pr3 el) 2))) ;; рекурсивная функция, возвращающая список из двух чисел - студентов всего ;; и успевающих студентов (defun kach (x kvo kvy) (cond ((eq x nil) (list kvo kvy)) ;; конец рекурсии ((ysp (car x)) (kach (cdr x) (+ kvo 1) (+ kvy 1))) ;; очередной студент успевающий (t (kach (cdr x) (+ kvo 1) kvy)))) ;; очередной студент двоечник (setq vk (kach x 0 0)) ;; запуск kach ==>(3 2) ;; из трех успевают двое (/ (car (cdr vk)) (car vk)) ;; расчет процента ==>2/3 ;; получилось рациональное число. В Common Lisp деление довольно чудное. Чтобы получить процент, можно поступить так: (+ 0.0 (/ (car (cdr vk)) (car vk))) ==> 0.6666667
Объяснение кода листинга программы
В данном коде используется язык программирования Lisp. Вот что делает каждый элемент кода:
- (defstruct stud fam gr pr1 pr2 pr3) — определяет структуру данных stud с полями fam, gr, pr1, pr2, pr3.
- (setq x) — создает список из трех студентов, используя структуру stud.
- (defun ysp (el) (and (> (stud-pr1 el) 2) (> (stud-pr2 el) 2) (> (stud-pr3 el) 2)) — определяет функцию, которая возвращает t, если студент сдал все экзамены на 4 и 5, и nil в противном случае.
- (defun kach (x kvo kvy) (cond ((eq x nil) (list kvo kvy)) ((ysp (car x)) (kach (cdr x) (+ kvo 1) (+ kvy 1))) (t (kach (cdr x) (+ kvo 1) kvy))) — определяет рекурсивную функцию, которая возвращает список из двух чисел: студентов всего и успевающих студентов.
- (setq vk (kach x 0 0)) — запускает функцию kach.
- (/ (car (cdr vk)) (car vk)) — вычисляет процент студентов, сдавших все экзамены на 4 и 5. Таким образом, данный код определяет структуру данных stud, создает список из трех студентов, использует рекурсивную функцию для подсчета количества успевающих студентов и вычисляет процент студентов, сдавших все экзамены на 4 и 5.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д