Построение вечного календаря

 

МIНIСТЕРСТВО ОСВIТИ I НАУКИ УКРАIНИ

ХАРЬКIВСКИЙ НАЦIОНАЛЬНЫЙ УНIВЕРСИТЕТ РАДIОЕЛЕКТРОНIКИ

 

Кафедра iнформатики

 

КУРСОВА РАБОТА

Тема: «Вiчний календар»

З дисциплiни «Програмування»

 

 

 

ПОЯСНЮВАЛЬНА ЗАПИСКА

Керiвник                                              Руденко Дiана Олександрiвна

 

Студент гр. КI-09-1                                 Михайлова Любов Олегiвна

 

 

 

 

Харкiв 2010

ЗА Д А Н И Е

на курсовую работу студента

Михайлова Любовь Олеговна

(фамилия,  имя, отчество)

  1. Тема работы Построение вечного календаря

2. Срок сдачи студентом  законченной работы                

3. Исходные данные  к работе: Данные по предметной области,  методические указания, ДСТУ 3008-95                                                                  

4. Содержание расчётно-пояснительной записки (перечень подлежащих разработке вопросов) : вступление, постановка задачи и среда её использования, основной алгоритм, теоретические сведения, особенности реализации алгоритма на языке С++, инструкция по использованию, выводы, список используемых источников, приложение А Текст программы.

5. Перечень графического материала  : 5 иллюстраций к курсовой работе.

6. Дата выдачи задания  20.12.2009.


 

 

РЕФЕРАТ

Пояснительная записка к курсовой работе содержит: 43 страницы, 2 таблицы, 5 рисунков, 5 разделов, 3 источника.

Объект исследования – возможности использования основных операторов среды С++ для построения программ-приложений (калькулятор, календарь и т.д.).

Цель исследования – разработка программы «вечный календарь» для получения элементарных календарных сведений по требуемым пользователю временным промежуткам.

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

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

ОПЕРАТОР, АЛГОРИТМ, ПЕРЕКЛЮЧАТЕЛЬ,ТАБЛИЦА, ПАРАМЕТР, ЦИКЛ ,ЗОДИАК.

 

 

 

 

 

 

СОДЕРЖАНИЕ

ВВЕДЕНИЕ..………………………………………………………………….5

1 ПОСТАНОВКА ЗАДАЧИ И СРЕДА ЕЁ ИСПОЛЬЗОВАНИЯ………….7

2 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ.…………………………………………8

3 ОСНОВНОЙ АЛГОРИТМ………………………………………………..13

4 ОСОБЕННОСТИ РЕАЛИЗАЦИИ НА ЯЗЫКЕ С++..…………………...16

5 ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ.……………………………...21

ВЫВОДЫ……………………………………………………………………22

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ…………………………..23

Приложение  А Текст программы………………………………………….24

 

 

 

 

 

 

 

 

 

 

ВВЕДЕНИЕ

Широкое проникновение  информационных технологий во все сферы  человеческой деятельности предъявляет  повышенные требования к компьютерной подготовке специалистов в высших учебных  заведениях. Изначально вычислительные машины были созданы для решения сложных инженерных и математических задач и, несмотря на значительное расширение сферы их применения, это направление их использования остается главным. Но теперь также в сферу использования вычислительной техники входит и решение всяких второстепенных задач, таких как построение калькуляторов и календарей, нацеленных, прежде всего, на удобства пользователя.

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

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

Вечный календарь  может быть реализован самыми разнообразными способами, внешне абсолютно непохожими друг на друга. Но в принципе их действия лежит одно — календари образуют цикл с периодичностью в 400 лет (допускается  рассмотрение периодичности не в 400, а в 28 лет при условии, что вечный календарь не рассчитан на невисокосные годы, кончающиеся на 00).

Придумано множество  вечных календарей такого вида, однако почти все они сводятся к одному: имеется 14 календарных сеток (7 возможных  дней недели, с которых начинается год × 2 варианта — високосный и невисокосный год) и таблица, помогающая выбрать календарную сетку для нужного года либо определить сдвиг, помогающий правильно преобразовать одну сетку.

Календари этого  вида различаются по степени удобства и быстроте использования. Такие календари иногда публиковались в газетах и журналах для вырезания и использования читателями. Именно такой алгоритм и был использован мною при построении вечного календаря в С++.

 

 

 

 

 

 

 

 

 

 

 

 

 

