Разработка и представление григорианского календаря

Составление консольного приложения имитирующего развитие создаваемого поселения, используя методы объектно–ориентированного программирования. Характеристика и особенности объектно-ориентированного программирования. Описание структуры классов программы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 30.05.2020
Размер файла 297,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ТЕХНИЧЕСКОЕЗАДАНИЕ

1. НАИМЕНОВАНИЕ ПРОДУКТА

Разработка и представление григорианского календаря.

Краткая характеристика области применения

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

2. ОСНОВАНИЕ ДЛЯ РАЗРАБОТКИ

Документ, на основании которого ведётся разработка

Задание на курсовую работу по дисциплине «Программирование».

Организация, утвердившая документ

Луганский Национальный Университет имени Владимира Даля

ВВЕДЕНИЕ

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

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

Во время выполнения приложение должно выполнять следующие действия:

1. Предоставлять выбор направления развития поселения (военное, научное, религиозное, торговое);

2. В зависимости от выбора направления развития, выбирается ведущее направление (например, если выбрать религиозное развитие то будет выбор между религиями);

3. Определение количества жителей поселения (которое включает разные расы: орки, гномы, эльфы, темные эльфы и люди)

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

В данной работе будут рассмотрены:

1. Алгоритм выполнения программы;

2. Объектно - ориентированное программирование;

3. Среда программирования.

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

ПРЕДМЕТ КУРСОВОЙ РАБОТЫ

Для разработки программы использован язык C++.

Язык возник в начале 1980-х годов, когда сотрудник фирмы BellLaboratoriesБьёрн Страуструп придумал ряд усовершенствований к языку С под собственные нужды. До начала официальной стандартизации язык развивался в основном силами Страуструпа в ответ на запросы программистского сообщества. В 1998 году был ратифицирован международный стандарт языка C++: ISO/IEC 14882:1998 "StandardfortheC++ ProgrammingLanguage"; после принятия технических исправлений к стандарту в 2003 году - нынешняя версия этого стандарта - ISO/IEC 14882:2003.

Ранние версии языка, известные под именем "C с классами", начали появляться с 1980 года. Идея создания нового языка берёт начало от опыта программирования Страуструпа для диссертации. Он обнаружил, что язык моделирования Simula имеет такие возможности, которые были бы очень полезны для разработки большого программного обеспечения, но работает слишком медленно. В то же время язык BCPL достаточно быстр, но слишком близок к языкам низкого уровня и не подходит для разработки большого программного обеспечения. Страуструп начал работать в BellLabs над задачами теории очередей (в приложении к моделированию телефонных вызовов). Попытки применения существующих в то время языков моделирования оказались неэффективными. Вспоминая опыт своей диссертации, Страуструп решил дополнить язык C (преемник BCPL) возможностями, имеющимися в языке Симула. Язык C, будучи базовым языком системы UNIX, на которой работали компьютеры Bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами. В результате, практические задачи моделирования оказались доступными для решения как с точки зрения времени разработки (благодаря использованию Симула-подобных классов) так и с точки зрения времени вычислений (благодаря быстродействию C). В начале в C были добавлены классы (с инкапсуляцией), производные классы, строгая проверка типов, inline-функции и аргументы по умолчанию.

Разрабатывая C с классами (позднее C++), Страуструп также написал программу cfront - транслятор, перерабатывающий исходный код C с классами в исходный код простого C. Новый язык, неожиданно для автора, приобрёл большую популярность среди коллег и вскоре Страуструп уже не мог лично поддерживать его, отвечая на тысячи вопросов.

