Определение дня недели по формуле Зеллера - Turbo Pascal
Формулировка задачи:
программа, которая, используя формулу Зеллера, определяет день недели для произвольной даты. Указания: день недели григорианского календаря n (n=0 – Вс, 1 – Пн, …, 6 – Сб) определяется по формуле n=(w+2)%7, где w=[2.6*m-0.2]+d+y+[y/4]+[c/4]-2*(c%7), "%" – взятие остатка от деления, […] – выделение целой части числа, d – день месяца (1–31), m – номер месяца (1–12), y – год столетия (0–99), c – номер столетия (20 для XXI века).
{ формула Зеллера (en.wikipedia.org/wiki/Zeller's_congruence):
dday= ([(m+1)*26/10]+d+y+[y/4]+[c/4]-2*c)%7 }
Решение задачи: «Определение дня недели по формуле Зеллера»
textual
Листинг программы
Вот моя подобная программа:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int c, y, m, d;//1)Объявляем переменные
int a;
fail:
cout << "\tEnter *century(first two numbers of year, **XX): ";//2)Приглашение к вводу данных
cin >> c;
cout << '\n';
cout << "\tEnter year of century (0-99): ";
cin >> y;
cout << '\n';
cout << "\tEnter mounth: ";
cin >> m;
cout << '\n';
cout << "\tEnter day: ";
cin >> d;
cout << '\n';
if ((m > 12 || d > 31 || y < 0 || y > 99 ) || (m == 2 && d > 29) || (m == 4 && d >= 31) || (m == 6 && d >= 31) || (m == 9 && d >= 31) || (m == 11 && d >= 31))//3)Защита от дурака
{
MessageBox(0, L"Incorrect information!", L"Error!", MB_OK / MB_ICONSTOP);
cout << "\n\n";
goto fail;//4)При некорректных данных возвращаем обратно к вводу
}
else
{
if (m < 3)//5)Нюанс формулы Зеллера - в оригинальном алгоритме январь и февраль считаются как месяцы 13 и 14 предыдущего года
{
m = m + 12;
y--;
}
a = (((m + 1) * 26 / 10) + d + y + (y/4) + (c / 4) - 2 * c) % 7;//6)Формула Зеллера
cout << "Answer is:";
switch (a)//7)Вывод соответствующего ответа
{
case 2:
cout << "\tMonday/Понедельник\n";
break;
case 3:
cout << "\tTuesday/Вторник\n";
break;
case 4:
cout << "\tWednesday/Среда\n";
break;
case 5:
cout << "\tThursday/Четверг\n";
break;
case 6:
cout << "\tFriday/Пятница\n";
break;
case 0:
cout << "\tSaturday/Суббота\n";
break;
case 1:
cout << "\tSunday/Воскресенье\n";
break;
default:
MessageBox(0, L"Unknown error!\nВероятно вы ввели слишком\nбольшое столетие!", L"Error!", MB_OK / MB_ICONWARNING);//8)Аварийный выход
/*if (m == 14 && d == 29)
{
cout << "Вероятнее всего это не високосный год.\n ";
}*/
cout << "\t Ошибка! Значение переменной равно: " << a <<'\n';
break;
}
}
return 0;
}