1 ПОСТАНОВКА ЗАДАЧИ И СРЕДА ЕЁ ИСПОЛЬЗОВАНИЯ

Тема данной курсовой роботы звучит элементарно : построить вечный календарь.  Задача соответственно: используя инструменты  С++ Visual Studio написать программу, позволяющую по введенным пользователем датам (году, месяцу и числу) отследить, не высокосный ли введенный год, а так же получить сведения какой это день недели. Так же в задачу данной программы входит проверка на корректность работы программы (правильный ввод месяца и соответствующего ему диапазона дат).

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

Что на счёт среды  использования данной разработки, так это самый что ни есть обыкновенный календарь, отличающийся лишь тем, что теперь вы не ищете сами глазами в какой день недели у вас в этом году новый год, а лишь вводите параметры и получаете ответ на экран.

 

 

 

 

 

 

 

 

2 ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

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

Оператор выбора if.

Оператор условного  перехода if используется для разделения процесса последующего выполнения программы на два направления и имеет такой формат записи:

if (условие) оператор 1;

else оператор 2;

где условие – это выражение , что имеет логическое истина.

Реализуется оператор if следующим образом: сначала вычисляется условие и, если оно истинно, то выполняется оператор 1, а в противоположном случае – оператор 2 и далее управление передаётся следующему за if оператору, например

if (i<j) i++;

else

{j=i-3;

i++};

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


В данной программе в условие  находяться логические операции «&&» (логическое и)  и «||» (логическое или), позволяющие в один условный оператор if записать сразу несколько одинаковых выражений-условий.

 

Рисунок 2.1 –  пример использования условного  оператора if для решения задачи

 

Данный фрагмент демонстрирует, что в случае, если будет выполняться заданное условие, в нашем случае это если совпадут даты какого-либо из заранее закрепленных в коде праздников, программа выдаст на экран его название. Например:

если год, введенный  пользователем привысит 1950, месяц  будет мартом, а число 8е, то помимо дня недели, мы получим на экране сообщение о том, что это женский день (см. рисунок 2.2)


 

Рисунок 2.2 –  пример работы оператора if

 

Оператор-переключатель switch.

Данный оператор также имеет название оператора  множественного распределения. Он используется для выбора одного из многих вариантов решения и имеет следующий синтаксис:

switch (k)

{ case к.в.1: оператор 1;[break;]

   case к.в.2: оператор2;[break;]

   ……………………………….

   case к.в.n: оператор n;[break;]

 

  [default:оператор n+1;]

},

где switch, case, default – служебные слова

(switch – переключать;

 сase – случай;

default – невыполнение);

break – оператор (необязательный!) , выполняющий выход из переключателя switch;

k – любое выражение целого типа;

к.в.1,……., к.в.n – константные выражения, которые не могут повторяться и не могут содержать в себе переменных или вызовов функций; чаще всего это целая или символьная константа;

оператор1,…….,оператор n – произвольные операторы языка С++.

В процессе выполнения этого оператора сперва вычисляется  значение выражения k, потом оно последовательно сверху вниз сравнивается со значением константных выражений оператор1,…….,оператор n. В случае совпадения значения k и одного из этих константных выражений и если в конце случая не стоит оператор выхода break, выполняются все последующие операторы, начиная с совпадающего. Если всё-таки стоит break, то выполняется лишь операторы данного случая, а дальше управление идёт на операторы вне switch. Если ни одно значение k не совпадает, выполняется оператор, стоящий после default, а далее выход из switch. Также следует заметить, что слово default не обязательно, при его отсутствии и несовпадении k с константными выражениями просто будет производиться выход из переключателя.


В программе «вечного календаря» самим ярким примером использования  переключателя switch является определение словесного эквивалента месяца.

Рисунок 2.3 –  пример использования переключателя switch

Работать он будет соответственно с простейшим алгоритмом выполнения switch: значение введённого пользователем месяца m будет сравниваться с предоставленными ниже случаями, т.е. для m равное 11 на экран получим сообщение о том, что 11й месяц это ноябрь. Думая, иллюстрировать столь элементарную конструкцию не следует, вы убедитесь в корректности её работв при собственном тестировании программы.

3. ОСНОВНОЙ АЛГОРИТМ

Для того, чтобы  узнать день недели конкретного дня, требуется:

