Помощь в написании студенческих работ
Антистрессовый сервис

Проектирование системы обработки временных списков

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Для создания пользовательского интерфейса будем использовать Пакет Microsoft Foundation Classes (MFC). MFC — это библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путем использования богатого набора библиотечных классов. Библиотека MFC, как и её основной конкурент, Borland VCL, облегчает работу с GUI путем создания каркаса… Читать ещё >

Проектирование системы обработки временных списков (реферат, курсовая, диплом, контрольная)

Содержание ВВЕДЕНИЕ

1 Анализ предметной области

2 Объектно-ориентированное проектирование

3 Реализация Заключение Список использованных источников ПРИЛОЖЕНИЕ A Текст программы ВВЕДЕНИЕ На сегодняшний день компьютеры плотно вошли в повседневную жизнь человека, при их помощи решается широкий спектр задач. Эти задачи могут быть достаточно тяжелыми и неподвластными человеку (сложные вычисления, работа с большим объемом информации и другие), а также повседневные дела. Ежедневно человек сталкивается с необходимостью использования компьютера и это во многом упрощает его жизнь, так например использование электронной почты освобождает его от пересылки обычных писем, которые доходят до адресата во много раз медленнее.

В своей курсовой работе я попытаюсь спроектировать и реализовать обработчик временных списков событий на алгоритмическом языке С++ с использованием библиотек MFC (Microsoft Foundation Classes), в которой представлен широкий выбор классов для построения пользовательского интерфейса. По функциям эта система будет напоминать органайзер, в котором будет предоставлена возможность работы со списками событий. Использование данной системы позволит хранить и обрабатывать временные списки событий и представлять их в удобном для пользователя виде.

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

1. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ На первом этапе проектирования информационной системы необходимо выполнить анализ предметной области, т. е. определить объекты предметно области и связи между объектами.

Предметная область — временные списки событий. События задаются типом и временем наступления. Предметом автоматизации являются некоторые функции по работе с данными списками, которые предусматривают удобное представление для пользователя событий. Событие будет обладать следующими свойствами: тип, время наступления, а также сообщением, в котором поясняется что это за событие.

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

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

Рис. 1.1 Диаграмма вариантов использования Представленная выше диаграмма в дальнейшем может послужить основой для создания пользовательского меню.

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

Для того, чтобы просмотреть все события пользователь должен выбрать соответствующий пункт меню, после чего на экране появится форма просмотра всех событий. Для того чтобы события вывелись на экран пользователь должен нажать кнопку «Show». Для того чтобы закончить работу с данной формой нужно нажать кнопку «Cancel».

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

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

При запуске программа должна считывать сохраненные события из файла, а если он не найден, то сообщить об этом. Далее пользователю предоставляется возможность работы с приложением. После того как пользователь закончит работу (нажатие кнопки «exit») система должна сохранить все события в файл. В случае, если файл не найден создать новый.

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

Рис. 1.2 Диаграмма классов На диаграмме 1.2 изображен класс «event» и агрегирующий его vector с настроечным параметром на тип данных «event».

Класс «event» имеет три параметра в секции private. Первый параметр message типа String содержит дополнительную информацию о событии. Второй параметр type содержит информацию о типе события, который может быть трех видов: Deal (дело), Meeting (встреча) или Anniversary (годовшина). В секции public класса event содержится два метода: конструктор по умолчанию (event ()) и метод задания события (TO_SET ()).

Для реализации списка событий будем использовать шаблон vector. vector — это шаблон из стандартной библиотеки C++, реализующий динамический массив произвольного доступа. шаблон vector расположен в заголовочном файле. Как и все стандартные компоненты, он расположен в пространстве имен std. Данный интерфейс эмулирует работу стандартного массива C (например, быстрый произвольный доступ к элементам), а также некоторые дополнительные возможности, вроде автоматического изменения размера вектора при вставке или удалении элементов. Все элементы вектора должны принадлежать одному типу, в данном случае это event. Вектор может быстро выделять память, необходимую для хранения конкретных данных. Это особенно полезно для хранения данных в списках, длина которых может быть не известна до создания списка, а удаление (за исключением, быть может, в конце) необходимо редко. Вектор разрешает произвольный доступ; то есть на элемент вектора можно ссылаться так же, как на элемент массив (по индексу), что достаточно удобно в использовании. Есть несколько недостатков данного шаблона и один из них заключается в том, что вектор является неэффективными для удаления или вставки элементов в других местах, кроме конца, но при реализации данного проекта это не играет никакой роли.

