Процент успеваемости и средний балл в ведомости - Lisp
Формулировка задачи:
Имеется ведомость с экзамена на группу учеников:
<Фамилия>((<Предмет 1>,<Оценка>),....(<Предмет 4>,<Оценка>)).
Определить по каждому предмету процент успеваемости и средний балл.
Вывести на экран соответствующую ведомость.
Решение задачи: «Процент успеваемости и средний балл в ведомости»
textual
Листинг программы
(defun avg-mark (fname)
(let ((mat 0)
(phy 0)
(inf 0)
(n 0))
(iter (for stri in-file fname)
(when (> (strlen stri) 0)
(setq n (+ n 1))
(let* ((p (strInd stri "("))
(s (strMid stri p))
(l (input s)))
(iter (for a in l)
(cond ((eq (car a) 'мат) (setq mat (+ (cadr a) mat)))
((eq (car a) 'физ) (setq phy (+ (cadr a) phy)))
((eq (car a) 'инф) (setq inf (+ (cadr a) inf))))))))
(printsline "+------+------+------+")
(printsline "| Мат | Физ | Инф |")
(printsline "+------+------+------+")
(printsline (strCat "| " (format (/ mat (+ 0.0 n)) "0.00") " "
"| " (format (/ phy (+ 0.0 n)) "0.00") " "
"| " (format (/ inf (+ 0.0 n)) "0.00") " |"))
(printsline "+------+------+------+") 'OK))
Объяснение кода листинга программы
В данном коде на языке Lisp реализована функция avg-mark, которая вычисляет средний балл по трём предметам (мат, физ, и инф) в ведомости. Список переменных и их значения:
- fname - имя файла с ведомостью
- mat, phy, inf - переменные для хранения суммарного количества баллов по каждому предмету
- n - переменная для хранения общего количества баллов Код функции:
- Создаются четыре переменные mat, phy, inf и n со значением 0.
- Выполняется итерация по каждой строке в файле с ведомостью.
- Если длина строки больше 0, то увеличивается значение переменной n на 1.
- Для каждой строки выполняется итерация по каждому предмету (мат, физ, и инф).
- Если значение текущего предмета равно 'мат, то к переменной mat прибавляется значение следующего элемента в строке.
- Если значение текущего предмета равно 'физ, то к переменной phy прибавляется значение следующего элемента в строке.
- Если значение текущего предмета равно 'инф, то к переменной inf прибавляется значение следующего элемента в строке.
- После завершения итерации по всем строкам файла, выводится шаблон ведомости с названиями предметов и значениями переменных mat, phy и inf.
- Выводится средний балл по каждому предмету, рассчитанный как отношение суммы баллов к общему количеству баллов.
- Выводится средний балл по всем предметам, рассчитанный как отношение суммы баллов по всем предметам к общему количеству баллов.
- Функция возвращает значение 'OK.