Calendar Calendar


Зайце Андрей

Показательная лабараторная работа
Структура хранения данных с организацией доступа по имени.
Таблицы на основе сбалансированных деревьев поиска.

Выполнил: Зайцев Андрей
ННГУ ВМК ПМиИ гр. 82-01 (2006г.)
Для связи: zai86@list.ru


Оглавление


Введение

В наши дни компьютеры используются повсеместно. На предприятиях, в магазинах, на складах и, конечно, дома. И в любом месте одной из основных задач, решаемых при помощи компьютеров, является задача хранения данных и организация доступа к ним.

С точки зрения программирования наиболее очевидным решением такого рода задач является использование структур по типу таблиц. В такой структуре данных как таблица данные хранятся в виде пары КЛЮЧ-ДАННЫЕ.

Рис. Таблица
Рис.: Таблица с доступом по имени

В данной лабараторной работе развивается идея разработки программы для хранения запланированных на какую-то дату событий. Таким образом ключом доступа в таблице будет дата проведения того или иного события, а данными будут сами события (их описания, параметры).

К оглавлению


Постановка задачи

Необходимо разаработать программу, обеспечивающую удобный и эффективный способ хранения, доступа и управления данными, ассоциированными с датами календаря.

Основные возможности программы:

Базой данных для хранения событий надо взять структуру типа таблицы с доступом по имени, основанную на деревьях поиска.

К оглавлению


Идеи по реализации программы

Как уже упоминалось ранее, за основу базы данных надо взять таблицы на деревьях поиска - это реализуемо, т.к. даты в качестве ключей могут легко и однозначно сравниваться между собой.

Рис. Дерево поиска
Рис.: Дерево поиска

Более того, для большей эффективности алгоритма поиска события в дереве в программе имеет смысл использовать сбалансированные деревья поиска. Такие деревья более равнораспределены по разным сторонам от головного звена, что практически исключает возможность наихудшей ситуации при поиске ключа.

Т.к. на одну дату в календаре может быть запланировано несколько событий (отличающихся по времени и не обязательно), то возникает необходимость связывать с одним ключом в таблице несколько событий. Для решения этой проблемы целесообразно использовать линейные односвязные списки, в которых будут храниться все события, запланированные на данный день, а в таблице по соответствующему ключу будет содержаться ссылка на необходимый линейный список.

Рис. Линейный список
Рис.: Линейный список

Т.о. ключами в таблице будут даты проведения событий, а сами события будут описаны отдельным классом. Параметрами события будут время его проведения, имя события (1 строка), текстовое содержание (может быть несколько строк).

Для дополнения программы функциональностью и оригинальностью с классом события связываются ещё два класса. Первый класс описвает форму специального типа, которая напоминает внешним видом стикер (такие бумажки, на которых многие люди записывают что-то и наклеивают их на холодильники, столы, мониторы). А второй - это так называемый "исполнитель". Объект этого класса содержит параметры команды исполнения, связанной с событием, и отвечает за исполнение этой команды. В программе надо реализовать три типа команд исполнения: показать (активировать) стикер, показать системное сообщение, выполнить командную строку.

Событие календаря
Рис.: Событие календаря

К оглавлению


Реализация

Построение программы

Класс, описывающий форму Стикера - Sticker.

Класс, описывающий Исполнитель для события - Runer.

Класс, описвающий само Событие - CEvent.

При реализации структуры для хранения событий - таблицы на основе дерева поиска, для удобства и гибкости кода необходимо разработать наследуемую иерархию классов. Начать нужно с самого абстрактного класса, предоставляющего основной пользовательский интерфейс практически любой таблицы - TableBase.
Затем - класс таблицы, построенной на дереве поиска - TableTree.
А после чего необходимо реализовать класс, описывающий таблицу на основе сбалансированного дерева поиска - TableTreeBalance.
В результате на основе последнего класса можно построить таблицу для хранения событий с использованием линейного списка, непосредственно необходимую в программе - TableDate.

Рис. Иерархия классов
Рис.: Иерархия классов

Взаимодействие классов можно представить так: Таблица хранит ссылки на События, которые включают в себя ссылки на Стикер и Исполнитель для данного события.

Рис. Взаимодействие классов
Рис.: Взаимодействие классов

Интерфейс программы

Интерфейс программы предельно прост, нагляден и оригинален. В главном окне имеется набор фильтров для отображения событий, набор кнопок для управления событиями, календарь и список отфильтрованных событий.

Окно добавления события помимо полей параметров содержит две функциональные кнопки "Готово" и "Отмена" для подтверждения или отмены добавления события в базу данных.

Окно стикера не отображается на панели задач, может быть закреплено поверх остальных окон. Кроме того у стикера можно изменить цвет фона и уровень прозрачности окна.

Специальным дополнением в интерфейсе программы является только окно просмотра таблицы, её текущего состояния. В этом окне отображается состояние таблицы в виде дерева и имеются кнопки управления непосредственно таблицей.

Рис. Снимок вида программы
Рис.: Снимок внешнего вида программы (Крупнее)

При закрытии основного окна программа не завершается, а сворачивается в трей (в угол рядом с часами windows). Для завершения работы программы надо нажать кнопку в главном окне "Закрыть календарь" или вызвать контекстное меню значка в трее и там выбрать пункт "Выход"

К оглавлению


Заключение

Разработанная программа отвечает всем требованиям, сформулированным при поставке задачи:

К оглавлению


P.S.

Дополнительное описание использованных структур и алгоритмов можно узнать из лекций Гергеля В.П. или других источников (например, книг по программированию).

Демонстрационную рабочую программу можно скачать здесь (для корректной работы требуется MS .NET Framework SDK v2.0, это можно бесплатно скачать с сайта компании Microsoft)

К оглавлению


ННГУ им. Лобачевского ВМК ПМиИ
zai© z-src®
Нижний Новгород
2006 г.