найти в первой таблице цифру, соответствующую указанному году и месяцу;

сложить эту цифру с номером дня;

найти во второй таблице получившееся число и посмотреть, какому дню недели оно соответствует.

 

Таблица А– фрагмент таблицы соответствий годов и  месяцов

Года

Месяцы

янв

фев

м

апр

май

ин

ил

авг

сен

окт

ноя

дек

1947-1975-2003-2031

3

3

6

2

4

0

2

5

1

3

6

1

1948-1976-2004-2032

4

0

1

4

6

2

4

0

3

5

1

3

1949-1977-2005-2033

6

2

2

5

0

3

5

1

4

6

2

4

1950-1978-2006-2034

0

3

3

6

1

4

6

2

5

0

3

5

1951-1979-2007-2035

1

4

4

0

2

5

0

3

6

1

4

6

1952-1980-2008-2036

2

5

6

2

4

0

2

5

1

3

6

1


 

Таблица Б –  соответствие чисел и дней недели

Дни

1

8

15

22

29

36

Воскресенье

2

9

16

23

30

37

Понедельник

3

10

17

24

31

 

Вторник

4

11

18

25

32

 

Среда

5

12

19

26

33

 

Четверг

6

13

20

27

34

 

Пятница

7

14

21

28

35

 

Суббота


 

Например:

требуется определить, каким днём недели было 22 февраля 2007 года.

Цифра, соответствующая февралю (фев) 2007 в таблице А, равна 4.

22+4=26.

Числу 26 в таблице Б соответствует четверг — это и есть искомый день недели.

 

Существуют разнообразные  методы вычисления дня недели. Некоторые  из них основываются на заранее просчитанных таблицах сдвигов, а некоторые вычисляют все необходимые значения «с нуля» при каждом запуске. Иногда алгоритмы представляют собой автоматизированные версии табличных календарей.

Как правило, каждый метод  имеет две модификации — для  юлианского и для григорианского календаря.

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

Как всем известно, январь – это 1й месяц, февраль – 2й , и т.д., а декабрь – 12й месяц. Для определения сдвига используется следующая формула:

a=(14-месяц) /12 (a – некая вспомогательная величина). Затем определяются год и месяц с учётом поправки: y=год-a, где год — увеличиваем на 1 от исходного, а m=месяц+12·a-2.

После вспомогательных операций вычисляется сам день недели:

result=(7000+(день+y+y/4-y / 100+y div 400+(31im) /12)) %7

 

Для юлианского календаря формула выглядит так:

result=(6998+(день+y+y / 4+(31im) / 12)) % 7

 

Результат —  число от 0 до 6, где 0 — суббота, 1 — воскресенье, 2 — понедельник, 3 — вторник, 4 — среда, 5 — четверг, 6 — пятница.

 

 

 

 

 

 

 

 

 

 

4. ОСОБЕННОСТИ РЕАЛИЗАЦИИ НА ЯЗЫКЕ С++

Программа написана на языке программирования Microsoft Visual Studio С++ 2008 года, что обусловливает разные методы её реализации в версиях Visual Studio разных годов.

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

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

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

Условия корректного ввода  для года следующие: он не должен быть меньше нуля и больше 3000 (при желании  пользователь может продлить вторую границу до бесконечности). Для месяца: не меньше единицы и не больше двенадцати. А вот для дней месяца (в тексте программы переменная day) то тут условия правильного ввода для каждого месяца( а для февраля ещё и для года), свои: для января, марта, мая, июля, август, октября и декабря число дней в месяце не должно превышать 31; для апреля, июня, сентября и октября оно должно быть не более 30; ну а для февраля в зависимости от того високосный введенный год или нет оно должно быть не больше 29 и 28 соответственно. И, конечно же, число не может быть менее 1.

В программной реализации это выглядит следующим образом:

if ((((m==1)||(m==3)) || ((m==5)||(m==7)) || ((m==8)||(m==10)) ||(m==12)) &&(data<=0||data>31)) {cout<<"\nERROR! Enter right data, please"; goto vvod_data; };

if ((m==2)&&(((data<=0)||(data>28))&&(god%4!=0)) ||(((data<=0)||(data>29))&&(god%4==0))) {cout<<"\nERROR! Enter right data, please"; goto vvod_data; };

if ((((m==4)||(m==6))||((m==9)||(m==11)))&&((data<=0)||(data>30))) {cout<<"\nERROR! Enter right data, please"; goto vvod_data; };

 

