Программа по составлению расписания занятий в ВУЗе

в 5:03, , рубрики: c++, Программирование, составление расписаний, метки:

Решил выложить описание и свою программу по составлению расписаний от 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

* - обязательные к заполнению поля