В 1983 году произошло переименование языка из C с классами в C++. Кроме того, в него были добавлены новые возможности, такие как виртуальные функции, перегрузка функций и операторов, ссылки, константы, пользовательский контроль над управлением свободной памятью, улучшенная проверка типов и новый стиль комментариев (//). Его первый коммерческий выпуск состоялся в октябре 1985 года. В 1985 году вышло также первое издание "Языка программирования C++", обеспечивающее первое описание этого языка, что было чрезвычайно важно из-за отсутствия официального стандарта. В 1989 году состоялся выход C++ версии 2.0. Его новые возможности включали множественное наследование, абстрактные классы, статические функции-члены, функции-константы и защищённые члены.

В 1990 году вышло "Комментированное справочное руководство по C++", положенное впоследствии в основу стандарта. Последние обновления включали шаблоны, исключения, пространства имён, новые способы приведения типов и булевский тип.

Стандартная библиотека C++ также развивалась вместе с ним. Первым добавлением к стандартной библиотеке C++ стали потоки ввода/вывода, обеспечивающие средства для замены традиционных функций C printf и scanf. Позднее самым значительным развитием стандартной библиотеки стало включение в неё Стандартной библиотеки шаблонов.

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ

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

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

В языке C++ программист имеет возможность вводить собственные типы данных и определять операции над ними с помощью классов. Классы -- это производные структурированные типы, введенные программистом на основе уже существующих типов. Механизм классов позволяет вводить собственные типы данных, т.е. класс задает некоторую структурированную совокупность типизированных данных и позволяет определить набор операций над этими данными. Закрытые данные - члены класса и определения всех функций членов класса входят во внутреннюю используемую часть класса private. Для возможности работы с этим классом часть членов должна быть открытой. Эта часть класса называется интерфейсом (public).

  • Объект -- это сущность, экземпляр класса, которой можно посылать сообщения, и которая может на них реагировать, используя свои данные. Данные объекта скрыты от остальной программы. Сокрытие данных называется инкапсуляцией. ориентированное программирование класс

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

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

Инкапсуляция-- это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.

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

Полиморфизм-- это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

ПРОЕКТИРОВАНИЕ ПРОГРАММЫ

Общая схема программы

Вданнойпрограммебылисозданыклассы: classDate, classDaysDate, classStructDate.

ClassDate-Базовый класс, абстрактный класс представления даты.

ClassDaysDate - Класс в котором хранится информация о количестве дней, прошедших после определенной даты.

ClassStructDate - Класс в котором выполняется сравнение и корректировка даты.

СТРУКТУРЫ КЛАССОВ ПРОГРАММЫ

1.Структура классаDate

class Date {

public:

virtual ~Date() {} // Деструкторкласса.

virtualintGetDate() const = 0; // Метод GetDate нужен, чтобы вернуть день, внутри месяца, который хранится в этом представлении даты

virtualvoidSetDate(intday) = 0; // Метод SettDate нужен для установки этого дня

virtualintGetMonth() const = 0; // Представлениемесяца

virtual void SetMonth(int month) = 0;//

virtualintGetYear() const = 0; // Представлениегода

virtual void SetYear(int year) = 0;//

virtual Date &AddDays(int days = 1) = 0; //

virtual Date &SubDays(int days = 1) = 0; //

virtual Date &AddMonths(int months = 1) = 0; // Методы "сдвиганаединицу"

virtual Date &SubMonths(int months = 1) = 0; //

virtual Date &AddYears(int years = 1) = 0; //

virtual Date &SubYears(int years = 1) = 0; //

virtualDate&operator = (constDate&date) = 0; // Операцияприсваивания. Сделана для работы с простыми числами

virtualDate&operator += (intdays) { returnAddDays(days); } // Операцииувеличенияивычитания

virtual Date & operator -= (int days) { return SubDays(days); }

virtual Date & operator ++ () { return AddDays(); }

virtual Date & operator -- () { return SubDays(); }

virtual bool operator < (const Date & date) const { return !(*this >= date); }

virtual bool operator == (const Date & date) const { return !(*this != date); } // Операциисравнения.

virtual bool operator > (const Date & date) const { return !(*this <= date); }

virtual bool operator <= (const Date & date) const { return !(*this > date); }

virtual bool operator != (const Date & date) const { return !(*this == date); }

virtual bool operator >= (const Date & date) const { return !(*this < date); }

virtualconst char * GetString() const; // Получениевыводадаты

};

boolIsLeapYear(intyear); // Функция проверки на "Високосный год"

intGetDaysInMonth(intmonth, intyear); // Управление кол-ва дней, исходя из года

2. Структура классаDaysDate

classDaysDate : public Date {

private:

long days;//Количестводней

public:

DaysDate();

DaysDate(constDaysDate& date) {//конструкторкопирования

days = date.days;

}

DaysDate(intd, intm, inty);// конструктордняиномерамесяца

voidSetDate(int day);

intGetDate() const;

voidSetMonth(int month);

intGetMonth() const;

voidSetYear(int year);

intGetYear() const;

Date &AddDays(int days = 1);//

Date &SubDays(int days = 1);//

Date &AddMonths(int months = 1);// Методысдвига

Date &SubMonths(int months = 1);//

Date &AddYears(int years = 1);//

Date &SubYears(int years = 1);//

Date & operator = (const Date & date); // Операцииприсваивания

bool operator < (const Date & date) const;//

bool operator == (const Date & date) const;//

bool operator > (const Date & date) const;//

bool operator <= (const Date & date) const;// Операциисравнения

bool operator != (const Date & date) const;//

bool operator >= (const Date & date) const;//

};

3. СтруктураклассаStructDate

classStructDate :publicDate { //

private: // Структурное представление, которое хранит в себя три поля (Д, М, Г)

intd; //

intm; //

inty;//

public:

StructDate(int d, int m, int y) { //

StructDate::d = d;// Конструктор, который задает дату

StructDate::m = m;//

StructDate::y = y;//

}//

StructDate() {//

time_ttm;// Конструктор по умолчанию, извлекающий информацию о текущей даты с ОС

time(&tm);//

struct tm * dt = localtime(&tm);//

d = dt->tm_mday;//

m = dt->tm_mon + 1;//

y = dt->tm_year + 1900; //

}

StructDate(const Date & date) {// Конструкторкопирования

*this = date;//

}//

voidSetDate(intday) {// Обращение на чтение-запись

d = day;

}

intGetDate() const {//

return d; //

}//

voidSetMonth(int month);//

intGetMonth() const {//

return m;//

}

voidSetYear(int year);//

intGetYear() const {//

return y;//

}

Date &AddDays(int days = 1);//

Date&AddMonths(intmonths = 1);// Реализация для временного сдвига

Date &AddYears(int years = 1);//

Date &SubDays(int days = 1);//

Date &SubMonths(int months = 1);//

Date &SubYears(int years = 1);//

Date & operator = (const Date & date);// Операцияприсваивания

bool operator < (const Date & date) const;//

bool operator == (const Date & date) const;// Операциисравнения

bool operator > (const Date & date) const;//

};

РАБОТАПРОГРАММЫ

Рисунок 1 - Представление работы григорианского календаря

ВЫВОД

Во время выполнения курсовой работы была написана программа использовавшая элементы объектно-ориентированного программирования. Основу программы составили классы.

Были применены знания, полученные в процессе изучения курса «Программирование». При выполнении курсовой была проработана литература по языкам С/С++, объектно-ориентированному программированию. Работать с объектами класса при помощи функций членов намного удобнее, нежели не использовать классы, а применять только стандартный набор типов данных.

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

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

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

1. Объектно - ориентированное программирование [Электронный ресурс] // С++ - Режим доступа: http://www.c-cpp.ru/books/obektno-orientirovannoe-programmirovanie

2. Энциклопедия языков программирования [Электронный ресурс] // Язык программирования С++ - Режим доступа: http://progopedia.ru/language/c-plus-plus/

3. Якобсон А. Унифицированный процесс разработки программного обеспечения / Якобсон А., Буч Г., Рамбо Дж. - СПБ.: Питер, 2002. - 496с.

4. Введение в объектно ориентированное программирование [Электронный ресурс] // Классы в С++ - Режим доступа: http://cppstudio.com

5. Страуструп Б. Язык программирования С++. Специальное издание / Бьерн Страуструп. - М.: Бином. 2008 - 3 - е изд. - 1058с

6. Энциклопедия языков программирования [Электронный ресурс] // Язык программирования С++ - Режим доступа: http://progopedia.ru/language/c-plus-plus/

7. Холзнер С. Учебный курс С++ 6 / Холзнер С. - СПБ.: БХВ, 2004. - 2-е изд. - 158с.

8. ГОСТ 19.701-90. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. - Москва: Издательство стандартов, 1992.

Приложение А

ФайлDate.cpp

#include <stdio.h>

#include "Date.h"

boolIsLeapYear(int year) {

returnyear % 4 == 0 && (year % 100 != 0 || year % 400 == 0); // Правило определения високосного года

}

intGetDaysInMonth(int month, int year) {

staticintmonthLenghts[] =

{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

returnmonthLenghts[month - 1] + (month == FEBRUARY &&IsLeapYear(year));

}

const char * Date::GetString() const {

staticconst char * monthNames[] = {

"Jan", "Feb", "Mar", "Apr", "May", "Jun",

"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"

};

char * result = new char[12];

sprintf(result, "%2d-%s-%4d",

GetDate(), monthNames[GetMonth() - 1], GetYear());

return result;

}

ФайлDaysDate.cpp

#include <time.h>

#include "DaysDate.h"

staticconstintmonthLenght[2][12] = {//

{0,31,59,90,120,151,181,212,243,273,304,334},// Двумерный массив, хранящий информацию кол-ва дней в годах

{0,31,60,91,121,152,182,213,244,274,305,335}// (длявисокосногогода)

};

static long Convert(int d, int m, int y) {//

intyear = y - 1600;//

longdays = year*365 + year/4 - year/100 + year/400; // Преобразование в представление даты дней, прошедших с 1янв 1600года

bool leap = IsLeapYear(y);//

if (leap)//

days--;//

returndays + monthLenght[leap][m-1] + d; // Вычисления кол-ва дней, исходя из номера года

}

static void Convert(long days, int& d, int& m, int& y) {//

y = (int)(1600 + 4*days/(365*4 + 1)) + 1;// Обратное преобразование в структурный вид

int diff = (int)(days - Convert(1, JANUARY, y) + 1);//

if (diff <= 0)

y--;//

bool leap = IsLeapYear(y);//

if (diff <= 0)

diff += 365 + leap;//

for (m = JANUARY;/

m < DECEMBER && diff >monthLenght[leap][m];//

m++);//

d = diff - monthLenght[leap][m-1];/

}

static void CorrectLastMonthDate(int& d, int m, int y) {

int limit = GetDaysInMonth(m, y);

if (d > limit)

d = limit;

}

DaysDate::DaysDate() {

time_ttm;// Применяется стандартные библиотеки, которые обращаются к ОС для получения времени

time(&tm);

struct tm * dt = localtime(&tm);

days = Convert(dt->tm_mday, dt->tm_mon + 1, dt->tm_year + 1900);//

}

DaysDate::DaysDate(int d, int m, int y) {

days = Convert(d, m, y);

}

voidDaysDate::SetDate(int day) {

int d, m, y;

Convert(days, d, m, y);

days = Convert(day, m, y);

}

intDaysDate::GetDate() const {

int d, m, y;

Convert(days, d, m, y);

return d;

}

voidDaysDate::SetMonth(int month) {

int d, m, y;

Convert(days, d, m, y);

CorrectLastMonthDate(d, month, y);

days = Convert(d, month, y);

}intDaysDate::GetMonth() const {

int d, m, y;

Convert(days, d, m, y);

return m;

}

voidDaysDate::SetYear(int year) {

int d, m, y;

Convert(days, d, m, y);

CorrectLastMonthDate(d, m, year);

days = Convert(d, m, year);

}

intDaysDate :: GetYear() const {

int d, m, y;

Convert(days, d, m, y);

return y;

}

Date &DaysDate::AddDays(int days) {

DaysDate::days += days;

return *this;

}

Date &DaysDate::SubDays(int days) {

DaysDate::days -= days;

return *this;

}

Date &DaysDate::AddMonths(int months) {

if (months < 0)

returnSubMonths(-months);

int d, m, y;Convert(days, d, m, y);

y += months / 12;

m += months % 12;

if (m > DECEMBER) {

y++;

m -= 12;

}

CorrectLastMonthDate(d, m, y);

days = Convert(d, m, y);

return *this;

}

Date &DaysDate::SubMonths(int months) {

if (months < 0)

returnAddMonths(-months);

int d, m, y;

Convert(days, d, m, y);

y -= months / 12;

m -= months % 12;

if (m < JANUARY) {

y--;

m += 12;

}CorrectLastMonthDate(d, m, y);

days = Convert(d, m, y);

return *this;

}

Date &DaysDate::AddYears(int years) {

int d, m, y;Convert(days, d, m, y);

y += years;

if (d == 29 && m == FEBRUARY && !IsLeapYear(y))

d = 28;

days = Convert(d, m, y);

return *this;

}

Date &DaysDate::SubYears(int years) {

int d, m, y;

Convert(days, d, m, y);

y -= years;

if (d == 29 && m == FEBRUARY && !IsLeapYear(y))

d = 28;

days = Convert(d, m, y);

return *this;

}

Date &DaysDate::operator = (const Date & date) {//

days = Convert(date.GetDate(), date.GetMonth(), date.GetYear());// Операциисравнения

return *this;//

}

boolDaysDate::operator < (const Date & date) const {//

return days < Convert(date.GetDate(), date.GetMonth(), date.GetYear());// Операциисравнения

}//

boolDaysDate :: operator == (const Date & date) const {

return days < Convert(date.GetDate(), date.GetMonth(), date.GetYear());

}

boolDaysDate :: operator > (const Date & date) const {

return days < Convert(date.GetDate(), date.GetMonth(), date.GetYear());

}

boolDaysDate :: operator <= (const Date & date) const {

return days < Convert(date.GetDate(), date.GetMonth(), date.GetYear());

}

boolDaysDate :: operator != (const Date & date) const {

return days < Convert(date.GetDate(), date.GetMonth(), date.GetYear());

}

boolDaysDate :: operator >= (const Date & date) const {

return days < Convert(date.GetDate(), date.GetMonth(), date.GetYear()); }

Файл Main.Cpp

#include <iostream>

#include "StructDate.h"

#include "DaysDate.h"

using namespace std;

int main() {

cout<< "Today: " <<StructDate().GetString() <<endl;

StructDatedt1(21, JUNE, 2003);

cout<< "Should be 21-Jun-2003: " << dt1.GetString() <<endl;

cout<< "Should be 1-Jul-9004: " << (dt1.AddYears(7001) += 10).GetString() <<endl;

cout<< "Should be 1-Jan-9004: " << dt1.SubMonths(6).GetString() <<endl;

cout<< "Should be 31-Dec-9003: " << (--dt1).GetString() <<endl;

cout<< "Should be 29-Feb-9004: " << (dt1.AddMonths(2)).GetString() <<endl<<endl;

DaysDatedt2(21, JUNE, 2003);

cout<< "Should be 21-Jun-2003: " << dt2.GetString() <<endl;

cout<< "Should be 1-Jul-9004: " << (dt2.AddYears(7001) += 10).GetString() <<endl;

cout<< "Should be 1-Jan-9004: " << dt2.SubMonths(6).GetString() <<endl;

cout<< "Should be 31-Dec-9003: " << (--dt2).GetString() <<endl;

cout<< "Should be 29-Feb-9004: " << (dt2.AddMonths(2)).GetString() <<endl<<endl;

system("pause");

return 0;

}

Файл StructDate.cpp

#include <stdio.h>

#include "StructDate.h"

voidStructDate::SetMonth(int month) {//Определение(установкамесяца)

m = month;

intlimit = GetDaysInMonth(m, y); // Определение кол-ва дней в месяце и идет корректировка

if (d > limit)

d = limit;

}

voidStructDate::SetYear(intyear) {//Определение(установка времен года в соответсвии с високосным годом)

y = year;

if (d == 29 && m == FEBRUARY && !IsLeapYear(y))

d = 28;

}

Date&StructDate::AddDays(intdays) { // Реализация методов для временного сдвига

if (days < 0) return SubDays(-days);

while (days > 0) {

intmDays = GetDaysInMonth(m, y);

if (d + days <= mDays) {

d += days;

days = 0;

} else {

days -= (mDays - d + 1);

d = 1;

if (++m > DECEMBER) {

m = JANUARY;

y++;

}

}

}

return *this;

}

Date &StructDate::SubDays(int days) {

if (days < 0) return AddDays(-days);

while (days > 0) {

if (days < d) {

d -= days;

days = 0;

} else {

if (--m < JANUARY) {

m = DECEMBER;

y--;

}

days -= d;

d = GetDaysInMonth(m, y);

}

}

return *this;

}

Date &StructDate::AddMonths(int months) {

if (months < 0) return SubMonths(-months);

y += months / 12;

m += months % 12;

if (m > DECEMBER) {

m -= 12; y++;

}

int limit = GetDaysInMonth(m, y);

if (d > limit) d = limit;

return *this;

}

Date &StructDate::SubMonths(int months) {

if (months < 0) return AddMonths(-months);

y -= months / 12;

m -= months % 12;

if (m < JANUARY) {

m += 12; y--;

}

int limit = GetDaysInMonth(m, y);

if (d > limit) d = limit;

return *this;

}

Date &StructDate::AddYears(int years) {

y += years;

if (d == 29 && m == FEBRUARY && !IsLeapYear(y))

d = 28;

return *this;

}

Date &StructDate::SubYears(int years) {

y -= years;

if (d == 29 && m == FEBRUARY && !IsLeapYear(y))

d = 28;

return *this;

}

Date &StructDate::operator = (const Date & date) {

d = date.GetDate();

m = date.GetMonth();

y = date.GetYear();

return *this;

}

boolStructDate::operator < (const Date & date) const {

intdate_d = date.GetDate();

intdate_m = date.GetMonth();

intdate_y = date.GetYear();

return y <date_y ||

(y == date_y&& (m <date_m ||

(m == date_m&& d <date_d)));

}

boolStructDate::operator == (const Date & date) const {

return y == date.GetYear() && m == date.GetMonth() && d == date.GetDate();

}

boolStructDate::operator > (const Date & date) const {

intdate_d = date.GetDate();

intdate_m = date.GetMonth();

intdate_y = date.GetYear();

return y >date_y ||

(y == date_y&& (m >date_m ||

(m == date_m&& d >date_d)));

}

ФайлDate.h

#pragma once

enumMunth {

JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE,

JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER,

};

class Date {

public:

virtual ~Date() {} // Деструкторкласса.

virtualintGetDate() const = 0; // Метод GetDate нужен, чтобы вернуть день, внутри месяца, который хранится в этом представлении даты

virtualvoidSetDate(intday) = 0; // Метод SettDate нужен для установки этого дня

virtualintGetMonth() const = 0; // Представлениемесяца

virtual void SetMonth(int month) = 0;//

virtualintGetYear() const = 0; // Представлениегода

virtual void SetYear(int year) = 0;//

virtual Date &AddDays(int days = 1) = 0; //

virtual Date &SubDays(int days = 1) = 0; //

virtual Date &AddMonths(int months = 1) = 0; // Методы "сдвиганаединицу"

virtual Date &SubMonths(int months = 1) = 0; //

virtual Date &AddYears(int years = 1) = 0; //

virtual Date &SubYears(int years = 1) = 0; //

virtual Date & operator = (const Date & date) = 0; // Операцияприсваивания. Сделана для работы с простыми числами

virtual Date & operator += (int days) { return AddDays(days); } // Операцииувеличенияивычитания

virtual Date & operator -= (int days) { return SubDays(days); } //

virtual Date & operator ++ () { return AddDays(); } //

virtual Date & operator -- () { return SubDays(); }//

virtual bool operator < (const Date & date) const { return !(*this >= date); }//

virtual bool operator == (const Date & date) const { return !(*this != date); } // Операциисравнения.

virtual bool operator > (const Date & date) const { return !(*this <= date); }//

virtual bool operator <= (const Date & date) const { return !(*this > date); }//

virtual bool operator != (const Date & date) const { return !(*this == date); }//

virtual bool operator >= (const Date & date) const { return !(*this < date); }//

virtualconst char * GetString() const; // Получениевыводадаты

};

boolIsLeapYear(intyear); // Функция проверки на "Високосный год"

intGetDaysInMonth(intmonth, intyear); // Управление кол-ва дней, исходя из года

ФайлDaysDate.h

#pragma once

#include "Date.h"

classDaysDate : public Date {

private:

long days;//Количестводней

public:

DaysDate();

DaysDate(constDaysDate& date) {//конcтрукторкопирования

days = date.days;

}

DaysDate(int d, int m, int y);// конструктордняиномерамесяцаvoid SetDate(int day);

intGetDate() const;

voidSetMonth(int month);

intGetMonth() const;

voidSetYear(int year);

intGetYear() const;

Date &AddDays(int days = 1);//

Date &SubDays(int days = 1);//

Date &AddMonths(int months = 1);// Методысдвига

Date &SubMonths(int months = 1);//

Date &AddYears(int years = 1);//

Date &SubYears(int years = 1);//

Date & operator = (const Date & date); // Операцииприсваивания

bool operator < (const Date & date) const;//

bool operator == (const Date & date) const;//

bool operator > (const Date & date) const;//

bool operator <= (const Date & date) const;// Операциисравнения

bool operator != (const Date & date) const;//

bool operator >= (const Date & date) const;//

};

Файл StructDate.h

#pragma once

#include <time.h>

#include "Date.h"

classStructDate : public Date { //

private: // Структурное представление, которое хранит в себя три поля (Д, М, Г)

int d; //

int m; //

int y;//

public:

StructDate(int d, int m, int y) { //

StructDate::d = d;// Конструктор, который задает дату

StructDate::m = m;//

StructDate::y = y;//

}//

StructDate() {//

time_ttm;// Конструктор по умолчанию, извлекающий информацию о текущей даты с ОС

time(&tm);//

struct tm * dt = localtime(&tm);//

d = dt->tm_mday;//

m = dt->tm_mon + 1;//

y = dt->tm_year + 1900; //

}

StructDate(const Date & date) {// Конструкторкопирования

*this = date;//

}//voidSetDate(intday) {// Обращение на чтение-запись

d = day;

}

intGetDate() const {//

return d; //

}//

voidSetMonth(int month);//

intGetMonth() const {//

return m;//

}

voidSetYear(int year);//

intGetYear() const {//

return y;//

}

Date &AddDays(int days = 1);//

Date&AddMonths(intmonths = 1);// Реализация для временного сдвига

Date &AddYears(int years = 1);//

Date &SubDays(int days = 1);//

Date &SubMonths(int months = 1);//

Date &SubYears(int years = 1);//

Date & operator = (const Date & date);// Операцияприсваивания

bool operator < (const Date & date) const;//

bool operator == (const Date & date) const;// Операциисравнения

bool operator > (const Date & date) const;//

};

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.