Если условия корректного  ввода для какого-либо параметра  не выполнены, то высвечиваеться сообщение об ошибке и программа с помощью оператора goto передаёт управление на повторный ввод ошибочной переменной.

Например, если пользователь вводит неверный порядковый номер месяца (13, 14, -5) программа будет запрашивать повторный ввод до тех пор, пока не будет введён месяц с номером от 1 до 12, и только после этого управление передастся на следующий после ввода месяца оператор.


Рисунок 4.1 – проверка на корректность ввода месяца

 

Следует, также, подчеркнуть, что оператор goto – это не единственный способ возврата на повторный ввод при неверном первоначальном введении параметра.

Данную операцию можно реализовать с помощью  циклов, а именно цикла с послеусловием do while.

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

Синтаксис данного оператора  следующий:

do оператор

while (выражение-условие);

где оператор – тело цикла, что может быть представлено в виде простого или сложного оператора.

В процессе выполнения оператора do  while сначала выполняется вход в тело цикла и выполняется оператор, что представляет собой тело цикла (он может быть как простой, так и сложенный); далее проверяется выражение-условие, и, если оно истинно,– цикл повторяется, а когда оно ошибочно, то происходит выход из цикла и управление идёт на слудующий за do  while оператор.

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

 

do {cout<<"\nEnter month\n";

cin>>m;}

while ((m<1)||(m>12)) ;

 

Из условия  цикла видно, что ввод месяца будет  проходить до тех пор, пока переменная  m не попадёт в промежуток от 1 до 12, что и будет условием выхода и передачи управления на следующий оператор.

После ввода  данных диалог с пользователем окончен и программа начинает высчитывать, высокосный ли год, выводит нам сообщение о животном-символе года, выводит словесный эквивалент месяца, и, собственно, день недели. Если введённая дата совпадает из каким-то из зафиксированых разработчиком праздников (Новый год, 8 марта), то мы получаем сообщение и об отмечаемом в этот день празднике.

Далее программа  передаёт управление на отвечающие за знак зодиака оператор.

Программа делает запрос о том, хочет ли пользователь по ранее введеным датам получить информацию о знаке зодиака, припадающего на эти числа:

cout<<"\n\n\nDo you want to know your zodiac about this data?";

cout<<"\nEnter 1-yes, 0-no\n\n";

cout<<"answer ";

cin>>z;

Если пользователь введёт 1, то получит на экран знак зодиака, а если 0, то программа заканчивает свою работу, т.к. она уже выполнила все требуемые операции.

 

Рисунок 4.2 –  пример работы зодиака

Из рисунка 4.2 видим, что программа действительно  высвечивает верную информацию:

это год тигра;

9й месяц –  это сентябрь;

19е сентября  будет воскресенье;

человек, родившийся в этот день, по знаку зодиака Virgo, т.е.дева.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ

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

После запуска программы в Microsoft Visual Studio 2008 выполняйте показываемые на экране требования:

введите год;

введите месяц;

введите число;

если вы хотите узнать свой знак зодиака, то на вопрос «Do you want to know your zodiac about this data?» в поле «answer » введите 1, что эквивалентно положительному ответу.

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

 

 

 

 

 

 

 

 

 

 

 

 

ВЫВОДЫ

 

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

Мною лично  были приобретены новые навыки , а также закреплены старые и изучены особенности написания программ на языке программирования С++.

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

 

 

 

 

 

 

 

 

 

 

 

 

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

  1. Е.П.Путятiн, В.П.Степанов, В.П.Пчелiнов, Т.Г.Долженкова, О.О.Матат. Основи програмування мовою С++: Навчальний посiбник – Х.: ТОВ  «Компанiя Смiт», 2005. – 320 с.
  2. В.А.Менделев. Энциклопедия необходимых знаний. Книга эрудита. – Х.: Книжный клуб «Клуб семейного досуга», 2007. – 352 с.
  3. Методичнi вказiвки до курсового проектування з дисциплiни «Програмування» / Упоряд.: Т.Г.Долженкова, Д.О.Руденко – Х.: ХНУРЕ, 2004. – 16 с.

 

 

 

 

 

 

 

 

 

 

 

 

 

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

#include "stdafx.h"

#include <math.h>

#include <conio.h>

#include <iostream>

#include <string.h>