2. ОБЪЕКТНО-ОРИЕНТИРВАННОЕ ПРОЕКТИРОВАНИЕ Компьютерная программа — это последовательность инструкций, предназначенная для исполнения устройством управления вычислительной машины. Эта последовательность инструкций может быть написана на любом из языков программирования и чем выше уровень языка, тем в более простой форме записывается одни и те же действия. Повышением степени абстракции программы называется процесс структурирования информации и выделение главной ее составляющей и отбрасывание несущественной. Для этого используют функции, собственные типы данных (структуры, классы и т. д.) и еще много разных методов.

Для реализации проекта будем использовать алгоритмический язык высокого уровня С++. Он поддерживает такие парадигмы программирования как процедурное программирование, модульность, раздельная компиляция, обработка исключений, абстракция данных, типы (объекты), виртуальные функции, объектно-ориентированное программирование, обобщенное программирование, контейнеры и алгоритмы, сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Являясь одним из самых популярных языков программирования, C++ широко используется для разработки программного обеспечения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (например, видеоигры). В книге «Дизайн и эволюция C++» Бьёрн Страуструп описывает принципы, которых он придерживался при проектировании C++. Эти принципы объясняют, почему C++ именно такой, какой он есть. Некоторые из них:

· Получить универсальный язык со статическими типами данных, эффективностью и переносимостью языка C.

· Непосредственно и всесторонне поддерживать множество стилей программирования, в том числе процедурное программирование, абстракцию данных, объектно-ориентированное программирование и обобщённое программирование.

· Дать программисту свободу выбора, даже если это даст ему возможность выбирать неправильно.

· Максимально сохранить совместимость с C, тем самым делая возможным лёгкий переход от программирования на C.

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

· Избегать особенностей, которые зависят от платформы или не являются универсальными.

· Никакое языковое средство не должно приводить к снижению производительности программ, не использующих его.

· Не требовать слишком усложнённой среды программирования.

Для создания пользовательского интерфейса будем использовать Пакет Microsoft Foundation Classes (MFC). MFC — это библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путем использования богатого набора библиотечных классов. Библиотека MFC, как и её основной конкурент, Borland VCL, облегчает работу с GUI путем создания каркаса приложения — «скелетной» программы, автоматически создаваемой по заданному макету интерфейса и полностью берущей на себя рутинные действия по его обслуживанию (отработка оконных событий, пересылка данных между внутренними буферами элементов и переменными программы и т. п.). Программисту после генерации каркаса приложения необходимо только вписать код в места, где требуются специальные действия. Каркас должен иметь вполне определенную структуру, поэтому для его генерации и изменения в Visual C++ предусмотрены мастера.

Кроме того, MFC предоставляет объектно-ориентированный слой оберток (англ. wrappers) над множеством функций Windows API, делающий несколько более удобной работу с ними. Этот слой представляет множество встроенных в систему объектов (окна, виджеты, файлы и т. п.) в виде классов и опять же берет на себя рутинные действия вроде закрытия дескрипторов и выделения/освобождения памяти.

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

Второй способ используется для добавления обработчиков оконных событий. Мастер создает внутри каркасов классов, связанных с окнами, специальные массивы — карты (оконных) сообщений (англ. message map), содержащие пары «ИД сообщения — указатель на обработчик». При добавлении/удалении обработчика мастер вносит изменения в соответствующую карту сообщений.

