Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПрограммированиеРГР_Матюшков.docx
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
58.39 Кб
Скачать

Задача 6(№177)

Постановка задачи: Напишите функцию сравнения двух дат.

Текст программы:

class Date{

int d,m,y;

static int d0,m0,y0;

static int dw0;

public:

Date(int=0,int=0,int=0); // Конструктор

void Print();

static void SetInitialDate(int di,int mi,int yi,int dwi) // Фун-ия установки начальной даты

{

d0=di;m0=mi;y0=yi;dw0=dwi;

}

int DayOfYear(); // Возвращает номер дня в году

int NumberDayOfWeek(); // День недели

friend bool leapyear(Date); // Объявление функции-друга

int sravneniedat(Date dt2); // Сравнение первой даты(d,m,y) и второй dt2

};

#include<iostream>

using namespace std;

//определение статических членов класса

int Date ::d0, Date ::m0, Date ::y0, Date::dw0;

void Date::Print()

{

cout<<d<<'.'<<m<<'.'<<y;

}

int leap(int year)

{

return (year % 4==0 && year % 100 !=0)|| year % 400 ==0;

}

bool leapyear(Date dt){return leap(dt.y);}

char daytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31}

};

int Date::DayOfYear() // Возвращает номер дня в году

{

int days=d; // Кол-во дней от начала месяца

int lp=leap(y); // Признак високостности года

for(int i=1;i<m;i++)

days+= daytab[lp][i];

return days;

}

int Date::NumberDayOfWeek() // Возврат номер днянедели

{

Date dti(d0,m0,y0); // Начальная дата формируется по статическим членам

long days=dw0-1; // Кол-во дней, прошедших от пн начальной недели

if(y0 < y)

days+=365+leap(y0)-dti.DayOfYear(); // Учет дней в начальном году

for(int i=y0+1;i<y;i++) // Учет дней в промежуточных годах

days+=365+leap(i);

days+=DayOfYear(); // Учет дней в заданном году.

return days % 7+1 ;

}

int Date::sravneniedat(Date dt2) // Сравнение первой даты(d,m,y) и второй dt2

{

if (y < dt2.y) // Год первой даты меньше второй

return -1;

else if ( y > dt2.y ) // год первой даты больше второй

return 1;

else if ( m < dt2.m) // год первой даты равен второй, а месяц меньше

return -1;

else if ( m > dt2.m) // год первой даты равен второй а месяц больше

return 1;

else if ( d < dt2.d) // год и месяц первой даты равен второй, а день меньше

return -1;

else if ( d > dt2.d) // год и месяц первой даты равен второй, а день больше

return 1;

else return 0; // даты одинаковые

}

#include<ctime>

Date::Date(int dd,int mm,int yy)

{

time_t seconds;

time(& seconds);

struct tm* ptm_time;

ptm_time=localtime(& seconds);

d=dd?dd:ptm_time->tm_mday;

m=mm?mm:ptm_time->tm_mon+1;

y=yy?yy:ptm_time->tm_year+1900;

}

#include<conio.h>

#include<iostream>

using namespace std;

void Print();

int main()

{ setlocale (LC_ALL,"Russian");

char*DayWeek[7]={"Понедельник","Вторник","Среда","Четверг","Пятница","Суббота","Воскресенье"};

Date::SetInitialDate(1,1,2011,6);

Date Today;

cout<<"\n Сегодня"; Today.Print();

cout<<"," << DayWeek[Today.NumberDayOfWeek()-1];

cout<<"\n Идет високосный год: "<<leapyear(Today);

cout << "\n Сегодня " << Today.DayOfYear() << " день года ";

Date M (19,04,1994);

Date U (27,12,1993);

int srvMU = M.sravneniedat(U);

if (srvMU < 0)

cout<<"M " << "Старше U ";

else if ( srvMU > 0)

cout<<"U " << "Старше M ";

cout<<"I was bern " << DayWeek[M.NumberDayOfWeek()-1];

getch();

return 0;

}