Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР Программирование - Опарин И.А. - 2 семестр....docx
Скачиваний:
5
Добавлен:
18.09.2019
Размер:
62.47 Кб
Скачать

Задача 6(№179)

Постановка задачи: Используя программу для работы с датами, проверьте, на какие дни недели пришлись некоторые исторические события. Например, 14 (26) декабря 1825г. произошло восстание декабристов, 9 (22) января 1905г. было Кровавое воскресенье, 25 октября (7 ноября) 1917 произошла Великая Октябрьская Социалистическая революция, 19 августа 1991 г. в СССР было объявлено о создании ГКЧП. Используйте даты нового стиля, указанные в скобках.

Алгоритм решения: С клавиатуры вводим дату, пишем функцию, которая подсчитает день недели и выводим на экран название дня недели на который приходилась та или иная дата. Функцию пишем так что мы задаем один день с названием дня недели самостоятельно в программе, а функция считает разницу между этим днём и заданной датой и находит название дня недели.

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

class Date

{

int d,m,y;

static int d0,m0,y0;

static int dw0;

public:

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

void Print(); //Функция печати

void Init_Date(int dd, int mm, int yy) //Инициализация даты

{d=dd;m=mm;y=yy;}

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

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

int DayOfYear(); //Номер дня в году

int NumberDayOfWeek(); //Номер дня недели

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

};

#include<iostream>

using namespace std;

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}};

void Date::Print() //Определение функции печати

{cout<<d<<"."<<m<<"."<<y;}

int leap(int year) //Функция определяющая високосный год

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

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() //Возвращает номер дня недели

{ //Понедельник-1

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(); //Учёт дней в заданном году

}

else if(y0==y)

days+=DayOfYear()-dti.DayOfYear();

return days%7+1;

}

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

int leapyear(Date dt)

{return leap(dt.y);}

#include <dos.h>

Date::Date(int dd,int mm, int yy) //Инициализация системной даты

{

date sysd;

getdate(&sysd);

d=dd?dd:sysd.da_day;

m=mm?mm:sysd.da_mon;

y=yy?yy:sysd.da_year;

}

#include<conio.h>

int main()

{

int ds,ms,ys;

char*DayWeek[7]={"poned","vtornic","sreda","4etverg","piatnica","sybbota","voskres"};

Date::SetInitialDate(31,12,1599,5); //31 декабря 1599г. Была пятница

Date Istor;

cout<<"\n Sobitie, vvedite daty : ";

cin>>ds>>ms>>ys;

Istor.Init_Date(ds,ms,ys); //Инициализация даты с клавиатуры

cout<<"\n Day nedeli: ";

cout<<DayWeek[Istor.NumberDayOfWeek()-1]; //вывод дня недели в который произошло это событие

getch();

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]