- •Содержание:
- •Введение
- •Задача 1(№130)
- •Текст программы:
- •Задача 2(№133)
- •Текст программы:
- •Задача 3(№142)
- •Текст программы:
- •Задача 4(№164)
- •Текст программы:
- •Задача 5(№169)
- •Текст программы:
- •Задача 6(№179)
- •Текст программы:
- •Задача 7(№187)
- •Текст программы:
- •Текст программы:
- •Задача 9(№197)
- •Текст программы:
- •Список используемой литературы
Задача 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;
}