Определить "качество успеваемости", т.е процент студентов, сдавших все экзамены на 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. Вот что делает каждый элемент кода:

  1. (defstruct stud fam gr pr1 pr2 pr3) — определяет структуру данных stud с полями fam, gr, pr1, pr2, pr3.
  2. (setq x) — создает список из трех студентов, используя структуру stud.
  3. (defun ysp (el) (and (> (stud-pr1 el) 2) (> (stud-pr2 el) 2) (> (stud-pr3 el) 2)) — определяет функцию, которая возвращает t, если студент сдал все экзамены на 4 и 5, и nil в противном случае.
  4. (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))) — определяет рекурсивную функцию, которая возвращает список из двух чисел: студентов всего и успевающих студентов.
  5. (setq vk (kach x 0 0)) — запускает функцию kach.
  6. (/ (car (cdr vk)) (car vk)) — вычисляет процент студентов, сдавших все экзамены на 4 и 5. Таким образом, данный код определяет структуру данных stud, создает список из трех студентов, использует рекурсивную функцию для подсчета количества успевающих студентов и вычисляет процент студентов, сдавших все экзамены на 4 и 5.

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


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

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

7   голосов , оценка 3.571 из 5
Похожие ответы