В настоящее время преобладающей парадигмой программирования является объектно-ориентированная, в которой в которой основными концепциями являются понятия объектов и классов. Объектно-ориентированное программирование основано на «трех китах» — трех важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм. Инкапсуляция есть объединение в единое целое данных и алгоритмов обработки этих данных. Полиморфизм — это свойство родственных объектов решать схожие по смыслу проблемы разными способами. Наследование есть свойство объектов порождать своих потомков. Объект — потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.

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

При проектировании системы был выделен класс event, который будет служить для хранения и обработки событий, а также будем использовать шаблон vector, который настроим на работу с типом event.

Рис 2.1 Уточненная диаграмма классов Класс event был описан в разделе анализа предметной области, но были добавлены некоторые методы: конструктор с параметрами, метод возвращающий тип события, метод возвращающий сообщение и метод возвращающий время наступления события, а также были перегружены оператор больше и оператор сравнения. Методы возвращающие сообщение и тип возвращают строку типа CString, а метод возвращающий время наступления события — структуру SYSTEMTIME. В конструкторе с параметрами первые шесть параметров (Y, M, D, H, Min, Sec) это переменные типа int, которые хранят информацию о времени наступления события (год, месяц, день, час, минута и секунда), остальные два — типа CString (the_type и the_message) хранят информацию о типе и подробном описании события соответственно.

В нашем проекте сравнение событий происходит по времени их наступления. Поэтому при перегрузке оператора больше (>) и оператора сравнения (==) сравнение происходило именно по времени наступления события. В использовании класса-шаблона vector ничего не изменилось.

Далее построим диаграмму прецедентов, опираясь на функции обеспечиваемые системой, но просмотр событий в заданном интервале времени и просмотр событий в конкретное время объединим в один прецедент — просмотр событий с заданными параметрами, под параметрами будем понимать заданный интервал времени и конкретное время.

Рис. 2.2 Диаграмма прецедентов Диаграммы видов деятельности и диаграмма прецедентов послужили основанием для создания пользовательского меню. Элементами пользовательского меню являются кнопки двух типов: menuitem (определяет конечный пункт меню) и popup (определяет пункт главного меню, автоматически вызывающий выпадающее подменю, которое может содержать подпункты типа menuitem и popup). Ниже представлена диаграмма спроектированного меню.

Рис. 2.3 Диаграмма пользовательского меню Для дальнейшего проектирования построим диаграммы для каждого прецедента.

Рис. 2.4 Диаграмма состояний для прецедента «запуск приложения»

Рис. 2.5 Диаграмма состояний для прецедента «просмотр событий с заданными параметрами»

Рис. 2.6 Диаграмма состояний для прецедента «получить количество событий c заданными параметрами»

Рис. 2.7 Диаграмма состояний для прецедента «закрыть приложение»

Рис. 2.8 Диаграмма состояний для прецедента «создание нового события»

Рис. 2.9 Диаграмма состояний для прецедента «просмотр всех событий»

Так же для каждого прецедента составим диаграмму последовательности.

Рис. 2.10 Диаграмма последовательности для прецедента «создание нового события»

Рис. 2.11 Диаграмма последовательности для прецедента «просмотр всех событий»

Рис. 2.12 Диаграмма последовательности для прецедента «просмотр событий с заданными параметрами»

Рис 2.13 Диаграмма последовательности для прецедента «получить количество событий с заданными параметрами»

Рис 2.14 Диаграмма последовательности для прецедента «запуск приложения»

Рис 2.15 Диаграмма последовательности для прецедента «закрыть приложение»

На этом проектирование заканчивается и можно приступать к реализации системы.

3. РЕАЛИЗАЦИЯ В результате проделанной работы была написана программа для обработки временных списков событий. Для того запуска программы необходимо выполнить файл course_project2.exe и на экране появится главное окно приложения.

событие список пользовательский интерфейс Рис 3.1 Главное окно приложения Чтобы создать новое событие нужно выбрать пункт меню «Новое событие», а затем «Создать новое событие». В результате появится формасоздания нового события.

