#Лабораторная работа №2# ##Решение рекурсивных задач в функциональном стиле##
Цель работы: Знакомство с представлением рекурсивных структур данных в функциональных языках на примере списков
Задание: Дан поток студентов. Он представлен в виде списка, состоящего из элементов типа student. Полями этого типа являются:
- name — имя студента
- surname — его фамилия
- sex — пол
- day, month, year — дата его рождения
- group — номер группы
- iq — коэффициент IQ
Также есть другие три списка. Они состоят из фамилий и имён студентов, посещающих занятия по французскому, дискретной математике и
программированию соответственно. Фамилия и имя объединены в пару. Т.е. список выглядит так: [("Алексей", "Гронский"), ("Мария", "Иванова")]
.
Тип и списки оформлены в виде модуля и находится в файле Students.hs
. Ваша программа, использующая этот модуль может выглядеть как-то так:
import Students
main = do
putStrLn "Список имён студентов:"
mapM_ putStrLn $ map (\(pos, st) -> show pos ++ "). " ++ name st) $ zip [1..] students
##Варианты заданий:##
- Составить список списков из студентов одинакового возраста (можно рассматривать год рождения), отсортированный по количеству людей. Пример: [["Новиков", "Шишкова", "Ширанков"], ["Петров", "Васечкин"], ["Дементьева"], ["Сидоров"]]
-
- Распределить студентов по 4 равным группам так, чтобы средний показатель IQ (сумма IQ каждого студента в группе) для групп был примерно одинаковым;
- Распределить студентов по 6 равным группам по показателю IQ (в первой группе участники с наименьшим IQ, в последней — с наибольшим);
- Составить список студентов, посещающих занятия и по дискретной математике, и по французскому языку;
- Узнать, какие студенты посещают все три представленных предмета;
- Отсортировать список студентов по фамилии;
- В отсортированный по фамилии список добавить нового студента: {name="Василий", surname="Пупкин", sex='м', day=19, month=2, year=1991, group=313, iq=120};
- Удалить из списка всех студентов с фамилиями, начинающимися на букву «А»;
- Вычислить, какой предмет посещает больше всего студентов;
- Узнать, какое имя самое популярное (встречается больше всего раз);
- Вычислить средний возраст студентов;
- Узнать для каждой группы, кого в ней больше: мальчиков или девочек;
- Составить список студентов, посещающих занятия по программированию, но не посещающих занятия по дискретной математике;
- Отсортировать список студентов по интеллекту;
- Вывести отсортированный по группе список всех девочек, состоящий только из имени, фамилии и номера группы;
- «Записать» всех посещающих французский язык на программирование (каждый студент в списке посещающих программирование может быть записан только один раз);
- Для всех студентов, посещающих дискретную математику: если он записан на программирование, сделать так, чтобы на программирование он записан не был, и наоборот (если не записан, то записать);
- Узнать, есть ли на потоке студенты, празднующие день рождения в один день. И, если таковые имеются, вывести их фамилии;
- Увеличить у всех студентов номер группы на единицу в разряде сотен. (Пример: 331 → 431);
- Узнать, в каком диапазоне лежит iq студентов, какой коэффициент встречается чаще других, а также найти математическое ожидание этого распределения;
- Узнать, на какой месяц выпадает больше всего дней рождений;
- Создать для студентов, посещающих только один курс, новый курс «Философия»
- Добавить в список, представляющий курс дискретной математики, для каждого студента информацию о его возрасте;
- Разделить студентов по 4 спискам согласно номерам их групп;
- Узнать, сколько студентов в каждой группе ;
- Создать новый тип, в который бы входили поля: имя, фамилия, инициалы, группа; и создать новый список из объектов этого типа на основе существующего списка students;
- Найти не посещающих ни один курс студентов;
- Найти студентов, посещающих ровно два курса;
- Создать новый тип «Курс». Создать три объекта этого типа для курсов французского, дискретной математики и программирования на основе соответствующих списков;
- Отсортировать список студентов сначала по фамилии, а затем по группе.
###NB! Задания присылать как pull request'ы поддиректории с вашей программой.