#include <time.h>

#include <windows.h>

using namespace std;

void main ()

{int god;

vvod_g:cout<<"Enter year ";

cin>>god;

if ((god<=0)||(god>=3000)) {cout<<"ERROR! Enter right year, please";

goto vvod_g;

}

 

int m;

vvod_m:cout<<"\nEnter month ";

cin>>m;

if (m<=0||m>12) {cout<<"\nERROR! Enter right month, please";

goto vvod_m;

}

 

int data;

vvod_data:cout<<"\nEnter data  ";

cin>>data;

 

cout<<"\n\n\n\n";

if ((god%4==0&&god%100!=0)||(god%400==0))

cout<<god<<" year is leap";

if (god%12==0) cout<<"\nMonkey_s year";

if ((god-1)%12==0) cout<<"\nCock_s year";

if ((god-2)%12==0) cout<<"\nDog_s year";

if ((god-3)%12==0) cout<<"\nPig_s year";

if ((god-4)%12==0) cout<<"\nMouse_s year";

if ((god-5)%12==0) cout<<"\nCow_s year";

if ((god-6)%12==0) cout<<"\nTiger_s year";

if ((god-7)%12==0) cout<<"\nRabbit_s year";

if ((god-8)%12==0) cout<<"\nDragon_s year";

if ((god-9)%12==0) cout<<"\nShake_s year";

if ((god-10)%12==0) cout<<"\nHorse_s year";

if((god-11)%12==0) cout<<"\nSheep year";

 

switch (m)

{ case 1: cout<<"\n\nJanuary"; break;

case 2:cout<<"\n\nFebruary"; break;

case 3:cout<<"\n\nMarch"; break;

case 4:cout<<"\n\nApril"; break;

case 5:cout<<"\n\nMay"; break;

case 6:cout<<"\n\nJune"; break;

case 7:cout<<"\n\nJuly"; break;

case 8:cout<<"\n\nAvgust"; break;

case 9:cout<<"\n\nSeptember"; break;

case 10:cout<<"\n\nOctomber"; break;

case 11:cout<<"\n\nNovember"; break;

case 12:cout<<"\n\nDecember"; break; };

if ((((m==1)||(m==3)) || ((m==5)||(m==7)) || ((m==8)||(m==10)) ||(m==12)) &&(data<=0||data>31)) {cout<<"\nERROR! Enter right data, please"; goto vvod_data; };

if ((m==2)&&(((data<=0)||(data>28))&&(god%4!=0)) ||(((data<=0)||(data>29))&&(god%4==0))) {cout<<"\nERROR! Enter right data, please"; goto vvod_data; };

if ((((m==4)||(m==6))||((m==9)||(m==11)))&&((data<=0)||(data>30))) {cout<<"\nERROR! Enter right data, please"; goto vvod_data; };

 

int d;

if ((god+8)%28==0) {switch (m)

                      { case 1:d=2; goto day; break;

                        case 2:d=5;goto day; break;

                        case 3:d=6;goto day; break;

                        case 4:d=2;goto day; break;

                        case 5:d=4;goto day; break;

                        case 6:d=0;goto day; break;

                        case 7:d=2;goto day; break;

                        case 8:d=5;goto day; break;

                        case 9:d=1; goto day; break;

                        case 10:d=3;goto day; break;

                        case 11:d=1;goto day; break;

case 12:d=6;goto day; break;  };

};

if ((god+7)%28==0) {switch (m)

                      { case 1:d=4; goto day; break;

                        case 2:d=0;goto day; break;

                        case 3:d=0;goto day; break;

                        case 4:d=3;goto day; break;

                        case 5:d=5;goto day; break;

                        case 6:d=1;goto day; break;

                        case 7:d=3;goto day; break;

                        case 8:d=6;goto day; break;

                        case 9:d=2; goto day; break;

                        case 10:d=4;goto day; break;

                        case 11:d=0;goto day; break;

  case 12:d=2;goto day; break; };

};

if ((god+6)%28==0) {switch (m)

                      { case 1:d=5; goto day; break;

                        case 2:d=1;goto day; break;

                        case 3:d=1;goto day; break;

                        case 4:d=4;goto day; break;

                        case 5:d=6;goto day; break;

                        case 6:d=2;goto day; break;

                        case 7:d=4;goto day; break;

                        case 8:d=0;goto day; break;

                        case 9:d=3; goto day; break;

                        case 10:d=5;goto day; break;

                        case 11:d=1;goto day; break;

    case 12:d=3;goto day; break; };

};

if ((god+5)%28==0) {switch (m)

                      { case 1:d=6;goto day; break;

                        case 2:d=2;goto day; break;

                        case 3:d=2;goto day; break;

                        case 4:d=5;goto day; break;

                        case 5:d=0;goto day; break;

                        case 6:d=3;goto day; break;

                        case 7:d=5;goto day; break;

                        case 8:d=1;goto day; break;

                        case 9:d=4;goto day; break;

                        case 10:d=6;goto day; break;

                        case 11:d=2;goto day; break;

                        case 12:d=4;goto day; break; };

};

if ((god+4)%28==0) {switch (m)

                      { case 1:d=0; goto day; break;

                        case 2:d=3;goto day; break;

                        case 3:d=4;goto day; break;

                        case 4:d=0;goto day; break;

                        case 5:d=2;goto day; break;

                        case 6:d=5;goto day; break;

                        case 7:d=0;goto day; break;

                        case 8:d=3;goto day; break;

                        case 9:d=6;goto day; break;

                        case 10:d=1;goto day; break;

                        case 11:d=4;goto day; break;

   case 12:d=6;goto day; break; };

};

if ((god+3)%28==0) {switch (m)

                      { case 1:d=2; goto day; break;

                        case 2:d=5; goto day; break;

                        case 3:d=5; goto day; break;

                        case 4:d=1; goto day; break;

                        case 5:d=3;goto day; break;

                        case 6:d=6;goto day; break;

                        case 7:d=1;goto day; break;

                        case 8:d=4;goto day; break;

                        case 9:d=0;goto day; break;

                        case 10:d=2;goto day; break;

                        case 11:d=5;goto day; break;

   case 12:d=0;goto day; break;  };

};

if ((god+2)%28==0) {switch (m)

                      { case 1:d=3;  goto day; break;

                        case 2:d=6;goto day; break;

                        case 3:d=6;goto day; break;

                        case 4:d=2;goto day; break;

                        case 5:d=4;goto day; break;

                        case 6:d=0;goto day; break;

                        case 7:d=2;goto day; break;

                        case 8:d=5;goto day; break;

                        case 9:d=1;goto day; break;

                        case 10:d=3;goto day; break;

                        case 11:d=6;goto day; break;

                        case 12:d=1;goto day; break;  };

};

if ((god+1)%28==0) {switch (m)

                      { case 1:d=4;goto day; break;

                        case 2:d=0;goto day; break;

                        case 3:d=0;goto day; break;

                        case 4:d=3;goto day; break;

                        case 5:d=5;goto day; break;

                        case 6:d=1;goto day; break;

                        case 7:d=3;goto day; break;

                        case 8:d=6;goto day; break;

                        case 9:d=12;goto day; break;

                        case 10:d=4;goto day; break;

                        case 11:d=0;goto day; break;

                        case 12:d=2;goto day; break; };

};

if (god%28==0) {switch (m)

                      { case 1:d=5;goto day; break;

                        case 2:d=1;goto day; break;

                        case 3:d=2;goto day; break;

                        case 4:d=5;goto day; break;

                        case 5:d=0;goto day; break;

                        case 6:d=3;goto day; break;

                        case 7:d=5;goto day; break;

                        case 8:d=1;goto day; break;

                        case 9:d=4;goto day; break;

                        case 10:d=6; goto day; break;

                        case 11:d=2;goto day; break;

                        case 12:d=4;goto day; break; };

};

if ((god-1)%28==0) {switch (m)

                      { case 1:d=0;goto day; break;

                        case 2:d=3; goto day; break;

                        case 3:d=3;goto day; break;

                        case 4:d=6;goto day; break;

                        case 5:d=1;goto day; break;

                        case 6:d=4;goto day; break;

                        case 7:d=6;goto day; break;

                        case 8:d=2;goto day; break;

                        case 9:d=5;goto day; break;

                        case 10:d=0;goto day; break;

                        case 11:d=3;goto day; break;

                        case 12:d=5;goto day; break; };

};

if ((god-2)%28==0) {switch (m)

                      { case 1:d=1;goto day; break;

                        case 2:d=4;goto day; break;

                        case 3:d=4;goto day; break;

Построение вечного календаря