Рис 3.2 Форма создания нового события Для добавления события в список нужно нажать кнопку «Add», при этом не обязательно заполнять все поля, тогда пустые автоматически заполнятся значениями по умолчанию. Для завершения работы с формой задания события нужно нажать кнопку «Cancel».

Для просмотра всех событий нужно выбрать пункт меню «показать события», а затем пункт «все». В результате появится форма вывода всех событий на экран.

Рис. 3.3 Форма вывода всех событий Для вывода событий на экран пользователь должен нажать кнопку «Show», а для завершения работы — кнопку «Cancel».

Чтобы просмотреть события в конкретный момент времени или в заданном интервале пользователь должен выбрать пункт меню «показать события», затем «C учетом времени», а затем «На заданный момент» и «В заданном интервале» соответственно.

Рис. 3.4 Форма вывода событий в заданный момент времени Рис. 3.5 Форма вывода событий в заданном интервале времени Следует отметить, что при поиске событий в конкретный момент времени следует вводить все параметры, так как сравнение происходит оператором равенства по всем полям, задающим время наступления, а заполнение пустых форм нулями может некорректно сказаться на результате. При задании интервала времени задание значений во всех полях следует производить по вертикали, т. е. начиная с поля «год» и заканчивая полем «секунда». Заполнение всех полей не является обязательным условием, но незаполненные вышестоящие поля могут некорректно сказаться на результате поиска.

В программе присутствует возможность просмотра только прошедших событий, для этого пользователю необходимо выбрать пункт меню «показать события», затем «C учетом времени», а затем «С начала». Для вывода событий на экран нужно нажать кнопку «Show», а для завершения работы с формой — кнопку «Cancel».

Рис. 3.6 Форма просмотра прошедших событий Пользователь может получить количество событий в заданный момент времени или в заданный интервал времени путем выбора пунктов меню «показать события», далее «происходили ли события», «в заданное время» и «в заданном отрезке» соответственно. Далее пользователю предлагается заполнить поля задания времени наступления события. Для вывода количества событий на экран пользователь должен нажать кнопку «Check», а для завершения работы с формой — кнопку «Cancel».

Рис. 3.7 Форма задания времени наступления Рис. 3.8 Форма задания временного интервала Рис. 3.9 Форма вывода количества событий При запуске программы все события загружаются из файла 1. bin, а при завершении работы программы записываются в него же. Если файл не существует, то при запуске приложения будет об этом сообщено, а при завершении работы файл будет создан.

ЗАКЛЮЧЕНИЕ

В данном курсовом проекте была спроектирована и реализована программа для обработки временных списков событий. Была использована объектно-ориентированная парадигма программирования, которая на сегодняшний день является наиболее совершенной и способствует лучшей управляемости проектом на всех стадиях разработки, тестирования и внедрения. Программа была написана на алгоритмическом языке С++ в среде разработки Microsoft Visual Studio 2008 с использованием библиотеки MFC (Microsoft Foundation Classes). Для описания проетирования был использован язык графического описания UML (Unified Modeling Language). Функциональные возможности данной программы могут быть легко расширен с помощью добавления в классы новых методов или изменения существующих.

1. Дейтел Х. М., Дейтел П. Дж. Как программировать на C++. Москва, издательство «Бином-Пресс», 2009 г.

2. Муравьев Г. Л., Хвещук В. И., Савицкий Ю. В., Мухов С. В. Основы создания windows — приложений в системе Microsoft visual studio C++ на базе библиотеки MFC, Брест 2008.

3. http://ru.wikipedia.org

Приложение, А Листинг программы:

//файл main. cpp

#include

#include

#include

#include

#include

#include «resource.h»

#include «event.h»

#include

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include

#endif

#include

using namespace std;

string str;

vector storage;

// ===== класс окна задания нового события =====================================

class SetNewDialog: public CDialog

