Решил выложить описание и свою программу по составлению расписаний от 2001 года. В моём ВУЗе, на сегодняшний день, ей пользуются практически все крупные факультеты. Вкратце: она может быть и редактором и составлять расписание полностью автоматически или частично для выбранных элементов, сохраняет свои данные в формате Microsoft Access 2000, экспорт расписания групп, преподавателей и аудиторий в виде таблиц Microsoft Excel 2000 и сама написана с использованием MFC 4.2.
Мое глубокое убеждение, что создать программу по составлению расписания для ВУЗов и заработать на ее распространении невозможно, если у Вас нет лапы там наверху и все ВУЗы просто не обяжут ее покупать. Но разработав общее для всех ядро, программисты «на местах» смогут это сделать в той или иной степени.
Думаю, этот топик, с точки зрения разработки всем известной задачи, будет интересен для прочтения практически всем.
Немножко истории
До 2001 года писал только программы связанные с научными вычислениями. Программирование графического интерфейса пользователя только смотрел, но не было реальных задач. Аналогично не учил, я по образованию механик, специализировался в аэрогидродинамике, и не знал ничего о СУБД, как построить с ними соединение или как сделать экспорт в Microsoft Excel. Не буду описывать все возникающие на работе пертурбации, но в их результате в совершенно инициативном порядке решил написать программу по составлению расписаний. Я понимал, что те программисты, которые есть в моей организации, ее никогда не сделают реально работающей, из-за ее довольно сложной логики. Для меня же был риск в программировании интерфейса пользователя, работа с СУБД и т.д. Поскольку испытываю просто патологическое неприятие продуктов фирмы Borland (опыт 3-х летний работы), решил ориентироваться на Microsoft. Linux-ом пользовался уже до этого 3-4 года, но там в тот момент времени не было стандартного GUI и нужно было бы ставить его на рабочие
места, что еще большая проблема. Разработка заняла реального времени примерно 2 месяца. При написании, из-за сложной логики, очень активно использовались Тройки Хоара. Ниже описание самой программы и мои предложения.
Начальные сведения
Программа предназначена для автоматизации процесса составления расписаний занятий в ВУЗах. Она обладает во-первых, возможностью редактирования расписания, а во-вторых его автоматической достройки. Интерфейс программы копирует стандартный проводник Windows. Это, кроме удобства представления информации на экране компьютера, позволяет пользоваться программой без специальной подготовки.
Основные возможности:
- составляет расписание на две недели с учетом «четных-нечетных»;
- имеется возможность гибкой настройки смен;
- составление расписания для занятий в разных корпусах расположенных далеко друг от друга;
- позволяет делит группы на различные типы подгрупп, например по иностранным языкам и по занятием в компьютерных классах;
- объединять в группы другие группы и подгруппы, например в потоки или в общую лекцию по иностранному языку;
- поддерживает произвольное разбиение аудиторий по типу проводимых занятий;
- в одной аудитории имеется возможность проведения занятий разного типа;
- совместное использование аудиторий;
- учет пожеланий преподавателей;
- составление расписания с учетом, например заседаний ученого совета или заседания кафедры;
- быстрый поиск свободной аудитории;
- поиск свободного времени преподавателей, например для проведения заседания кафедры;
- поиск свободного времени групп, например для проведения дополнительного занятия;
- внесения изменений в уже построенное расписание;
- экспорт расписания групп, преподавателей и аудиторий в виде таблиц Microsoft Excel;
- имеет открытый формат хранения данных в виде базы данных Microsoft Access, что позволяет организовать экспорт/импорт данных в другие программы;
- не имеет ограничений к распространению внутри учебного заведения купившего программу; (я в конце расскажу как обойти мою защиту)
- размер дистрибутива программы, включающего в себя программу, файл справки и пример полного расписания факультета, умещается на одной дискете 3,5 дюйма.
- база данных большего вуза в архивированным также может быть размещена на одной дискете 3,5 дюйма.
Выдержанная идеология программы позволяет реализовать гораздо больше возможностей.
Условия приобретения
Данная программа условно бесплатна. Платным является занесение в базу данных программы аудиторий (я в конце расскажу как обойти мою защиту). Это позволяет организовать эффективную защиту программы и не ограничивает её использование внутри учебного заведения.
Организационная структура
Типы окон и переходы между ними
Программа состоит из четырех базовых окон:
- предметов
- групп
- преподавателей
- аудиторий
Переход между окнами может быть осуществлен с помощью меню.
Или с помощью панели инструментов, выбирая иконку нужного окна кликом левой кнопки мыши.
Панель инструментов можно включить с помощью меню.
Окно предметов
Окно предметов состоит из 5 областей. Первая область представляет собой собственно предметы, объединенные с помощью папок в иерархическую структуру.
С каждым предметом связаны проводимые по нему занятия. Они представлены окном занятий.
Ниже расположены связанные с выделенным занятием три окна, в которых находятся группы, преподаватели и аудитории.
Окно групп
Окно групп состоит из 2 областей. Первая область представляет собой собственно группы, объединенные с помощью папок в иерархическую структуру и ссылок на группы, также представленные с помощью папок в виде иерархии.
Справа от окна групп находится расписание занятий связанное с выделенной группой.
Окно преподавателей
Окно преподавателей также состоит из 2 областей. Первая область представляет собой собственно преподавателей, объединенные с помощью папок в иерархическую структуру и ссылок на преподавателей, также представленные с помощью папок в виде иерархии.
Справа от окна преподавателей находится расписание занятий связанное с выделенным преподавателем.
Окно аудиторий
Окно аудиторий состоит из 2 областей. Первая область представляет собой собственно аудитории, объединенные с
помощью папок в иерархическую структуру и ссылок на аудитории, также представленные с помощью папок в виде иерархии.
Справа от окна аудиторий находится расписание занятий связанное с выделенной аудиторией.
Ввод данных
Ввод предметов
Предметы группируются в папки, например по курсам:
Создание и редактирование папок и предметов проводится с использованием контекстного меню. Для этого необходимо
нажать правую кнопку мыши на выделенном элементе. Для копирования, перемещения и создания ссылок можно использовать контекстное меню или перетаскивая выбранный элемент мышкой. Если при перетаскивание нажать Ctrl, то если возможно будет создана копия элемента. В любой папке элементы упорядочиваются по
алфавиту. Два разных элемента в папке не могут иметь одинаковое название. Если печатное название отсутствует, то
выбирается в качестве печатного само название.
Ввод занятий
Создание занятий возможно с помощью контекстного меню. Выделенный предмет в соседнем окне задает название занятия.
После создания занятия (или занятий) с ним можно связать группу, преподавателя и аудитории (папку аудиторий) закрепленных за занятием. Связь устанавливается с помощью перетаскивания из расположенных ниже окон групп, преподавателей и аудиторий.
При этом принимаются следующие правила. При перетаскивании папок проведение занятие устанавливается для для всех групп и преподавателей входящих в перетаскиваемые папки. Папка же аудиторий задает закрепленные за занятием предметы. При составлении расписания будет выбрана одна из аудиторий в папке.
Двойной клик мыши, нажатие клавиш Enter или пробел приведут к выделению в нижних окнах связанных с занятием групп, преподавателей и аудиторий. Аналогичные изменения происходят также в связанных с
ними окнами групп, преподавателей и аудиторий.
Замечание
С занятием необязательно связывать группы, преподавателей и аудитории. Любой из этих элементов может отсутствовать. Например неизвестно имя преподавателя, который будет проводит занятие.
Ввод групп
Группы можно условно разделить на два больших множества:
- Папку с названием «Группы», которая содержит группы и разбиение их на подгруппы;
- Папку с названием «Группы по предметам», которая содержит группы согласно их занятиям.
Рекомендуется организовать первую папку дублируя фактически организацию групп и подгрупп на факультете. При таком подходе достигается однозначность информации, а также имеется возможность легко поиска нужной группы. Например:
В отличии от аудиторий и преподавателей, папки окрашенные в синий цвет означают разбиение на подгруппы.
Папка с названием «Группы по предметам» содержит элементы четырех типов:
- собственно папки, раскрашенные в красный цвет, в отличии желтых и синих в предыдущем случае;
- ссылки на папки групп, разбиения и подгруппы, они имеют добавленные к своим иконкам иконки ссылки.
Ссылки позволяют группировать группы согласно их занятиям.
Создание и редактирование папок и групп проводится с использованием контекстного меню. Для этого необходимо нажать правую кнопку мыши на выделенном элементе. Для копирования, перемещения и создания ссылок можно использовать контекстное меню или перетаскивая выбранный элемент мышкой. Если при перетаскивание нажать Ctrl, то если возможно будет создана копия элемента.
В любой папке элементы упорядочиваются по алфавиту. Два разных элемента в папке не могут иметь одинаковое название. Если печатное название отсутствует, то выбирается в качестве печатного само название. Печатное название папки добавляется к имени группы.
Ввод преподавателей
Преподавателей можно разделить на две большие группы:
- Папку с названием «Преподаватели», которая содержит преподавателей согласно основному месту работы;
- Папку с названием «Преподаватели по предметам», которая содержит преподавателей согласно занятий.
Рекомендуется организовать первую папку дублируя фактически организацию преподавателей в подразделения (кафедра,
факультет). При таком подходе достигается однозначность информации, а также имеется возможность легко поиска нужного преподавателя. Например:
Папка с названием «Преподаватели по предметам» содержит элементы трех типов:
- собственно папки, раскрашенные в красный цвет, в отличии желтых в предыдущем случае;
- ссылки на папки преподавателей и ссылки на преподавателей, они имеют добавленные к своим иконкам иконки ссылки.
Ссылки позволяют группировать преподавателей согласно их назначению или если они проводят вместе одно занятие. Например можно объединить заведующих кафедр в одну папку и назначить для них занятие «заседание ученого совета».
Создание и редактирование папок и преподавателей проводится с использованием контекстного меню. Для этого необходимо нажать правую кнопку мыши на выделенном элементе. Для копирования, перемещения и создания ссылок можно использовать контекстное меню или перетаскивая выбранный элемент мышкой. Если при перетаскивание нажать Ctrl, то если возможно будет создана копия элемента. В любой папке элементы упорядочиваются по алфавиту. Два разных элемента в папке не могут иметь одинаковое название. Если печатное название отсутствует, то выбирается в качестве печатного само название. Печатное название папки добавляется к имени преподавателя.
Ввод аудиторий
Аудитории также можно условно разделить на две большие группы:
- Папку с названием «Аудитории», которая содержит аудитории согласно их местоположению;
- Папку с названием «Аудитории по предметам», которая содержит аудитории согласно их использованию.
Рекомендуется организовать первую папку дублируя фактически физическое расположение аудиторий. При таком подходе
достигается однозначность информации, а также имеется возможность легко поиска нужной аудитории. Например:
Данная возможность отсутствует в программе в связи с защитой от несанкционированного использования (я в конце расскажу как обойти мою защиту).
Папка с названием «Аудитории по предметам» содержит элементы трех типов:
- собственно папки, раскрашенные в красный цвет, в отличии желтых в предыдущем случае;
- ссылки на папки аудиторий и ссылки на аудитории, они имеют добавленные к своим иконкам иконки ссылки.
Ссылки позволяют группировать аудитории согласно их назначению. Например аудитория имея ссылку в папке «Практические» может использоваться для проведения практических занятий и имея ссылку в папке «Лекционные» может использоваться для чтения спецкурсов. В результате можно создавая папки с нужным названием с имитировать любые свойства находящихся в ней аудиторий.
Создание и редактирование аудиторий и объединение их в папки запрещено в программе в связи с защитой от несанкционированного использования(я в конце расскажу как обойти мою защиту). Имеется возможность лишь
внесения изменений в комментарий.
Аудитории, переходы между которыми можно выполнить за перемену можно консолидировать. По умолчанию все аудитории консолидированы. Создание и редактирование папок проводится с использованием контекстного меню. Для этого необходимо нажать правую кнопку мыши на выделенном элементе. Для копирования, перемещения и создания ссылок можно использовать контекстное меню или перетаскивая выбранный элемент мышкой. Если при перетаскивание нажать Ctrl, то если возможно будет создана копия элемента.
В любой папке элементы упорядочиваются по алфавиту. Два разных элемента в папке не могут иметь одинаковое название. Если печатное название отсутствует, то выбирается в качестве печатного само название. Печатное название папки добавляется к имени аудитории. Например печатное название «9 к. » добавится ко всем печатным именам аудиторий в «9 корпусе».
Структура данных
Структура данных представлены в виде SQL совместимого с Microsoft Access.
CREATE TABLE T_audience (
[index] INTEGER NOT NULL PRIMARY KEY,
is_folder BIT NOT NULL,
name VARCHAR(60) NOT NULL,
print_name VARCHAR(30) NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_audience([index])
ON UPDATE CASCADE ON DELETE CASCADE,
consolidate INTEGER NOT NULL REFERENCES T_audience([index])
ON UPDATE CASCADE ON DELETE CASCADE,
cipher BINARY(60),
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_audience_link (
[index] INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(60) NOT NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_audience_link([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_link_audience (
link INTEGER NOT NULL REFERENCES T_audience([index])
ON UPDATE CASCADE ON DELETE CASCADE,
owner INTEGER NOT NULL REFERENCES T_audience_link([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT owner UNIQUE(link, owner)
)
CREATE TABLE T_forbid_audience (
[day] TINYINT NOT NULL,
par TINYINT NOT NULL,
num_den BIT NOT NULL,
link INTEGER NOT NULL REFERENCES T_audience([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT forbid UNIQUE([day], par, num_den, link)
)
CREATE TABLE T_teacher (
[index] INTEGER NOT NULL PRIMARY KEY,
is_folder BIT NOT NULL,
name VARCHAR(60) NOT NULL,
print_name VARCHAR(30) NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_teacher([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_teacher_link (
[index] INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(60) NOT NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_teacher_link([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_link_teacher (
link INTEGER NOT NULL REFERENCES T_teacher([index])
ON UPDATE CASCADE ON DELETE CASCADE,
owner INTEGER NOT NULL REFERENCES T_teacher_link([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT owner UNIQUE(link, owner)
)
CREATE TABLE T_forbid_teacher (
[day] TINYINT NOT NULL,
par TINYINT NOT NULL,
num_den BIT NOT NULL,
link INTEGER NOT NULL REFERENCES T_teacher([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT forbid UNIQUE([day], par, num_den, link)
)
CREATE TABLE T_group (
[index] INTEGER NOT NULL PRIMARY KEY,
is_folder BIT NOT NULL,
is_separation BIT NOT NULL,
name VARCHAR(60) NOT NULL,
print_name VARCHAR(30) NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_group([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_group_link (
[index] INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(60) NOT NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_group_link([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_link_group (
link INTEGER NOT NULL REFERENCES T_group([index])
ON UPDATE CASCADE ON DELETE CASCADE,
owner INTEGER NOT NULL REFERENCES T_group_link([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT owner UNIQUE(link, owner)
)
CREATE TABLE T_forbid_group (
[day] TINYINT NOT NULL,
par TINYINT NOT NULL,
num_den BIT NOT NULL,
link INTEGER NOT NULL REFERENCES T_group([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT forbid UNIQUE([day], par, num_den, link)
)
CREATE TABLE T_subject (
[index] INTEGER NOT NULL PRIMARY KEY,
is_folder BIT NOT NULL,
name VARCHAR(60) NOT NULL,
print_name VARCHAR(30) NULL,
comment VARCHAR(255) NULL,
owner INTEGER NOT NULL REFERENCES T_subject([index])
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT name UNIQUE(name, owner)
)
CREATE TABLE T_lesson (
owner INTEGER NOT NULL REFERENCES T_subject([index])
ON UPDATE CASCADE ON DELETE CASCADE,
type TINYINT NOT NULL,
num_den BIT NOT NULL,
lenght TINYINT NOT NULL,
is_group TINYINT NOT NULL,
[group] INTEGER,
is_teacher TINYINT NOT NULL,
teacher INTEGER,
is_aud_aside TINYINT NOT NULL,
aud_aside INTEGER,
nda TINYINT,
[day] TINYINT,
par TINYINT,
audience INTEGER,
staging BIT
)
Это был мой первый опыт создания реляционной БД.
Составление расписания
Настройка параметров
Настройка параметров влияющих на составление расписания осуществляется в главном меню.
Данные параметры можно динамически изменять. Например если не удается составить расписание без окон у преподавателей, можно их разрешить.
Выбор команды составить приведет к автоматическому составлению расписания для всех непоставленных занятий. Просмотр не поставленных занятий осуществляется аналогичным пунктом меню. Удалить все автоматически поставленные занятия командой очистить. Занятия поставленные в ручную должны очищаться в ручную.
Варианты составления
Выбор команды составить приведет к автоматическому составлению расписания для всех не поставленных занятий. Просмотр не поставленных занятий осуществляется аналогичным пунктом меню. Удалить все автоматически поставленные занятия командой очистить. Занятия поставленные в ручную должны очищаться в ручную. Рекомендуется следующая тактика составления расписания. Сначала расставляются вручную занятия, постановка которых в расписание наиболее проблематична. Как правило это связанно с загруженностью аудиторного фонда, но возможно и с конкретным преподавателем или группой. Например занятия, которые связанны с потоковыми лекциями или занятиями в компьютерном классе. Затем происходит автоматическая достройка расписания при максимально выстроенных параметрах. Если не все занятия были поставлены, то просмотрев не поставленные и ослабив параметры составления можно попробовать достроить расписание. Если и это не помогает, можно выборочно очистить некоторые поставленные занятия, сделав возможным постановку не
поставленных, а затем попробовать поставить удаленные из расписания занятия. Красными кружками отмечены запреты на определенные пары. Они могут быть по аудиториям, группам и преподавателям.
Составление расписания для предметов
Расписание для предметов можно составлять автоматически. Все операция вызываются контекстным меню, вызываемым
правой кнопкой мыши.
При данном на примере вызове будет сгенерированно расписание для 1 курса.
Составление расписания для занятий
Расписание для конкретного занятия можно составлять в ручную. Все операция вызываются контекстным меню, вызываемым правой кнопкой мыши.
Составление расписания для групп
Расписание для групп можно составлять в ручную или автоматически. Для каждой группы можно задать запреты. Все операция вызываются контекстным меню, вызываемым правой кнопкой мыши.
Следующее меню составляет расписание автоматически для всех групп и подгрупп входящих выделенную папку.
Сохранение расписания в таблицах Excel
Экспорт расписания осуществляется для выделенного элемента, например кафедры или папки 1 курса, через главное меню. Расписание соответственно сохраняется по группам преподавателям и аудиториям. Их названия присваиваются соответствующим листам Excel.
Как обойти защиту
Защита основана на шифровании аудиторий поэтому программа содержит два exe-шника. Одним, как следует из его названия, нужно занести все аудитории, а затем пользоваться вторым.
Мои предложения
В 2002 исходники были потеряны, проблема с компьютером, но нисколько не жалею об этом. Я стараюсь жить по принципу: обращай вред в пользу. Меня давно просят усовершенствовать программу, но я страшно загружен по науке. Поскольку я бедный ученый, то должен эпизодически подрабатывать на
стороне. Научные гранты это копейки и я их трачу только на командировки, на зарплату просто бессмысленно. На этой задаче толком не заработаешь, а время она отнимет много.
Поэтому предлагаю следующие решение (набросок).
- GUI на PyQt или PySide
- СУБД PosgreSQL (у меня здесь готово примерно на 80%), в ней кроме самого расписания еще заявки и нагрузка преподавателей, учебные планы и еще много чего (с этой целью опубликую один или несколько топиков)
- web интерфейс на CherryPy+Cheetah (но это может обсуждаться)
- экспорт всяких отчетов (расписаний, карточек учебных поручений и т.д.) в формате ODF (ГОСТ Р ИСО/МЭК 26300-2010. Госстандарт России (01.06.2011)) посредством ODFPY
- алгоритмы от меня
- постановка от меня
- для заинтересованных работа над общим ядром
- для заинтересованных адаптация под собственный ВУЗ и возможность гибко все менять, жизнь идет, а чиновники не дремлют
PS. По результатом обсуждения буду менять содержание топика.
Автор: bya