{

public:

SetNewDialog (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){};

afx_msg void OnButtonAdd ();

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (SetNewDialog, CDialog)

ON_COMMAND (IDADD, OnButtonAdd)

END_MESSAGE_MAP ()

afx_msg void SetNewDialog: OnButtonAdd ()

{

CString Y, M, D, H, Min, S, type, mess;

GetDlgItem (IDC_COMBO1)->GetWindowTextW (type);

GetDlgItem (IDC_EDIT7)->GetWindowTextW (mess);

GetDlgItem (IDC_EDIT7)->SetWindowTextW (NULL);

GetDlgItem (IDC_EDIT1)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT1)->SetWindowTextW (NULL);

GetDlgItem (IDC_EDIT2)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT2)->SetWindowTextW (NULL);

GetDlgItem (IDC_EDIT3)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT3)->SetWindowTextW (NULL);

GetDlgItem (IDC_EDIT4)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT4)->SetWindowTextW (NULL);

GetDlgItem (IDC_EDIT5)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT5)->SetWindowTextW (NULL);

GetDlgItem (IDC_EDIT6)->GetWindowTextW (S);

GetDlgItem (IDC_EDIT6)->SetWindowTextW (NULL);

storage.push_back (event (_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S), type, mess));

}

// ===== класс окна вывода всех событий ================================

class ShowAllDialog: public CDialog

{

public:

ShowAllDialog (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){ };

afx_msg void OnButtonShow ()

{

CListBox *list=(CListBox *)(this->GetDlgItem (IDC_LIST2));

CFont *NeedFont=new CFont;

NeedFont->CreatePointFont (80,L" Courier New");

unsigned int i=0;

CString buf;

SYSTEMTIME st;

GetDlgItem (IDC_LIST2)->SetFont (NeedFont);

list->ResetContent ();

for (i=0;i

{

st=storage[i]. GetTime ();

buf.Format (_T («%-24.24s %4.4d/%-2.2d/%-2.2d/%-2.2d/%-2.2d/%-2.2d %15s»), storage[i]. GetMessage (), st. wYear, st. wMonth, st. wDay, st. wHour, st. wMinute, st. wSecond, storage[i].GetType ());

list->AddString (buf);

}

};

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (ShowAllDialog, CDialog)

ON_COMMAND (IDShow, OnButtonShow)

END_MESSAGE_MAP ()

// ===== класс окна вывода событий в конкретное время========================

class ShowEventsAt: public CDialog

{

public:

ShowEventsAt (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){};

afx_msg void OnButtonShow ()

{

SYSTEMTIME st;

CString Y, M, D, H, Min, S, buf;

unsigned int i=0;

CFont *NeedFont=new CFont;

CListBox *list=(CListBox *)(this->GetDlgItem (IDC_LIST2));

NeedFont->CreatePointFont (80,L" Courier New");

list->SetFont (NeedFont);

GetDlgItem (IDC_EDIT1)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT2)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT3)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT4)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT5)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT6)->GetWindowTextW (S);

event temp (_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S)," «,» «);

list->ResetContent ();

for (i=0;i

{

if (temp==storage[i])

{

st=storage[i]. GetTime ();

buf.Format (_T («%-24.24s %4.4d/%-2.2d/%-2.2d/%-2.2d/%-2.2d/%-2.2d %15s»), storage[i]. GetMessage (), st. wYear, st. wMonth, st. wDay, st. wHour, st. wMinute, st. wSecond, storage[i].GetType ());

list->AddString (buf);

}

}

}

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (ShowEventsAt, CDialog)

ON_COMMAND (IDShow, OnButtonShow)

END_MESSAGE_MAP ()

// ===== класс окна вывода событий в интервале времени =========================

class ShowEventsInInterval: public CDialog

{

public:

ShowEventsInInterval (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){};

afx_msg void OnButtonShow ();

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (ShowEventsInInterval, CDialog)

ON_COMMAND (IDShow, OnButtonShow)

END_MESSAGE_MAP ()

afx_msg void ShowEventsInInterval: OnButtonShow ()

{

CString Y, M, D, H, Min, S, buf;

unsigned int i=0;

CFont *NeedFont=new CFont;

CListBox *list=(CListBox *)(this->GetDlgItem (IDC_LIST1));

NeedFont->CreatePointFont (80,L" Courier New");

list->SetFont (NeedFont);

SYSTEMTIME st;

GetDlgItem (IDC_EDIT1)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT2)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT3)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT4)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT5)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT6)->GetWindowTextW (S);

event temp1(_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S)," «,» «);

GetDlgItem (IDC_EDIT7)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT8)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT9)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT10)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT11)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT12)->GetWindowTextW (S);

event temp2(_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S)," «,» «);

list->ResetContent ();

for (i=0;i

{

if (storage[i]>temp1 && temp2>storage[i])

{

st=storage[i]. GetTime ();

buf.Format (_T («%-24.24s %4.4d/%-2.2d/%-2.2d/%-2.2d/%-2.2d/%-2.2d %15s»), storage[i]. GetMessage (), st. wYear, st. wMonth, st. wDay, st. wHour, st. wMinute, st. wSecond, storage[i].GetType ());

list->AddString (buf);

}

}

}

// ===== класс окна вывода прошедших событий сначала =======================

class ShowEventsFromBegining: public CDialog

{

public:

ShowEventsFromBegining (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){};

afx_msg void OnButtonShow ();

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (ShowEventsFromBegining, CDialog)

ON_COMMAND (IDShow, OnButtonShow)

END_MESSAGE_MAP ()

afx_msg void ShowEventsFromBegining: OnButtonShow ()

{

SYSTEMTIME st;

unsigned int i=0;

CString buf;

GetLocalTime (&st);

event temp (st.wYear, st. wMonth, st. wDay, st. wHour, st. wMinute, st. wSecond," «,» «);

CListBox *list=(CListBox *)(this->GetDlgItem (IDC_LIST2));

CFont *NeedFont=new CFont;

NeedFont->CreatePointFont (80,L" Courier New");

GetDlgItem (IDC_LIST2)->SetFont (NeedFont);

list->ResetContent ();

for (i=0;i

{

if (temp>storage[i])

{

st=storage[i]. GetTime ();

buf.Format (_T («%-24.24s %4.4d/%-2.2d/%-2.2d/%-2.2d/%-2.2d/%-2.2d %15s»), storage[i]. GetMessage (), st. wYear, st. wMonth, st. wDay, st. wHour, st. wMinute, st. wSecond, storage[i].GetType ());

list->AddString (buf);

}

}

}

// ===== класс проверки наличия событий в заданном интервале ===================

class CheckInInterval: public CDialog

{

public:

CheckInInterval (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){};

afx_msg void OnButtonCheck ();

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (CheckInInterval, CDialog)

ON_COMMAND (IDCheck, OnButtonCheck)

END_MESSAGE_MAP ()

afx_msg void CheckInInterval: OnButtonCheck ()

{

CString Y, M, D, H, Min, S, message;

unsigned int i=0,n=0;

GetDlgItem (IDC_EDIT1)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT2)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT3)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT4)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT5)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT6)->GetWindowTextW (S);

event temp1(_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S)," «,» «);

GetDlgItem (IDC_EDIT7)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT8)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT9)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT10)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT11)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT12)->GetWindowTextW (S);

event temp2(_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S)," «,» «);

for (i=0;i

{

if (storage[i]>temp1 && temp2>storage[i])

{

n++;

}

}

message.Format (L" Number of events in this inteval: %d", n);

MessageBox (message, L" Nunber of events");

}

// ===== класс проверки наличия событий в заданное время =======================

class CheckInTime: public CDialog

{

public:

CheckInTime (char *DialogName, CWnd *Owner):

CDialog ((LPCTSTR)DialogName, Owner){};

afx_msg void OnButtonCheck ();

DECLARE_MESSAGE_MAP ()

};

BEGIN_MESSAGE_MAP (CheckInTime, CDialog)

ON_COMMAND (IDCheck, OnButtonCheck)

END_MESSAGE_MAP ()

afx_msg void CheckInTime: OnButtonCheck ()

{

CString Y, M, D, H, Min, S, message;

unsigned int i=0,n=0;

GetDlgItem (IDC_EDIT1)->GetWindowTextW (Y);

GetDlgItem (IDC_EDIT2)->GetWindowTextW (M);

GetDlgItem (IDC_EDIT3)->GetWindowTextW (D);

GetDlgItem (IDC_EDIT4)->GetWindowTextW (H);

GetDlgItem (IDC_EDIT5)->GetWindowTextW (Min);

GetDlgItem (IDC_EDIT6)->GetWindowTextW (S);

event temp (_ttoi (Y),_ttoi (M),_ttoi (D),_ttoi (H),_ttoi (Min),_ttoi (S)," «,» «);

for (i=0;i

{

if (temp==storage[i])

{

n++;

}

}

message.Format (L" Number of events in this time: %d", n);

MessageBox (message, L" Number of events");

}

// ===== класс главного ОКНА приложения ====================

class WINDOW: public CFrameWnd

{

public:

WINDOW ();

afx_msg void OnMenuItem_SetNew ();

afx_msg void OnMenuItem_ShowAll ();

afx_msg void OnMenuItem_ShowAt ();

afx_msg void OnMenuItem_ShowInInterval ();

afx_msg void OnMenuItem_ShowFromBegining ();

afx_msg void OnMenuItem_CheckInInterval ();

afx_msg void OnMenuItem_CheckInTime ();

afx_msg void OnDestroy ();

DECLARE_MESSAGE_MAP ()

};

// ===== конструктор Создание окна

WINDOW:WINDOW ()

{

Create (NULL, L" Курсовой проект 6 семестр", WS_SYSMENU, rectDefault, NULL, (LPCTSTR)IDR_MENU1);

FILE *in=fopen («g:\1.bin» ," rb");

if (!in)

{

MessageBox (L" File not fount", L" Error");

}

else

{

event temp;

unsigned int i=0;

while (fread (&temp, sizeof (event), 1, in))

{

storage.push_back (temp);

i++;

fseek (in, sizeof (event)*i, SEEK_SET);

}

fclose (in);

}

}

afx_msg void WINDOW: OnMenuItem_ShowAll ()

{

ShowAllDialog ShowAllDialog ((char *)IDD_SHOWALL_DIALOG, NULL);

ShowAllDialog.DoModal ();

}

afx_msg void WINDOW: OnMenuItem_SetNew ()

{

SetNewDialog SetDialog ((char *)IDD_SETDIALOG, NULL);

SetDialog.DoModal ();

}

afx_msg void WINDOW: OnMenuItem_ShowAt ()

{

ShowEventsAt EventsAt ((char *)IDD_ShowEventsAt, NULL);

EventsAt.DoModal ();

}

afx_msg void WINDOW: OnMenuItem_ShowInInterval ()

{

ShowEventsInInterval InInterval ((char *)IDD_ShowEventsInInterval, NULL);

InInterval.DoModal ();

}

afx_msg void WINDOW: OnMenuItem_ShowFromBegining ()

{

ShowEventsFromBegining FromBegining ((char *)IDD_ShowEventsFromBegining, NULL);

FromBegining.DoModal ();

}

afx_msg void WINDOW: OnMenuItem_CheckInInterval ()

{

CheckInInterval CheckInterval ((char *)IDD_CheckInInterval, NULL);

CheckInterval.DoModal ();

}

afx_msg void WINDOW: OnMenuItem_CheckInTime ()

{

CheckInTime CheckTime ((char *)IDD_CheckInTime, NULL);

CheckTime.DoModal ();

}

afx_msg void WINDOW: OnDestroy ()

{

FILE *out=fopen («g:\1.bin» ," wb"); // Если файл не существует он создастся

if (!out)

{

MessageBox (L" File not open", L" Error"); // Проверка на NULL

}

for (unsigned int i=0; i

{

fwrite (&storage[i], sizeof (event), 1, out);

fseek (out, sizeof (event), SEEK_CUR);

}

fclose (out);

}

// ===== очередь сообщений главного окна

BEGIN_MESSAGE_MAP (WINDOW, CFrameWnd)

ON_COMMAND (ID_set_new, OnMenuItem_SetNew)

ON_COMMAND (ID_ShowAll, OnMenuItem_ShowAll)

ON_COMMAND (ID_40 006,OnMenuItem_ShowAt)

ON_COMMAND (ID_40 007,OnMenuItem_ShowInInterval)

ON_COMMAND (ID_40 005,OnMenuItem_ShowFromBegining)

ON_COMMAND (ID_40 010,OnMenuItem_CheckInInterval)

ON_COMMAND (ID_40 009,OnMenuItem_CheckInTime)

ON_WM_DESTROY ()

END_MESSAGE_MAP ()

// ===== класс ПРИЛОЖЕНИЕ ====================

class APPLICATION: public CWinApp

{

public:

BOOL InitInstance ();

};

// ===== конструктор Инициализация приложения

BOOL APPLICATION: InitInstance ()

{

m_pMainWnd = new WINDOW;

m_pMainWnd -> ShowWindow (m_nCmdShow);

m_pMainWnd -> UpdateWindow ();

return TRUE;

}

// ===== создание экземпляра приложения ====================

APPLICATION TheApplication;

//файл event. h

#include

#include «windows.h»

using namespace std;

class event{

private:

string message;

string type;

SYSTEMTIME st;

public:

event ()

{

type="unknown" ;

message="none" ;

st.wYear=0;

st.wMonth=0;

st.wDay=0;

st.wHour=0;

st.wMinute=0;

st.wSecond=0;

}

event (int Y, int M, int D, int H, int Min, int Sec, CString the_type, CString the_message)

{

type.resize (the_type.GetLength ());

WideCharToMultiByte (CP_ACP, 0, the_type, -1, &type[0], type. size (), NULL, NULL);

message.resize (the_message.GetLength ());

WideCharToMultiByte (CP_ACP, 0, the_message, -1, &message[0], message. size (), NULL, NULL);

st.wYear=Y;

st.wMonth=M;

st.wDayOfWeek=0;

st.wDay=D;

st.wHour=H;

st.wMinute=Min;

st.wSecond=Sec;

st.wMilliseconds=0;

}

CString GetMessage ()

{

CString the_mess=message.c_str ();

return the_mess;

}

SYSTEMTIME GetTime ()

{

return st;

}

CString GetType ()

{

CString the_type=type.c_str ();

return the_type;

}

bool operator > (event a)

{

if (st.wYear>a.GetTime ().wYear)

return true;

else if (st.wMonth>a.GetTime ().wMonth && st. wYear>=a.GetTime ().wYear)

return true;

else if (st.wDay>a.GetTime ().wDay && st. wMonth>=a.GetTime ().wMonth && st. wYear>=a.GetTime ().wYear)

return true;

else if (st.wHour>a.GetTime ().wHour && st. wDay>=a.GetTime ().wDay && st. wMonth>=a.GetTime ().wMonth && st. wYear>=a.GetTime ().wYear)

return true;

else if (st.wMinute>a.GetTime ().wMinute && st. wHour>=a.GetTime ().wHour && st. wDay>=a.GetTime ().wDay && st. wMonth>=a.GetTime ().wMonth && st. wYear>=a.GetTime ().wYear)

return true;

else if (st.wSecond>a.GetTime ().wSecond && st. wMinute>=a.GetTime ().wMinute && st. wHour>=a.GetTime ().wHour && st. wDay>=a.GetTime ().wDay && st. wMonth>=a.GetTime ().wMonth && st. wYear>=a.GetTime ().wYear)

return true;

else return false;

}

bool operator == (event a)

{

if (st.wSecond==a.GetTime ().wSecond && st. wMinute==a.GetTime ().wMinute && st. wHour==a.GetTime ().wHour && st. wDay==a.GetTime ().wDay && st. wMonth==a.GetTime ().wMonth && st. wYear==a.GetTime ().wYear)

return true;

else return false;

}

};

Показать весь текст
Заполнить форму текущей работой